on
[Java] Java 8 버전에서의 변경사항
[Java] Java 8 버전에서의 변경사항
Java Standard Edition 8
Java SE 8 버전으로 자바를 배우긴 했지만 과연 이 버전의 특징이 뭔지에 대해서는 잘 모르고 넘어갔던것 같아서 써본다.
이전 버전과 비교해보면 크게 4가지의 특징이 있다.
람다 표현식 등장 스트림 API java.time 패키지 나즈혼
구글링을 해보면 이렇게 4개가 나오긴 하는데 구체적으로 뭔지 모르겠어서 좀 더 찾아 보았다
람다 표현식 (Lambda Expression)
Java는 객체 지향 프로그래밍 언어라서 사용하고 싶은 메소드가 있을때 클래스를 만들고 객체를 생성해서 생성된 객체가 메소드를 사용하도록 해야 한다. 하지만, Java 8 버전부터는 메소드를 람다 표현식으로 만들고 굳이 객체를 생성하지 않아도 된다.
interface StringFunction { String run(String str); } public class Main { public static void main(String[] args) { StringFunction ask = (s) -> s + "?"; //램다 표현식 printFormatted("Hello", ask); } public static void printFormatted(String str, StringFunction format) { String result = format.run(str); System.out.println(result); } }
직접 코드를 돌려보고 느낀점은 기존보다 코드의 수를 줄여주고 또 코드를 읽고 해석하기 편해 진것 같다.
스트림 API (Stream API)
파이썬을 먼저 배우고 Java를 배웠는데 Java를 처음 배웠을때 불편한 점은 배열 안에 있는 데이터에 순서대로 접근하기 위해서는 while이나 for 같은 loop을 사용하거나 iterator를 사용해야 한다는 점이었다.
예시를 보자면,
import java.util.*; public class MyClass { public static void main(String args[]) { // 주어진 리스트에 짝수가 몇개인지 세기 List numbers = Arrays.asList(1, 2, 3, 4, 6, 10); int count = 0; for (int number : numbers) { if (number%2 == 0) { count++; } } System.out.println("Count : " + count); 4 } }
자 그럼 스트림 API의 데이터를 추상화한 방식을 보면,
import java.util.*; public class MyClass { public static void main(String args[]) { List numbers = Arrays.asList(1, 2, 3, 4, 6, 10); long count = 0; count = numbers.stream().filter(x -> x%2 == 0).count(); System.out.println("Count : " + count); // 4 } }
여기서 주의해야할 점은 .count()의 리턴은 long이기 때문에 위의 예시와는 다르게 count를 int가 아닌 long으로 정의 했다. 확실히 코드의 수가 줄었고 가장 큰 차이는 코드의 재사용성을 높일수 있다는 장점이 있다.
java.time 패키지
java에서 기존에 시간을 다루는 클래스는 Calendar 였다. 근데 이 Calendar 클래스가 몇가지 문제점을 가지고 있었다.
Calendar instance가 불변 객체가 아니라서 값이 수정될 가능성이 있다.
윤초를 고려하지 않는다
월을 나타낼때 1월부터 12월을 0~11로 표현해야 한다.
Java.time 패키지는 위와 같은 문제점들을 모두 해결했다고 한다.
나즈혼 (Nashorn)
기존의 자바의 스크립트 엔진은 리노(Rhino)인데 8버전부터는 성능과 메모리 관리 면에서 나은 오라클의 나즈혼을 엔진으로 도입했다.
from http://gegenpress.tistory.com/45 by ccl(A) rewrite - 2021-10-05 02:01:49