람다식은 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과 다른 변수들을
함께 활용해 새로운 변수를 만들어낼 수 있게 된다.
'개주 훈련일지 > 📚 코살대 교본 학습' 카테고리의 다른 글
| 소프트웨어 개발 비용 예측 기법 (0) | 2025.12.09 |
|---|---|
| 스레드 (0) | 2025.12.07 |
| 컬렉션 프레임워크 (Collection Framework) (0) | 2025.12.04 |
| 자바 API 문서 (0) | 2025.12.03 |
| 프로젝트 계획과 스케줄링 (0) | 2025.12.02 |