Topic (오늘의 주제)
자바 람다 표현식 (Lambda Expressions)
: 메서드를 하나의 '식(Expression)'으로 표현하여, 이름 없는 함수(Anonymous Function)처럼 사용하는 문법. (Java 8부터 도입)
Why (왜 사용하는가? 왜 중요한가?)
- 실무: 불필요하게 길었던 익명 내부 클래스(Anonymous Inner Class) 코드를 획기적으로 줄여 가독성을 높이고, **스트림 API(Stream API)**를 사용하기 위한 필수 조건이다.
- 구조적 의미: 자바는 객체지향 언어지만, 람다를 통해 **함수형 프로그래밍(Functional Programming)**의 장점(함수를 변수처럼 다룸)을 부분적으로 도입할 수 있게 되었다.
- 면접 의도: Java 8의 핵심 변화를 이해하고 있는지, 코드를 간결하게 리팩토링할 수 있는 능력과 함수형 인터페이스의 개념을 아는지 확인한다.
Core Concept (핵심 개념 정리)
| 요소 | 내용 |
| 개념 정의 | 메서드의 이름과 반환 타입을 생략하고 -> 를 사용하여 간결하게 작성한 함수 식. |
| 동작 방식 | (매개변수) -> { 실행문 } 형태. 컴파일러가 문맥을 보고 타입을 추론하여 **함수형 인터페이스(Functional Interface)**의 구현체로 변환한다. |
| 필요 조건 | 함수형 인터페이스여야 함. 즉, 추상 메서드가 오직 1개만 있는 인터페이스(예: Runnable, Comparator)에만 람다를 쓸 수 있다. |
| 장점/단점 | 장점: 코드가 간결해짐, 지연 연산(Lazy Evaluation) 가능, 병렬 처리 용이. 단점: 디버깅이 까다로움(Call Stack 추적 어려움), 너무 남발하면 오히려 가독성 저하(문서화 불가). |
| 예시/비교 | vs 익명 내부 클래스: 익명 클래스는 독자적인 this 스코프를 가지지만, 람다는 자신이 선언된 감싸고 있는 클래스의 스코프를 그대로 따른다. |
Interview Answer Version (면접 답변식 요약)
"람다 표현식은 Java 8에 도입된 기능으로, 메서드를 하나의 간결한 식으로 표현하는 방법입니다.
주로 불필요한 코드를 줄이고 가독성을 높이기 위해 사용하며, 특히 함수형 인터페이스의 구현체로 동작합니다. 이를 통해 자바에서도 함수형 프로그래밍 스타일을 적용할 수 있게 되었으며, 스트림 API의 연산을 효율적으로 처리하는 데 핵심적인 역할을 합니다."
Practical Tip (사용시 주의할 점 or 활용 예)
1. 코드 변환 예시 (익명 클래스 → 람다)
가장 흔한 쓰임새는 컬렉션 정렬이나 스레드 생성입니다.
Java
// [기존] 익명 내부 클래스 사용
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello");
}
}).start();
// [변경] 람다 표현식 사용
new Thread(() -> System.out.println("Hello")).start();
2. 변수 캡처(Variable Capture) 제약
람다 내부에서 외부 지역 변수를 사용할 때는 해당 변수가 final 이거나 effectively final(값이 한 번도 변경되지 않음)이어야 합니다.
- 이유: 람다는 별도의 스레드에서 실행될 수 있는데, 지역 변수는 스택 영역에 있어서 메서드가 끝나면 사라지기 때문입니다. (값 복사 방식을 사용)
3. 표준 함수형 인터페이스 활용
매번 인터페이스를 직접 만들지 말고, 자바가 제공하는 표준 인터페이스를 외워두면 좋습니다. (java.util.function)
- Consumer<T>: 받아서 소비함 (리턴 없음) void accept(T t)
- Supplier<T>: 아무것도 안 받고 줌 (리턴 있음) T get()
- Function<T, R>: 받아서 매핑해서 줌 R apply(T t)
- Predicate<T>: 받아서 참/거짓 판단 boolean test(T t)
예상 꼬리 질문 정리
- "함수형 인터페이스(Functional Interface)란 무엇인가요?"
- (추상 메서드가 딱 하나만 있는 인터페이스, @FunctionalInterface 어노테이션 사용 이유 설명)
- "람다식과 익명 클래스의 차이점은 무엇인가요? (특히 this의 의미)"
- (익명 클래스의 this는 자기 자신, 람다의 this는 람다를 감싸고 있는 외부 클래스 인스턴스)
- "메서드 참조(Method Reference)는 무엇인가요?"
- (람다식이 하나의 메서드만 호출할 때 클래스명::메서드명으로 더 줄여 쓰는 문법 설명)
'Archive > Daily Dev Q&A' 카테고리의 다른 글
| Daily Dev Q&A: DDL, DML, DCL (0) | 2025.12.18 |
|---|---|
| Dailly Dev Q&A: 정규화 (0) | 2025.12.18 |
| Daily Dev Q&A: RDBMS (0) | 2025.12.15 |
| Daily Dev Q&A: 프레임워크(Framework) (0) | 2025.12.13 |
| Daily Dev Q&A: 자바의 빌더 패턴(Builder Pattern) (0) | 2025.12.11 |