반응형
회사를 다니면서 쓰지 않던 것 중에 많이 접하게 되는 것 중 하나가 람다식이다. 자바 1.8부터 람다식 사용이 가능해졌기 때문에 아직 안써봤다는게 민망하지만 더 미루다간 기회비용이 더 커질 것 같아 공부하면서 포스팅을 해봅니다
들어가며)
자바는 OOP(객체지향 언어)이지만 1.8부터 함수형 언어의 특성을 도입했다. 자바는 물론 파이썬과 자바스크립트 또한 마찬가지로 함수형 언어의 특성을 가지고 있기 때문에 알아두면 유용하게 써먹을 수 있다.
람다식이란?
- 함수(메서드)를 간단한 식으로 표현하는 방법
- 람다식은 익명함수(이름이 없는 함수)이다
int max (int a, int b) {
return a > b ? a : b;
}
//변환 후
(a, b) -> a > b ? a : b
람다식을 작성하는 방법 4단계
int max (int a, int b) {
return a > b ? a : b;
}
//1단계 : 반환타입과 이름을 지우고 화살표를 넣는다
(int a, int b) -> {
return a > b ? a : b;
}
//2단계 : 반환값(return)이 있는 경우 식이나 값만 적고 return 생략 가능(끝에 ';' 안 붙임)
(int a, int b) -> { a > b ? a : b }
//3단계 : 매개변수 타입이 추론 가능하면 생략가능(대부분의 경우 생략가능)
(a, b) -> { a > b ? a : b }
//4단계 : 블록 안의 문장이 하나뿐이면 괄호 {} 생략가능
(a, b) -> a > b ? a : b
람다식 주의사항
// 1. 매개변수가 하나인 경우 괄호() 생략가능(타입이 없을 때만)
(a) -> a * a =====> a -> a * a //ok
(int a) -> a * a =====> int a -> a * a //에러
// 2. 블록 안의 문장이 하나뿐이면 괄호 {} 생략가능
int printGoGO(String name, int i) {
System.out.println(name+"="+i);
}
===>
(name, i) -> System.out.println(name+"="+i)
1번 항목이 100% 이해는 안되었지만 대부분의 경우 생략이 가능하다고 한다.
자바 람다식 예제
//메서드1
int max(int a, int b) {
return a > b ? a : b;
}
//메서드2
int printVar(String name, int i) {
System.out.println(name+"="+i);
}
//메서드3
int square(int x) {
return x * x;
}
//메서드4
int roll() {
return (int) (Math.random()*6);
}
//==변환==//
//람다식1
(a, b) -> a > b ? a : b
//람다식2
(name, i) -> System.out.println(name+"="+i)
//람다식3
x -> x * x
//람다식4
() -> (int)(Math.random()*6)
람다식 익명 함수? 익명 객체!
사실 람다식은 익명 함수가 아닌 익명 객체이다.
(a, b) -> a > b ? a : b
//원래는 아래와 같이 써야하는 것을 위처럼 간편화 한 것
new Object() {
int max(int a, int b) {
return a > b ? a : b;
}
}
람다식의 참조변수 타입
람다식을 다루기 위한 참조변수 타입은 어떻게 해야하는가?
Object obj = new Object() {
int max(int a, int b) {
return a > b ? a : b;
}
};
//람다로 변환하면
타입 obj = (a, b) -> a > b ? a : b ; // 어떤 타입?
int value = obj.max(3, 5); // 에러. object클래스에 max()가 없음
//이렇게 실제로 기능이 존재하더라도 사용하지 못하게 되는 문제가 생긴다.
이 문제로 인해 함수형 인터페이스에 대해서도 공부해야 한다.
이 글은 아래 영상을 바탕으로 공부하고 작성했습니다.
반응형
'자바&스프링' 카테고리의 다른 글
[자바] java 기본 타입와 wapper(래퍼) 클래스, 박싱과 언박싱 (0) | 2023.04.12 |
---|---|
[자바] java의 특징, 객체지향 언어의 특징 (0) | 2023.04.11 |
[자바] java에서 자주 쓰이는 문자열 함수 10가지 indexOf, substring, replace 등 (0) | 2023.04.08 |
[자바] java 가비지 컬렉터란? 장단점 (0) | 2023.04.07 |
[자바] java equals, == 의 차이 간단정리(+예제) (0) | 2022.12.17 |