BOOK

[JAVA] MENTOR JAVA SECTION 17

Minch13r 2025. 1. 24. 09:07

람다식

함수의 이름이 없는 익명 함수를 만들기 위한 표현식이다. 자바는 객체를 기바능로 프로그램을 구현하는 객체 지향 프로그램이다. 따라서 클래스를 먼저 생성하고, 클래스 안에 메서드와 객체를 만들어 사용해야 한다. 하지만, 함수형 프로그래밍은 객체 지향 프로그램과 달리 함수만을 구현하고 실행할 수 있는 개발 방식이다. 메서드를 사용하기 위해 많은 과정을 생략하여 함수를 하나의 간결한 식으로 표현한 것이 람다식이다.


람다식 문법

람다식 문법은 자바스크립트나 다른 함수형 프로그램이에서 볼 수 있었던 문법 패턴들로 기존의 자바 문법과는 달라서 객체 지향 프로그래밍에 익숙한 개발자들은 다소 생소하게 다가올 수 있는데, 문법이 매우 간결해지고 원하는 결과를 쉽게 집계할 수 있어 익숙해지면 큰 장점이 있다.

ind add(int x, int y){
	return x + y;
}

 

이 단순한 더하기 기능을 가진 메서드를 람다식 문법으로 바꾸면 다음과 같다.

(x, y) -> {return x + y};

 

메서드의 이름과 반환 타입을 제거하고 화살표 기호(→)를 사용해 구현한다. 의미를 살펴보면 두 개의 매개변수 (x,y)를 사용해 더한 결과를 반환하라는 의미이다.

 

람다식 문법에서는 매개변수 자료형을 생략할 수 있으며, 매개 변수가 한 개인 경우에는 소괄호도 생략할 수 있다.

(str) -> {Systetm.out.println(str);}
		↓
str -> {System.out.println(str);}
		
(x,y) -> { return x + y;}
		↓
x,y -> {return x + y;}

 

함수의 구현 내용이 한 문장이거나 return이 없다면, 즉 함수의 return 타입이 void라면 구현부에 있는 중괄호{}도 생략할 수 있다. 만약 함수의 내용이 두 문장 이상이거나 return 타입이 있는 경우에는 생략할 수 없다.

(x,y) -> {System.out.println(x+y);}
		↓    Return이 없는 경우
(x,y) -> System.out.println(x+y); // 중괄호 생략 가능

(x,y) -> {return x > y ? 1 : 0;}
		↓    Return이 있는 경우
(x,y) -> return x > y ? 1 : 0; // 오류! 중괄호 생략 불가

 

중괄호 안의 구현 코드가 return 문만 존재할 때는 중괄호와 return을 모두 생략할 수 있다.

(x,y) -> {return x > y ? 1 : 0;}
		↓    return 문장만 있는 경우
(x,y) -> return x > y ? 1 : 0; // 중괄호와 return 구문 생략

함수형 인터페이스

OOP에서 인터페이스를 사용하려면 인터페이스를 클래스에 상속 시킨 뒤 내용을 구현해야 한다. 람다식을 이용해 인터페이스를 사용할 경우, 인터페이스는 하나의 기능만을 정의할 수 있다. 기존의 자바에서 사용하는 인터페이스는 여러 개의 메서드를 정의할 수 있었지만, 람다식은 모든 인터페이스를 람다식의 티켓 타입으로 사용할 수 없다. 람다식을 구현하기 위해서는 먼저 인터페이스를 만들고, 인터페이스에 람다식으로 구현할 메서드를 선언해야 한다. 오직 하나의 추상 메서드가 선언된 인터페이스만이 람다식의 타겟 타입이 될 수 있는데, 이러한 인터페이스를 '함수형 인터페이스'라고 한다.

 

 

함수형 인터페이스는 자바의 인터페이스를 사용해 선언한다. 다만, 익명 함수로 구현하기 때문에 하나의 메서드만을 지니도록 선언하게 된다.

public interface ComparNumber {
	int compartTo(int num01, int num02);
}

 

람다식으로 구현한 인터페이스에 실수로 두 개 이상의 메서드를 추가하는 오류를 범한다. 이를 방지하고나 애노테이션을 부여해 제한할 수 있는데 이때 사용하는 애노테이션이 @FunctionalInterface 이다. 이거를 부여하면, 함수형 인터페이스라는 의미이며, 메서드를 두 개 이상 선언하면 문법적으로 오류를 발생시킨다.

@FunctinalInterface
public interface ComparNumber {
	int compareTo(int num01, int num02);
}

 

해당 인터페이스를 클래스를 구현하지 않고 사용하려면 다음과 같이 익명 객체로 선언한 후 사용해야 한다.

public interfcae ComparNumber {
	int comparTo(int num01, int num02);
}

 

람다식을 사용할 때 매개변수로 값을 전달하는 것 외에 외부에서 정의된 지역변수를 사용하는 경우가 있는데, 이때 유의해야 할 사항이 있다. 만약 람다식 내부에서 지역변수를 사용하려면 그 지역변수는 final로 선언되어야 한다.

'BOOK' 카테고리의 다른 글

[JAVA] MENTOR JAVA SECTION 19  (1) 2025.01.26
[JAVA] MENTOR JAVA SECTION 18  (1) 2025.01.25
[JAVA] MENTOR JAVA SECTION 16  (2) 2025.01.23
[JAVA] MENTOR JAVA SECTION 15  (1) 2025.01.22
[JAVA] MENTOR JAVA SECTION 14  (1) 2025.01.21