-
JAVA 람다와 스트림 - 람다식(Lambda Expression)개발언어/JAVA 2023. 12. 15. 14:30
람다식(Lambda Expression)
자바는 원래 객체 지향(OOP)언어이지만 JDK1.8 부터는 함수형 언어의 기능을 추가했다. 따라서 자바8부터는 OOP언어이 동시에 함수형언어 라고 할 수 있다. 하지만 완전히 함수형 언어도 겸비한다고 하기에는 무리가 있고 함수형 언어의 기능을 포함했다고 보는 편이 더 정확하다.
익명 클래스(anonymous class)
이름이 없는 일회용 클래스. 정의와 생성을 동시에 한다.
익명 클래스의 객체 인스턴스 생성
new Object(){ // 클래스 정의부 }
class Example{ //익명 클래스 Object iv = new Object(){ void method(){} }; //익명 클래스 static Object cv = new Object(){ void method(){} }; void myMethod(){ //익명 클래스 Object lv = new Object(){ void method(){} }; } }
위 코드는 익명 클래스 이기 때문에 compile하고 나면 이름 이 숫자로 붙는다. 그리고 내부 클래스이기 때문에 외부 클래스 이름인 Example이 따라온다.
람다식 작성하기 - 규칙
▶ 함수(메서드)를 간단한 `식(exxpression)`으로 표현하는 방법
// 매서드 표현 int max(int a, int b){ return a > b ? a : b; } //람다식 표현 (a, b) -> a > b ? a : b
▶함수와 메서드의 차이
- 근본적으로 동일. 함수는 일반적 용어, 메서드는 객체지향 개념 용어
- 함수는 클래스에 독립적, 메서드는 클래스에 종속적
람다식 작성하기 - 주의사항
1. 매개변수가 하나인 경우, 괄호() 생략가능(타입이 없을 때만)
2. 블록 안의 문장이 하나뿐 일 때, 괄호{} 생략 가능(끝에 `;` 안 붙임)
람다식은 익명 함수? 익명 객체!
람다식은 익명 함수가 아니라 익명 객체이다. 왜냐하면 자바에서는 메서드만 독립적으로 존재할 수 없다.
// 람다식 (a, b) -> a > b ? a : b //익명객체 new Object(){ int max(int a, int b){ return a > b ? a : b; } }
위 코드의 첫번 째 줄 같은 람다식이 있을때, 밑에 온 코드와 동일 하다 new Object()로 시작하는 아래의 코드는 익명 클래스에 의해 만들어진 익명 객체 인스터스이다. 즉 객체의 선언과 생성을 동시에 하는 것이다.
아래의 코드를 위의 람다식과 같이 간단하게 쓸수 있도록 하는 것으로 람다식 자체가 익명 객체라고 할 수 있다. 따라서 익명 객체인 람다식을 사용하기 위해서는 이것을 다루기 위함 참조변수가 필요하다. 그렇다면 그 참조 변수의 타입을 무엇을로 해야할까?
⭐익명 객체의 메서드
Object obj = new Object(){ int max(int a, int b){ return a > b ? a : b; } };
익명 객체의 조상 클래스로 Object를 사용했으므로 참조타입은 Object를 사용하면 된다.
Object 타입의 익명 객체 인스터스
익명 객체는 max라는 메서드를 가지고 있지만 Object 타입은 는 max()를 가지고 있지 않으므로 해당 메소드를 사용할 수 없다. 그래서 `obj`라는 객체 인스턴스는 max()를 가지고 있지만 Object 타입이 가지고 있지 않기 때문에 호출 할 수 없다.
그래서 필요한 것이 함수형 인터페이스이다
정리
원래 익명 객체가 있을 때 그 익명 객체의 메서드 부분을 표현한 것이 람다 식이다. 사실은 메서드만 있으면 되는데 JAVA 언어의 규칙 상 메서드만 존재할 수 없기 때문에 익명 객체 안에 넣어서 표현을 해야 한다. 따라서 람다식은 익명 객체 인스턴스이기도 하다.
[출처 - 자바의 정석 - 기초편 , 저 남궁성]
'개발언어 > JAVA' 카테고리의 다른 글
JAVA 람다와 스트림 - java.util.funtion 패키지 (1) 2023.12.18 JAVA 람다와 스트림 - 함수형 인터페이스 (0) 2023.12.15 Java - 컬렉션 프레임워크(제네릭)1-1 (0) 2023.11.07 Java - 기본 클래스(Class 클래스)5 (1) 2023.11.06 Java - 기본 클래스(Wrapper 클래스)5 (0) 2023.11.06