이 글은 유튜브 '자바의 정석 - 기초편'을 보고 정리한 글입니다.
📂content
1. 람다식(Lambda Expression)
- 함수(메서드)를 간단한 `식(expression)`으로 표현하는 방법
- 익명 함수 (이름이 없는 함수, anonymous function)
반환타입과 이름을 지우고 화살표를 추가한다.
- 함수와 메서드의 차이
근본적으로 동일. 함수는 일반적 용어. 메서드는 객체지향개념 용어
함수는 클래스에 독립적, 메서드는 클래스에 종속적
2-1. 람다식 작성하기
1. 메서드의 이름과 반환타입을 제거하고 `->`를 블록{} 앞에 추가한다.
2. 반환값이 있는 경우, 식이나 값만 적고 return문 생략 가능(끝에 ';' 안 붙임)
3. 매개변수의 타입이 추론 가능하면 생략 가능(대부분의 경우 생략 가능)
2-2. 람다식 작성하기 - 주의사항
1. 매개변수가 하나인 경우, 괄호() 생략가능(타입이 없을 때만)
2. 블록 안의 문장이 하나뿐 일 때, 괄호{} 생략 가능(끝에 ';' 안 붙임)
단, 하나뿐인 문장이 return문이면 괄호{} 생략불가
3. 람다식의 예
메서드 | 람다식 |
int max(int a, int b) { return a > b? a : b; } |
(a,b) -> a > b ? a : b |
int printVar(String name, int i) { System.out.println(name + " = " + i); } |
(name, i) -> System.out.println(name + " = " + i) |
int square(int x) { return x*x; } |
x -> x*x |
int roll() { return (int)(Math.random() * 6); } |
() -> (int)(Math.random() * 6) |
4. 람다식은 익명 함수? 익명 객체!
- 람다식은 익명 함수가 아니라 익명 객체이다.
`익명 객체` : 객체의 선언과 생성을 동시에 한다.
- 람다식(익명 객체)을 다루기 위한 참조변수가 필요. 참조변수의 타입은? Object
익명객체를 다루기 위해서는 참조변수가 필요하고, 참조변수는 참조타입이 필요할 것이다. 그래서 타입을 Object로 했는데 실행해 보면 Object라는 리모컨에는 max()라는 메소드가 없다. 그래서 오류가 난다. 그런데 형변환 할 게 없어서 형변환도 못 한다.
그렇다면 어떻게 오류를 해결할 수 있을까?
함수형 인터페이스를 이용하자!
5-1. 함수형 인터페이스
- 단 하나의 추상 메서드만 선언된 인터페이스
- @functionalInterface라는 애너테이션을 붙이면 컴파일러가 함수형 인터페이스가 올바르게 작성되었는지 확인해 준다. 함수형 인터페이스는 단 하나의 추상 메서드만 가져야한다. 인터페이스는 추상메서드가 여러 개여도 상관 X
- new 조상이름(클래스, 인터페이스) { 멤버 }
- Object대신에 함수용 인터페이스인 MyFunction을 사용함.
- 함수형 인터페이스 타입의 참조변수로 람다식을 참조할 수 있음
(단, 함수형 인터페이스의 메서드와 람다식의 매개변수 개수와 반환타입이 일치해야 함)
위 이미지의 MyFunction 코드를 사용하는 것이 아닌 람다식을 이용해서 간단한 코드를 만든다.
1. 함수형 인터페이스 작성
2. 함수형 인터페이스 타입의 참조변수로 람다식 참조
5-2. 함수형 인터페이스 예시
- 익명 객체를 람다식으로 대체
Comparator가 함수형인터페이스가 되는 것
5-3. 함수형 인터페이스 타입의 매개변수, 반환타입
- 함수형 인터페이스 타입의 매개변수
aMethod의 매개변수로 함수형인터페이스인 MyFunction을 받는 다는 것은 람다식을 받겠다는 것이다. 즉, 람다식에 이름을 붙여주고 호출하겠다는 것. 2는 람다식을 직접 집어넣는 것이다. 1과 2는 같은 의미의 코드이다.
- 함수형 인터페이스 타입의 반환타입
출처
'🎥Back > 자바의 정석' 카테고리의 다른 글
[JAVA의 정석]스트림의 연산 (0) | 2024.03.08 |
---|---|
[JAVA의 정석] 스트림 (0) | 2024.03.08 |
[JAVA의 정석] 스레드와 관련된 함수 및 동기화 (0) | 2024.03.01 |
[JAVA의 정석]데몬 스레드, 스레드의 상태 (0) | 2024.02.29 |
[JAVA의 정석]싱글 스레드와 멀티스레드, 스레드의 I/O 블락킹 (0) | 2024.02.29 |