개주 훈련일지/📚 코살대 교본 학습

람다식

lshfood2 2025. 12. 6. 23:38

람다식은 JDK 1.8부터 지원되는 함수형 프로그래밍이다.

함수의 이름이 없는 익명 함수(Anonymous function)을

만들기 위한 표현식이다.

 

자바에서는 함수, 즉 메서드를 사용하기 위해서는

클래스 선언, 객체와 메서드 생성 등 많은 과정을 거치게 되는데

람다식을 사용하면 함수를 하나의 간결한 식으로 표현할 수 있다.

 

[ 람다식 ]

= 식별자 없이 실행 가능한 함수

 

람다식 문법

(x,y) → {return x+y;}
//매개변수 → 함수 구현

//원래라면 이렇게 사용한다.
int add(int x, int y){
	return x+y;
} //너무 길다.

메서드의 이름과 반환 타입을 제거하고

화살표 기호(→)를 사용해 구현한다.

 

소괄호 생략

매개변수가 한 개인 경우에는 소괄호도 생략 가능

그러나 매개변수가 2개 이상일 경우에는 생략 X

(str) → {System.out.println(str);}
//매개변수가 1개인 경우이다.
//소괄호 생략이 가능해진다.
str → {System.out.println(str);}

//만약 매개변수가 아래처럼 2개라면 생략 불가
(x, y) → {return x+y;}
x, y → {return x+y;} //오류 발생!

 

중괄호 생략

함수의 구현 내용이 한 문이거나 return이 없다면,

즉 함수의 return 타입이 void라면?

구현부에 있는 중괄호{}도 생략할 수 있다.

(x, y) → {System.out.println(x+y);}
//return이 없는 함수
(x, y) → System.out.println(x+y);
//이렇게 중괄호 생략이 가능하다.

(x, y) → {return x > y ? 10 : 0;}
//return이 있는 경우
(x, y) → return x > y ? 10 : 0;
//중괄호를 생략하면 오류가 발생한다!!

 

return 생략

중괄호 안의 구현 코드가 return 문만 존재할 때는

중괄호와 return을 모두 생략할 수 있다.

(x, y) → {return x > y ? 1 : 0;}
//return 문만 존재하는 경우
//중괄호와 return 모두 생략 
(x, y) → x > y ? 1 : 0;

[ 함수형 인터페이스 ]

람다식을 이용해 인터페이스를 사용할 경우

인터페이스는 하나의 기능만을 정의할 수 있다.

 

오직 하나의 추상 메서드가 선언된 인터페이스만이

람다식의 타겟 타입이 될 수 있는데

이러한 인터페이스를 '함수형 인터페이스'라고 한다.

 

따라서 함수형 인터페이스를 만들 때는

하나의 메서드만 정의하도록 한다.

 

함수형 인터페이스 선언 (람다식 사용 전)

@FunctionalInterface
//메서드가 2개 이상 선언되면 오류 발생
public interface CompareNumber{
	int compareTo(int num01, int num02);
}

 

람다식으로 구현한 인터페이스에 실수로

두 개 이상의 메서드를 추가하는 오류를 막기 위해

@FunctionalInterface 를 사용한다.

 

CompareNumber compare = new CompareNumber() {
//인터페이스 객체를 익명 클래스 선언으로 정의
	
	@Override
	//메서드 구현
	public int compareTo(int num01, int num02){
	  return num01 > num02 ? 1: num01 < num02 ? -1 : 0;
	} 
};

함수형 인터페이스를 익명함수로 선언하여 위와 같이 구현할 수 있다.

하지만 람다식을 사용하면 좀 더 간결해진다.

 

람다식 사용하기

CompareNumber compare = 
(num01, num02) → {return num01 > num02 ? 1: num01 < num02 ? -1 : 0;};

[ 람다식과 외부변수의 관계 ]

람다식을 사용할 때 매개변수로 값을 전달하는 것 외에

외부에서 정의된 지역변수를 사용하는 경우가 있다.

 

이렇게 지역변수를 사용할 때는 유의해야 할 사항이 있다.

람다식 내부에서 지역변수를 사용하려면

그 지역변수는 final로 선언되어야 한다.

 

예시)

지역변수 str을 선언한 후 람다식 안에서 재정의한다면?

→ 문법 오류가 발생한다.

 

지역변수는 stack 메모리 영역에 생성되고,

람다식의 경우 익명 객체를 만들기 때문에

Heap 영역에 변수가 생성된다.

 

서로 생성되는 위치가 다르므로 이름이

같더라도 간섭할 수 없는 관계가 된다.

 

즉 값을 복사해 그대로 사용할 순 있지만

수정은 할 수 없게 된다. (=variable capture)

public static void main(String[] args){	
    final String str = "java";
}

이렇게 final 키워드를 부여해

변경 불가 변수임을 명시해 주자.

 

str을 수정할 순 없지만 str과 다른 변수들을

함께 활용해 새로운 변수를 만들어낼 수 있게 된다.