Java 람다 표현식과 함수형 인터페이스
선수학습(1개)
요약
Java 람다 표현식(Lambda Expression)과 함수형 인터페이스(Functional Interface)의 개념을 알아봅니다. 정보처리기사 실기에 출제된 람다 표현식 문제를 풀기 위한 핵심 개념을 정리합니다.
람다 표현식 핵심 정리
| 개념 | 설명 | 예시 |
|---|---|---|
| 함수형 인터페이스 | 추상 메서드가 딱 하나인 인터페이스 | interface F { int apply(int x); } |
| 람다 표현식 | 함수형 인터페이스를 짧게 구현하는 문법 | (x) -> x * 2 |
| 매개변수 | 화살표(->) 왼쪽에 작성 | (x) 또는 (int x) |
| 본문 | 화살표(->) 오른쪽에 작성 | x * 2 또는 { return x * 2; } |
함수형 인터페이스란? 쌩기초
함수형 인터페이스(Functional Interface) 는 추상 메서드가 딱 하나만 있는 인터페이스입니다.

추상 메서드가 하나뿐이므로, 이 인터페이스를 구현할 때 어떤 메서드를 구현해야 하는지 명확합니다. 이 특성 덕분에 람다 표현식으로 간결하게 구현할 수 있습니다.
"함수형"이라고 부르는 이유는, 추상 메서드가 1개뿐이면 인터페이스 자체가 하나의 함수를 대표하기 때문입니다. 메서드 이름 없이 (x) -> x + 1처럼 동작만 적어도 어떤 메서드를 구현하는 건지 알 수 있으므로, 마치 함수처럼 쓸 수 있습니다. 반대로 메서드가 2개 이상이면 람다식이 어느 메서드를 구현하는 건지 알 수 없어서 함수처럼 쓸 수 없습니다.
함수형 인터페이스 vs 일반 인터페이스
함수형 인터페이스만 람다 표현식으로 구현할 수 있습니다. 추상 메서드가 2개 이상이면 람다 표현식을 사용할 수 없습니다.
람다 표현식이란? 기초
람다 표현식(Lambda Expression) 은 함수형 인터페이스를 짧고 간결하게 구현하는 문법입니다. Java 8부터 도입되었습니다.
기존 방식 vs 람다 표현식
람다 표현식 (x) -> x * 2는 "매개변수 x를 받아서 x * 2를 반환한다"는 뜻입니다. 인터페이스의 유일한 추상 메서드 apply를 자동으로 구현합니다.

람다 표현식 문법 기초
기본 형식
화살표(->)를 기준으로 왼쪽이 매개변수, 오른쪽이 본문입니다.
문법 규칙
단일 표현식이면 중괄호와 return을 생략할 수 있습니다.
여러 문장이면 중괄호와 return이 필요합니다.
매개변수 타입은 생략할 수 있습니다. 컴파일러가 인터페이스의 메서드 선언부를 보고 자동으로 추론합니다.
문법 정리
| 형태 | 예시 | 설명 |
|---|---|---|
| 단일 표현식 | (x) -> x * 2 | 중괄호, return 생략 가능 |
| 여러 문장 | (x) -> { return x * 2; } | 중괄호, return 필요 |
| 타입 명시 | (int n) -> n + 9 | 매개변수 타입을 직접 작성 |
| 타입 생략 | (n) -> n + 9 | 컴파일러가 타입 추론 |
람다 표현식은 어떤 메서드를 구현할까? 심화
람다 표현식은 함수형 인터페이스의 유일한 추상 메서드를 자동으로 구현합니다. 매개변수 개수와 타입, 반환 타입이 인터페이스의 메서드와 일치해야 합니다.
| 인터페이스 메서드 | 람다 표현식 | 연결 |
|---|---|---|
int apply(int x) | (x) -> x * 2 | x는 apply의 매개변수, 반환값은 int |
| 메서드 이름: apply | - | 람다에서 메서드 이름은 쓰지 않음 |
호출: f.apply(3) | 본문 실행 | x에 3이 전달됨 |
실전 예제: 문제 풀이 과정 심화
25년 2회 기출문제와 동일한 구조로 단계별 풀이를 연습합니다.
단계별 분석
1단계: 구조 파악
| 요소 | 역할 |
|---|---|
interface F | 함수형 인터페이스 (apply 메서드 1개) |
run(F f) | F를 받아 f.apply(3)을 실행, 예외 시 7 반환 |
F f = (x) -> { ... } | 첫 번째 람다 표현식 (변수에 저장) |
(int n) -> n + 9 | 두 번째 람다 표현식 (직접 전달) |
2단계: 첫 번째 run(f) 실행
run메서드에서f.apply(3)을 호출합니다- 람다 표현식에서 x = 3이므로
3 > 2가true입니다 throw new Exception()으로 예외가 발생합니다run메서드의 catch 블록에서 예외를 잡아 7을 반환합니다
3단계: 두 번째 run((int n) -> n + 9) 실행
run메서드에서apply(3)을 호출합니다- n = 3이므로
3 + 9 = 12를 반환합니다 - 예외가 발생하지 않으므로 정상적으로 12가 반환됩니다
4단계: 최종 출력
실행 순서 추적
| 순서 | 코드 | 결과 |
|---|---|---|
| 1 | run(f) -> f.apply(3) | x=3, 3>2이므로 예외 발생 |
| 2 | catch (Exception e) | 예외를 잡아 7 반환 |
| 3 | run((int n) -> n + 9) -> apply(3) | n=3, 3+9=12 반환 |
| 4 | 7 + 12 | 19 출력 |