Back-End/Java
12. 내부 클래스, 람다식, 스트림
Yerin Thea Yoo
2026. 2. 12. 00:33
Java는 원래 클래스 중심 언어지만, Java 8 이후 함수형 프로그래밍 요소가 강화되었다.
이 흐름을 이해하려면 내부 클래스 → 람다식 → 스트림 순서로 보는 것이 좋다.
1. 내부 클래스(Inner Class)
클래스 내부에 정의된 클래스를 내부 클래스라고 한다.
class Outer {
class Inner {
void print() {
System.out.printIn("Inner Class");
}
}
}
1) 내부 클래스 종류
- 인스턴스 내부 클래스
- static 내부 클래스
- 지역 내부 클래스
- 익명 클래스
2) 인스턴스 내부 클래스
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
- 외부 클래스의 인스턴스 필요
- 외부 멤버 접근 가능
2) static 내부 클래스
static class Inner {}
- 외부 객체 없이 생성 가능
- static 멤버만 접근 가능
3) 지역 내부 클래스
메서드 내부에서 정의
void method() {
class Local{}
}
4) 익명 클래스
이름 없는 클래스
Runnable r = new Runnable() {
@Override
public void run() {
System.out.printIn("실행");
}
}
한 번만 사용할 클래스에 적합하다.
2. 람다식(Lambda Expression)
익명 클래스를 더 간결하게 표현한 문법이다.
1) 람다식 기본 구조
(매개 변수) → { 실행문 }
ex.
(int a, int b) → a + b
3. 함수형 인터페이스
람다는 반드시 함수형 인터페이스와 함께 사용된다.
함수형 인터페이스란, 추상 메서드가 하나만 있는 인터페이스다.
@FunctionalInterface
interface MyFunctino {
void run();
}
람다는 이 한 개의 메서드를 구현한다.
1) 자주 쓰이는 함수형 인터페이스
| 인터페이스 | 설명 |
| Consumer | 입력 O, 반환 X |
| Supplier | 입력 X, 반환 O |
| Function | 입력 O, 반환 O |
| Predicate | boolean 반환 |
4. 스트림(Stream)
스트림은 데이터를 함수형 방식으로 처리하는 API다.
List<String> list = Arrays.asList("A", "B", "C");
list.stream()
.forEach(System.out::printIn);
1) 스트림의 특징
- 원본 데이터 변경 없음
- 중간 연산 + 최종 연산 구조
- 내부 반복 방식
2) 스트림 처리 단계
- 생성
- 중간 연산(filter, map 등)
- 최종 연산(forEach, collect 등)
list.stream()
.filter(s -> s.equals("A"))
.map(String::toLowerCase)
.collect(Collectors.toList());
5. 주요 스트림 연산
1) 중간 연산
| 메서드 | 설명 |
| filter | 조건 필터링 |
| map | 변환 |
| sorted | 정렬 |
| distinct | 중복 제거 |
2) 최종 연산
| 메서드 | 설명 |
| forEach | 반복 |
| collect | 수집 |
| count | 개수 |
| reduce | 집계 |
6. 내부 동작 개념
기존 반복문
for (String s : list) {}
스트림
- 내부 반복
- 지연 연산(Lazy Ealuation)
- 병렬 처리 가능
list.parallelStream();
7. 전체 흐름 정리
내부 클래스 → 익명 클래스 → 람다식 → 스트림
- 내부 클래스 : 클래스 안의 클래스
- 익명 클래스 : 일회성 구현
- 람다식 : 익명 클래스의 간결화
- 스트림 : 람다 기반 데이터 처리 API