1. 람다가 필요한 이유
- 핵심 개념
- 코드 중복 제거 및 재사용성을 위해 코드의 변하는 부분과 변하지 않는 부분을 분리할 필요가 있음
- 메서드가 처리해야 하는 데이터(값)뿐만 아니라 코드 조각(동작)도 전달할 수 있어야 함
2. 값 매개변수화 (Value Parameterization)
- 메서드에서 문자열, 숫자와 같은 값을 직접 넣는 대신, 외부에서 매개변수를 통해 값을 전달받아 메서드 재사용성을 높임
- 예: 문자열 "Hello Java" → 파라미터로 전달받음
3. 동작 매개변수화 (Behavior Parameterization)
- 코드 조각(동작)을 외부에서 전달받아 실행할 수 있도록 구성하는 방식
- 클래스 또는 익명 클래스를 이용하여 인터페이스를 구현한 후, 메서드를 통해 실행하는 형태
- 인터페이스로 정의한 메서드를 구현한 클래스나 익명 클래스의 인스턴스를 메서드로 전달하여 동작을 실행
public interface Procedure { void run(); }
실제사용은 아래와 같다.
public static void hello(Procedure procedure) { procedure.run(); }
4. 익명 클래스 → 람다 표현식
- 코드가 복잡하고 장황한 익명 클래스를 간단하게 람다 표현식으로 대체 가능
- 람다를 통해 클래스나 인스턴스 정의 없이 코드 블럭을 바로 전달 가능
- 익명 클래스 사용 예시:
Procedure p = new Procedure() {
@Override
public void run() {
System.out.println("Hello Lambda");
}
};
p.run();
람다 표현식:
Procedure p = () -> System.out.println("Hello Lambda");
p.run();
5. 함수 vs 메서드
- 함수(Function)
- 독립적으로 호출 가능하고 클래스에 속해있지 않음
- 객체 상태와 무관하게 호출 가능
- 메서드(Method)
- 클래스(객체)에 속한 함수
- 객체 상태(속성)에 접근 및 사용 가능
- 객체 지향 언어에서는 클래스 내부에서 정의된 함수를 메서드라고 부름
6. 람다 표현식 기본 형태
- (매개변수) -> {코드 본문}
- 매개변수 없을 때: () -> {...}
- 매개변수 있을 때: (int a, int b) -> { return a + b; }
- 매개변수와 본문만 간략히 표현하여 코드가 간결해짐
람다(Lambda) 핵심 정리 노트
🔹 람다의 개념과 정의
- 자바8에서 도입된 익명 함수(이름이 없는 함수)로, 함수형 프로그래밍을 지원하기 위한 기능이다.
- 일반 메서드 형태와 다르게 매우 간결한 표현이 가능하다.
람다의 특징과 장점
- 간결한 코드 표현으로 가독성과 생산성을 높인다.
- 변수에 할당하거나, 메서드에 전달하거나, 반환하는 것이 가능하다.
- 람다 역시 익명 클래스처럼 내부적으로 클래스와 인스턴스가 생성된다.
- 문법적 설탕(syntactic sugar): 코드를 간단히 표현하는 편의적 문법이다.
🔹 함수형 인터페이스 (Functional Interface)
- 정확히 하나의 추상 메서드를 가지는 인터페이스
- 람다는 함수형 인터페이스에만 할당 가능
- @FunctionalInterface 애노테이션으로 컴파일 단계에서 실수를 방지
@FunctionalInterface
public interface MyFunction {
int apply(int a, int b);
}
람다 문법의 간략화 (생략 가능)
단일 표현식일 때 중괄호와 return 생략 가능
(a, b) -> a + b; // 생략 가능
매개변수 타입도 추론하여 생략 가능
(a, b) -> a + b; // 타입 생략 가능
매개변수가 하나라면 괄호 생략 가능
value -> value * 2; // 괄호 생략 가능
람다 전달 방식
변수에 람다를 저장하거나 전달 가능
MyFunction add = (a, b) -> a + b;
메서드의 인자로 직접 전달 가능
calculate((a, b) -> a + b);
메서드에서 람다를 반환 가능
return (a, b) -> a + b;
고차 함수(Higher-Order Function)
- 함수를 인자로 받거나, 함수를 반환하는 함수
- 람다를 활용하여 고차 함수를 구현할 수 있음
// 함수를 인자로 받는 경우
static void calculate(MyFunction function) { ... }
// 함수를 반환하는 경우
static MyFunction getOperation(String operator) {
return (a, b) -> a + b;
}
+) 참고. 익명클래스와 인스턴스 객체 출력
public class InstanceMain { // 익명클래스 vs 인스턴스
public static void main(String[] args) {
Procedure procedure1 = new Procedure() {
@Override
public void run() {
System.out.println("hello! lambda");
}
};
System.out.println("class.class = " + procedure1.getClass());
System.out.println("class.instance = " + procedure1);
Procedure procedure2 = () -> {
System.out.println("hello! lambda");
};
System.out.println("class.class = " + procedure2.getClass());
System.out.println("class.instance = " + procedure2);
}
}
'Java' 카테고리의 다른 글
[Java] 익명 클래스 vs 람다: 자바 람다, 내부에선 어떤 일이 벌어질까?(Java Lambda & invokedynamic) (0) | 2025.04.03 |
---|---|
[Java] 김영한의 실전 자바 - 고급 3편 섹션3 함수형 인터페이스 (0) | 2025.04.03 |
[Java] 김영한의 실전 자바 - 고급 2편 섹션15 HTTP 서버 활용 (0) | 2024.12.02 |
[Java] 김영한의 실전 자바 - 고급 2편 섹션14 애노테이션 (4) | 2024.11.28 |
[Java] 김영한의 실전 자바 - 고급 2편 섹션13 리플렉션 (0) | 2024.11.25 |