반응형
1. Lambda 식이란?
- Java 8부터 지원되는 함수지향형 코드입니다.
- 람다식이란 함수명을 선언하고 사용하는 것이 아닌 식별자 없이 실행가능한 함수입니다.
- 절차형 프로그래밍, 객체지향 프로그래밍과는 다르게 함수의 구현과 호출만으로 프로그램을 만드는 방식인 함수형 프로그래밍에서 자주 사용됩니다.
- Lambda식은 함수형 프로그래밍 언어에서 사용되는 개념으로 익명 함수(Anonymous functions)를 지칭하는 용어입니다
- 함수(Method)를 간단한 ‘식(Expression)’으로 표현하는 방법위 메서드를 아래의 Lambda식으로 바꿀 수 있습니다
- (a,b) -> a > b ? a : b
- int max(int a, int b){ return a > b ? a : b; }
- 익명 함수(이름이 없는 함수, anonymous function)
→ Lambda 식으로 표현할 때 이름이 없어지기 때문에 익명 함수라고 합니다(a,b) -> a > b ? a : b // 반환타입 x, 이름 x, 화살표 추가
- int max(int a, int b){ return a > b ? a : b; }
람다식 작성법
- 메서드의 이름과 반환타입을 제거하고 ‘ - >’를 블록 { } 앞에 추가합니다.
int max(int a, int b) {
return a > b ? a : b;
}
위 식이 아래의 식으로
(int a, int b) -> {
return a > b ? a : b;
}
- 반환값이 있는 경우, 식이나 값만 적고 return 문 생략 가능합니다 (끝에 ‘ ; ’ 안붙임)
(int a, int b) -> {
return a > b ? a : b;
}
위 식이 아래 식으로
(int a, int b) -> a > b ? a : b
- 매개변수의 타입이 추론 가능하면 생략가능합니다(대부분의 경우 생략 가능합니다)
(int a, int b) -> a > b ? a : b
위 식이 아래 식으로!
(a, b) -> a > b ? a : b
단, 매개변수가 하나인 경우, 괄호() 생략 가능합니다 (타입이 없을 때만)
(a) -> a * a
(int a) -> a * a
위 식이 아래 식으로
a -> a * a // ok
int a -> a * a // error, 괄호 있어야 함!
2. Lambda 식의 특징
- 익명 : 보통의 메서드와 달리 이름이 없으므로 익명입니다.
- 함수 : 람다는 메서드처럼 특정 클래스에 종속되지 않으므로 함수 입니다.
- 전달 : Lambda 표현식을 메서드 인수로 전달하거나 변수로 저장할 수 있습니다.
- 간결성 : 익명 클래스처럼 코드를 구현할 필요는 없습니다.
- 람다식 내에서 사용되는 지역변수는 final이 붙지 않아도 상수로 간주됩니다
- 람다식으로 선언된 변수명은 다른 변수명과 중복될 수 없습니다.
3. 기존 로직과 Lambda 식의 차이점
→ 객체 지향은 명령형 프로그래밍이고, 함수형 프로그래밍은 선언형 프로그래밍입니다.
: 우선 명령형 프로그래밍과 함수형프로그래밍의 차이의 핵심은 문제해결의 관점입니다.
기존의 우리가 객체지향 프로그래밍을 할 때는 데이터를 어떻게 처리할 지에 대해 명령을 통해 풀어 나아갔다면,
함수형 프로그래밍은 선언적 함수를 통해 무엇을 풀어나아갈지 결정하는 것 입니다.
명령형 언어 : a 라는 변수에 1을 담으세요 (대입)
함수형 언어 : a 를 1로 정의한다.
기존 로직 : 익명 내부클래스
- 익명 내부 클래스는 이름이 없는 클래스입니다
- 특정 작업을 위해 메서드를 오버로드하거나 기능을 확장해야 하는 경우 상속 없이 인스턴스화 할 수 있습니다
- 익명 내부 클래스는 일반적으로 추상 / 구현 클래스 또는 인터페이스를 구현합니다.
익명 내부클래스 vs Lambda 식
익명 내부클래스 | 람다식 |
이름이 없는 클래스입니다 | 이름이 없는 메서드입니다 |
추상 및 구체 클래스를 확장할 수 있습니다. | 추상 및 구체 클래스를 확장할 수 없습니다 |
여러 추상 메서드를 포함하는 인터페이스를 구현할 수 있습니다. | 단일 추상 메서드를 퐇마하는 인터페이스를 구현할 수 있습니다. |
익명 내부 클래스 내부에서 인스턴스 변수를 선언할 수 있습니다. | 인스턴스 변수를 선언할 수 없습니다 |
익명 내부 클래스를 인스턴스화 할 수 있습니다. | 람다 표현식을 인스턴스화 할 수 없습니다 |
익명 내부 클래스 내부의 this 키워드는 현재 익명 내부 클래스를 참조합니다 | 람다 표현식 내부의 this 키워드는 현재 외부 클래스 객체를 나타냅니다 |
반응형
'Programming > Java, Spring' 카테고리의 다른 글
[Spring] DI / IOC란? / 의존성을 주입하는 방법 (0) | 2022.10.11 |
---|---|
[Spring] POJO란? / POJO vs Java Beans (0) | 2022.10.10 |
[Spring] 스웨거 어노테이션 / Swagger 2.0 vs Swagger 3.0 차이 (0) | 2022.09.22 |
[JAVA] Generic이란?? (0) | 2022.07.16 |
[Spring] JSP & Servlet / JSP와 Servlet의 역할 (0) | 2022.06.17 |