




현대 자바의 함수형 진화에서 가장 먼저 이해해야 할 개념은 바로 순수 함수입니다. 이는 단순히 코드를 짧게 짜는 기술이 아니라, 어떤 상황에서도 결과가 변하지 않는 **'견고한 부품'**을 만드는 철학입니다.
동일한 입력에 대해 항상 동일한 출력을 반환하며, 함수 외부의 상태를 절대 변경하지 않는(부작용이 없는) 함수를 말합니다.
수십~수백억대 프로젝트의 성능을 끌어올리기 위해서는 여러 작업을 동시에 처리하는 병렬 처리가 필수입니다.


함수형 패러다임의 가장 큰 매력은 바로 **선언적 프로그래밍(Declarative Programming)**입니다. 이는 컴퓨터에게 일을 시키는 방식 자체가 **"어떻게(How)"**에서 **"무엇을(What)"**으로 완전히 바뀌는 것을 의미합니다.
1. 명령형(Imperative) vs 선언적(Declarative) 비교
| 구분 | 명령형 (Imperative) |
선언적 (Declarative)
|
| 핵심 질문 | 어떻게(How) 할 것인가? |
무엇을(What) 할 것인가?
|
| 코드 스타일 | 루프를 돌고, 조건문을 체크하고, 값을 바꿉니다. |
함수를 **연결(Chaining)**하여 흐름을 정의합니다.
|
| 가독성 | 로직 속에 비즈니스 의도가 숨겨져 있습니다. |
코드 자체가 비즈니스 요구사항처럼 읽힙니다.
|
2. 직관적인 비유: "요리법 vs 주문하기"
AI가 개발의 많은 부분을 보조하는 AX/DX 시대에 선언적 프로그래밍은 기획자와 개발자 사이의 가장 강력한 **'공통 언어'**가 됩니다.



자바에서 함수는 단독으로 존재할 수 없습니다. 람다 표현식을 구현하고 전달하기 위해서는 반드시 그 형식을 정의한 인터페이스가 필요합니다. 이를 함수형 인터페이스라고 부릅니다.
1. SAM(Single Abstract Method) 원칙
함수형 인터페이스의 핵심은 추상 메서드가 딱 하나만 존재해야 한다는 것입니다.
2. 실전 예시: 최대값 찾기
@FunctionalInterface
public interface MaxNumber {
int getMax(int num1, int num2);
}
// 람다로 구현
MaxNumber max = (x, y) -> (x >= y) ? x : y;
위와 같이 인터페이스라는 '규격'을 선언하고, 람다라는 '내용물'을 채워 변수처럼 사용할 수 있게 됩니다.
매번 인터페이스를 직접 만들기는 번거롭습니다. 자바는 실무에서 가장 많이 쓰이는 4가지 유형을 미리 만들어 두었습니다.
| 인터페이스 | 추상 메서드 | 특징 | 실무 활용 예시 |
| Predicate<T> | boolean test(T t) | 입력을 받아 참/거짓 판단 |
리스트에서 조건에 맞는 데이터 필터링
|
| Consumer<T> | void accept(T t) | 입력을 받아서 소비 (반환 없음) |
데이터를 화면에 출력하거나 로그 기록
|
| Supplier<T> | T get() | 입력 없이 데이터를 공급 |
새로운 객체 생성이나 랜덤값 반환
|
| Function<T, R> | R apply(T t) | T를 받아 R로 변환 (Mapping) |
엔티티(DB 객체)를 DTO(화면용 객체)로 변환
|
AI가 비즈니스 로직을 제안하는 AX/DX 환경에서, 함수형 인터페이스는 '로직을 데이터처럼 주고받는' 혁신을 가능케 합니다.


모던 자바의 가장 큰 변화 중 하나는 **람다(Lambda)**의 도입입니다. 람다는 한마디로 **'이름이 없는 익명 함수(Anonymous Function)'**입니다. 복잡한 형식을 걷어내고 오직 **'핵심 알맹이(로직)'**만 전달하는 것이 목적입니다.
자바는 원래 참조 변수 없이 메서드만 단독으로 호출할 수 없었습니다. 하지만 람다의 등장으로 로직 자체를 객체로 취급하여 함수형 인터페이스형 변수에 대입하고, 이를 다른 메서드의 인자로 전달하거나 반환할 수 있게 되었습니다.
우리가 두 숫자를 더하는 로직을 짠다고 가정해 봅시다.
int add(int x, int y) {
return x + y;
}
(int x, int y) -> { return x + y; }
AI가 복잡한 비즈니스 규칙을 제안하는 AX/DX 환경에서, 람다는 **'유연한 시스템 구축'**의 핵심 엔진입니다.









현대 자바 개발의 핵심은 데이터를 단순히 다루는 것이 아니라, **안전하게(Generic) 보관(Collection)하고 지능적으로 처리(Stream)**하는 흐름을 설계하는 것입니다.
제네릭은 데이터 보관함에 붙이는 **'전용 라벨'**입니다.
컬렉션은 다양한 타입의 객체를 담을 수 있는 보관 창고입니다. 비즈니스 목적에 따라 최적의 창고를 선택하는 것이 설계의 핵심입니다.
| 구분 | List (리스트) | Set (셋) | Map (맵) |
| 핵심 키워드 | 순서, 중복 허용 | 고유, 중복 불가 |
키-값 쌍 (Key-Value)
|
| 비유 | 줄 서서 기다리는 관객 | 중복 없는 당첨자 명단 |
이름표가 붙은 사물함
|
| 대규모 용도 | 인덱스로 빠른 조회 | 수천만 건 중 중복 체크 |
상품 코드 등으로 즉시 검색
|
스트림은 보관된 데이터를 "어떻게(How) 처리할지가 아니라 무엇을(What) 할지" 연속적인 파이프라인으로 정의하는 도구입니다.
수백억대 커머스 프로젝트의 재고 관리 로직을 예로 들어보겠습니다.
"제네릭(라벨) → 컬렉션(보관함) → 스트림(공장)" 이 삼박자가 맞물릴 때, 코드는 비즈니스 요구사항 그 자체가 되며 시스템은 압도적인 안정성을 갖게 됩니다.
| I-5. Robust System & Data Connectivity: 데이터의 흐름과 안정성 (0) | 2026.03.28 |
|---|---|
| I-3. Advanced Object-Oriented Design: 설계의 정석 (0) | 2026.03.28 |
| I-2. Data Engineering & Memory Management: 메모리의 과학 (0) | 2026.03.28 |
댓글 영역