포스트

Java8 변경 사항

JAVA8 변경 사항


JAVA8에서의 변경 사항

  • 2014년에 발표된 자바의 최신 버전인 Java SE 8 버전에서는 많은 사항이 변경되거나 새롭게 추가되었다.
  • Java SE 8에서 변경되거나 새롭게 추가된 사항 중에서 주목할 만한 특징은 다음과 같다.

    1. 람다 표현식(lambda expression) : 함수형 프로그래밍

    2. 스트림 API(stream API) : 데이터의 추상화

    3. java.time 패키지 : Joda-Time을 이용한 새로운 날짜와 시간 API

    4. 나즈혼(Nashorn) : 자바스크립트의 새로운 엔진


람다 표현식(Lambda Expression)

  • 람다 표현식(lambda expression)이란 간단히 말해 메소드를 하나의 식으로 표현한 것이다. 즉, 식별자 없이 실행할 수 있는 함수 표현식을 의미하며, 따라서 익명 함수(anonymous function)라고도 부른다.
  • 메소드를 이렇게 람다 표현식으로 표현하면 클래스를 만들고 객체를 생성하지 않아도 메소드를 사용할 수 있다. 또한, 람다 표현식은 메소드의 매개변수로 전달될 수도 있고, 메소드의 결괏값으로 반환될 수도 있다.
  • 이러한 람다 표현식은 기존의 불필요한 코드를 줄여주고, 작성된 코드의 가독성을 높이는 데 그 목적이 있다. Java SE 8 버전부터는 람다 표현식을 사용하여 자바에서도 함수형 프로그래밍을 할 수 있게 되었다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 전통적인 방식의 스레드 생성과 람다 표현식을 사용한 스레드 생성을 비교하는 예제
public class prog {
	public static void main(String[] args){
		new Thread(new Runnable() {
			public void run() {
				System.out.println("전통적인 방식의 일회용 스레드 생성");
			}
		}).start();
		
		new Thread(()->{
			System.out.println("람다 표현식을 사용한 일회용 스레드 생성");
		}).start();
	}
}

이미지


스트림 API(Stream API)

  • 자바에서는 많은 양의 데이터를 저장하기 위해서 배열이나 컬렉션을 사용한다. 또한, 이렇게 저장된 데이터에 접근하기 위해서는 반복문이나 반복자(iterator)를 사용하여 매번 코드를 작성해야 했다.
  • 하지만 이렇게 작성된 코드는 길이가 너무 길고 가독성도 떨어지며, 코드의 재사용이 거의 불가능하다. 또한, 데이터베이스의 쿼리와 같이 정형화된 처리 패턴을 가지지 못했기에 데이터마다 다른 방법으로 접근해야만 했다.
  • 이러한 문제점을 극복하기 위해서 Java SE 8 버전부터 도입된 방법이 바로 스트림(stream) API이다. 스트림 API는 데이터를 추상화하여 다루므로, 다양한 방식으로 저장된 데이터를 읽고 쓰기 위한 공통된 방법을 제공한다.
  • 따라서 스트림 API를 이용하면 배열이나 컬렉션뿐만 아니라 파일에 저장된 데이터도 모두 같은 방법으로 다룰 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.util.*;
import java.util.stream.*;

public class prog {
	public static void main(String[] args){
		String[] arr = new String[]{"넷", "둘", "셋", "하나"};
		
		// 배열에서 스트림 생성
		Stream<String> stream1 = Arrays.stream(arr);
		stream1.forEach(e -> System.out.print(e + " "));
		System.out.println();
		
		// 배열의 특정 부분만을 이용한 스트림 생성
		Stream<String> stream2 = Arrays.stream(arr, 1, 3);
		stream2.forEach(e -> System.out.print(e + " "));
	}
}

이미지


java.time 패키지

  • JDK 1.0에서는 Date 클래스를 사용하여 날짜에 관한 처리를 수행했다. 하지만 Date 클래스는 현재 대부분의 메소드가 사용을 권장하지 않고(deprecated) 있다.
  • JDK 1.1부터 새롭게 제공된 Calendar 클래스는 날짜와 시간에 대한 정보를 얻을 수는 있지만, 다음과 같은 문제점을 가지고 있다.

    1. Calendar 인스턴스는 불변 객체(immutable object)가 아니라서 값이 수정될 수 있다.

    2. 윤초(leap second)와 같은 특별한 상황을 고려하지 않는다.

    3. Calendar 클래스에서는 월(month)을 나타낼 때 1월부터 12월을 0부터 11까지로 표현해야 하는 불편함이 있다.

  • 따라서 많은 자바 개발자들은 Calendar 클래스뿐만 아니라 더 나은 성능의 Joda-Time이라는 라이브러리를 함께 사용해 왔다.
  • Java SE 8 버전에서는 이러한 Joda-Time 라이브러리를 발전시킨 새로운 날짜와 시간 API인 java.time 패키지를 제공한다. java.time 패키지는 위와 같은 문제점을 모두 해결했으며, 다양한 기능을 지원하는 다수의 하위 패키지를 포함하고 있다.
1
2
3
4
5
6
7
8
9
10
11
import java.time.*;

public class prog {
	public static void main(String[] args){
		LocalDate today = LocalDate.now();
		System.out.println("올해는 " + today.getYear() + "년입니다.");
		
		LocalDate otherDay = today.withYear(1982);
		System.out.println("올해는 " + otherDay.getYear() + "년입니다.");
	}
}

이미지

  • java.time 패키지에 대한 더 자세한 사항은 Java8 java.time에서 확인할 수 있다.

나즈혼(Nashorn)

  • 지금까지 자바스크립트의 기본 엔진으로는 모질라의 리노(Rhino)가 사용되어 왔다. 모질라의 리노(Rhino)는 그 당시에는 훌륭한 스크립트 엔진이었다. 하지만 세월이 흐르면서 자바의 최신 개선 사항 등을 제대로 활용하지 못하는 등 노후화된 모습을 보여주게 된다.
  • 따라서 이번 Java SE 8 버전부터는 자바스크립트의 새로운 엔진으로 오라클의 나즈혼(Nashorn)을 도입하게 된다. 나즈혼(Nashorn)은 기존에 사용되어 온 리노에 비해 성능과 메모리 관리 면에서 크게 개선된 스크립트 엔진이다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.