> For the complete documentation index, see [llms.txt](https://byulseop-til.gitbook.io/sinheeseop_til/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://byulseop-til.gitbook.io/sinheeseop_til/java/java_advanced/undefined.md).

# 자바-람다-동작원리와-함수형-개념

### 1. 자바에서 람다(Lambda)의 실체

* **겉모습:** 함수나 코드 조각을 변수에 담거나 인자로 전달하는 것처럼 보임.
* **내부 실체:** 자바는 순수 함수를 독립적으로 메모리에 띄울 수 없으므로, **"추상 메서드가 단 1개인 함수형 인터페이스(`@FunctionalInterface`)를 즉석에서 구현한 초경량 객체"** 로 취급함.
* **동작 사이클:**

1. `JVM` 이 런타임에 람다 로직을 품은 초경량 인스턴스를 생성함.
2. 변수나 파라미터는 그 **객체의 참조값** 을 보관함.
3. 실행 주체가 원하는 시점에 해당 객체의 내부 메서드(`.run()`, `.accept()`, `.apply()`)를 호출함.

* **최적화 (`invokedynamic`):**
* 외부 지역변수를 캡처하지 않는 람다(Non-capturing)는 상태가 없으므로 단 1개의 싱글톤 인스턴스로 캐싱 및 재사용되어 메모리와 동기화 이슈를 방지함.

***

### 2. 메서드 참조(`::`)의 정확한 의미

* **일반적인 '참조':** 객체나 인스턴스의 주소값을 가리킨다는 프로그래밍 일반 명사.
* **자바 문법의 '메서드 참조 (Method Reference)':** 람다 바디를 새로 작성하지 않고, **이미 존재하는 메서드를 `::` 연산자로 직접 지목하여 그대로 전달하는 전용 문법(Syntactic Sugar)**.
* **축약 조건:** 전달받은 파라미터를 가공이나 연산(예: `!`) 없이 특정 메서드에 1:1로 그대로 토스할 때만 사용 가능.

***

### 3. 함수를 값처럼 다룰 때 등장하는 4가지 CS 개념

| 개념                                       | 바라보는 관점     | 핵심 정의                                | 자바 예시                                    |
| ---------------------------------------- | ----------- | ------------------------------------ | ---------------------------------------- |
| **일급 객체 (First-Class Citizen)**          | **자격 / 지위** | 함수를 일반 변수처럼 다룰 수 있는(할당, 전달, 반환) 권리   | 람다식을 `Function`, `Consumer` 등의 변수에 담는 행위 |
| **고차 함수 (Higher-Order Function)**        | **메서드의 형태** | 함수를 파라미터로 받거나 함수를 반환하는 메서드           | `Stream.map()`, `Stream.filter()`        |
| **동작 파라미터화 (Behavior Parameterization)** | **설계 기법**   | 고정된 데이터 대신 실행 로직(동작)을 넘겨 유연성을 높이는 패턴 | 정렬 기준(`Comparator`)이나 필터링 조건을 외부에서 주입    |
| **콜백 (Callback)**                        | **실행 타이밍**  | 나중에 특정 이벤트나 시점에 실행되도록 맡겨둔 함수         | 이벤트 리스너, 스트림 내부에서 요소마다 실행되는 람다           |

***

### 한 문장으로 보는 인과관계

> "언어가 함수를 **일급 객체** 로 다룰 수 있게 지원해주기 때문에, 우리가 메서드에 데이터 대신 로직을 넘기는 **동작 파라미터화** 를 할 수 있고, 그 로직을 인자로 넘겨받는 메서드를 **고차 함수** 라 부르며, 그렇게 넘겨져서 나중에 실행되는 함수를 **콜백 함수** 라고 부른다."
