[java] JAVA8 변경 사항(람다 표현식)
JAVA8 변경 사항(람다 표현식)
JAVA8 변경 사항
- 2014년 발표된 자바의 최신 버전 Java SE 8
- 람다 표현식(Lambda Expression) : 함수형 프로그래밍
- 스트림 API(stream API) : 데이터의 추상화
- java.time 패키지 : Joda-Time을 이용한 새로운 날짜와 시간 API
- 나즈혼(Nashorn) : 자바스크립트의 새로운 엔진
람다 표현식(Lambda Expression)
기존의 불필요한 코드를 줄여주고, 작성된 코드의 가독성을 높이는 목적
자바에서도 함수형 프로그래밍을 할 수 있음
- 메소드를 하나의 식으로 표현
- 식별자 없이 실행할 수 있는 함수 표현식 의미
- 익명함수(anonymous function)이라고 부름
- 메소드에서 람다 표현식으로 표현하면 클래스를 객체를 생성하지 않아도 메소드를 사용할 수 있음
- 메소드의 매개변수로 전달될 수도 있고, 메소드의 결과값으로 반환될 수 있음
/*
기존
클래스를 작성하고 객체를 생성하지 않았을 때의 메소드
*/
int min(int x, int y) {
return x < y ? x : y;
}
/*
익명 클래스
자바에서는 클래스의 선언과 동시에 객체를 생성하므로, 단하나의 객체만 생성할 수 있는 클래스를 의미
*/
new Object() {
int min(int x, int y) {
return x < y ? x : y;
}
}
/*
람다 표현식
람다 표현식 == 익명 클래스
*/
(x, y) -> x < y ? x : y;
람다 표현식 작성
-
문법
(매개변수목록)->{함수몸체}
-
람다 표현식 작성할 때 유의할 사항
- 매개변수의 타입을 추론할 수 있는 경우에는 타입을 생략할 수 있음
- 매개변수가 하나인 경우에는 괄호 (())를 생략할 수 있음
- 함수의 몸체가 하나의 명령문만으로 이루어진 경우에는 중괄호 ({})를 생략할 수 있음
- 함수의 몸체가 하나의 리턴문으로 이루어진 경우에는 중괄호 ({})를 생략할 수 없음
- return 문 대신 표현식을 사용할 수 있으며, 이때 반환값은 표현식의 결과값이 됨
함수형 인터페이스(functional Interface)
-
람다 표현식을 사용할 때는 람다 표현식을 저장하기 위한 참조 변수의 타입을 결정해야만 함
-
문법
참조변수의타입 참조변수의이름 = 람다 표현식 /* 위의 문법처럼 람다 표현식을 하나의 변수에 대입할 때 사용하는 참조 변수의 타입을 함수형 인터페이스라고 부름 */
-
함수형 인터페이스는 추상 클래스와는 달리 단 하나의 메소드만 가져야함
-
@FunctionalInterface 어노테이션(annotation)을 사용하여 함수형 인터페이스임을 명시함
-
@FunctionalInterface 어노테이션, 컴파일러는 해당 인터페이스를 함수형 인터페이스로 인식
-
자바 컴파일러는 이렇게 명시된 함수형 인터페이스에 두 개 이상의 메소드가 선언되면 오류를 발생시킴
@FunctionalInterface interface Calc { // 함수형 인터페이스의 선언 public int min(int x, int y); } public class Lambda02 { public static void main(String[] args){ Calc minNum = (x, y) -> x < y ? x : y; // 추상 메소드의 구현 System.out.println(minNum.min(3, 4)); // 함수형 인터페이스의 사용 } }
-
java.util.function 패키지를 통해 여러상황에서 사용할 수 있는 다양한 함수형 인터페이스를 미리 정의하여 제공