람다식이란?
람다 함수는 java8부터 추가된 기능으로 익명 객체를 생성하기 위한 표현식을 말한다.
람다식 이전
public interface Goods{
public void doSome();
}
public class Computer implements Goods{
@Override
public void doSome() {
System.out.println("do Operation!");
}
}
public class Main{
public static void main(String[] args){
Goods com = new Computer();
com.doSome();
}
}
기존 자바에서 interface를 이용해 다형성을 제공하기 위해서는 interface를 만들고, 그것을 구현한 class를 작성한 뒤, 사용시에는 interface 타입의 참조변수에 interface를 구현한 class의 객체를 생성하여 사용했다.
public class Main{
public static void main(String[] args){
Goods com = new Goods() {
public void dosome(){
System.out.println("do Operation!");
}
};
com.doSome();
}
}
또는 위와 같이 실행하는 쪽에서 익명 객체를 만들어 사용했다. 하지만 Goods를 구현한 객체가 자주 사용되어야 한다면, 위의 코드를 계속 반복해서 사용해야할 것이고 지저분한 코드가 될 것이다.
람다식 사용
public class Main{
public static void main(String[] args){
Goods com = () -> System.out.println("do Operation!");
com.doSome();
}
}
하지만 람다식을 사용하는 경우 위와 같이 아주 간결하게 표현할 수 있다.
람다식 표현법
람다식은 매개변수 + 실행문으로 구성된다. 즉, 접근자와 반환형 모두 생략되는 구조이다.
모양은 () -> {}; 형태이다. ()에 해당 interface 함수의 매개변수를 입력하고, {} 안에 실행할 코드를 작성하면 된다.
예제
public interface Calculator{
public int cal(int num1, int num2);
}
1. 기본 사용법((매개변수 타입) -> {};)
public static void main(String[] args){
Calculator cal = (int num1, int num2) -> { return num1 + num2; };
System.out.println(cal.cal(1, 2));
}
2. 매개변수 타입 생략((매개변수) -> {};)
public static void main(String[] args){
Calculator cal = (num1, num2) -> { return num1 + num2; };
System.out.println(cal.cal(1, 2));
}
매개변수가 1개이거나 2개 이상의 매개변수의 타입이 모두 같을 때에는 타입을 생략할 수 있다.
3. 매개변수가 없는 경우(() -> {};)
public static void main(String[] args){
Calculator cal = () -> { System.out.println("매개변수가 없는 경우"); };
cal.cal();
}
만약 Calculator 인터페이스의 cal() 메소드에 매개변수가 없다면 위와 같이 매개변수를 생략하여 작성할 수 있다.
4. 중괄호 생략(() -> ;)
public static void main(String[] args){
Calculator cal = (num1, num2) -> num1 + num2;
System.out.println(cal.cal(1, 2));
}
실행할 문장이 1개일 때는 중괄호를 생략할 수 있다. 이 때 반환이 필요한 메소드의 경우 return 키워드를 생략해야 한다.
5. 소괄호 중괄호 생략(매개변수 -> ;)
public static void main(String[] args){
Calculator cal = num1 -> System.out.println(num1);
cal.cal(1);
}
매개변수가 1개이고 실행할 문장도 1개이면 ()와 {}를 생략할 수 있다.
람다 사용 조건
람다식을 사용하기 위한 인터페이스에는 인터페이스의 추상 메소드가 단 1개여야 한다는 조건이 있다. 사용하는 입장에서는 2개 이상인 경우 어떤 메소드를 람다식으로 표현했는지 알 수 없으니 당연하다.
하지만 인터페이스를 설계 또는 작성하는 사람 입장에서 인터페이스를 구현하는 클래스에서 또 다른 기능이 필요하게 되어 해당 인터페이스에 메소드를 추가하면 사용하는 곳에서 에러가 나게 되어 그제서야 해당 인터페이스가 람다식을 위한 단일 추상 메소드를 가진 인터페이스임을 알게된다.
해결 방법은 @FunctionalInterface 어노테이션을 사용하는 것이다.
람다식으로 표현하기 위해 사용될 interface 위에 @FunctionalInterface만 붙여주면 컴파일 타임에 알아서 에러를 잡아준다. 위 사진에서 Interface에 메소드를 2개 작성하여 에러가 표시된 것을 알 수 있다.
'Language > Java' 카테고리의 다른 글
[Java] Optional<T> 클래스 (0) | 2022.07.05 |
---|---|
[Java] 메소드 레퍼런스(Method reference, ::의 의미) (0) | 2022.07.05 |
[Java] Stream API - filter, map, flatMap (0) | 2022.07.04 |
[Java] 익명 객체(anonymous object) (0) | 2022.07.04 |
[Java] Input/Output 정리 (0) | 2021.07.13 |