본문 바로가기

Language/Java

[Java] 람다식(lambda expression)

728x90
반응형

람다식이란?

람다 함수는 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개 작성하여 에러가 표시된 것을 알 수 있다.

728x90
반응형