본문 바로가기

JAVA

람다1

람다식이란 

함수(메서드)를 간단한 식(expression)으로 표현하는법

ex) int max (int a , int b){

 return a>b ? a :b

}

 

위 식을

(a,b) -> a > b ? a : b

와 같이 표현할 수 있다.

 

람다식은 익명함수(이름없는 함수 이다)

int max(int a , int b){

return a > b ? a : b

}

위 식에서 

반환 타입 과 함수명을 지우고 화살표를 추가한다.

이 상태를 익명 함수라 한다.

(int a , int b) -> {

 return a > b ? a : b;

}

 

함수와 메서드의 차이

근본적으로는 동일하다 , 함수는 일반적 용어 , 메서드는 객체지향 개념의 언어

함수는 클래스에 독립적 , 메서드는 클래스에 종속적이다

 

람다식 작성하기

1.메서드의 이름과 반환타입을 제거하고 '->' 을 블록{}안에 추가한다.

int max (int a , int b) {

 return a > b ? a : b

}

위 함수를

(int a , int b) -> {

 return a > b ? a : b;

}

 

2. 반환값이 있을 경우 , 식이나 값만 적고 return 을 생략 가능 (끝에 ';' 도 제거)

(int a , int b) -> a > b ? a : b

 

3. 매개변수의 타입이 추론 가능하면 생략 가능 (대부분의 경우 생략 가능)

(a , b) -> a > b ? a : b

 

람다식 작성 주의 사항

1.매개변수가 하나인 경우 () 생략 가능 , 타입이 없을 대만

(a) -> a * a 

a -> a * a

 

(int a) -> a * a 는 타입이 있기 때문에 'int a' 로 만들지 못한다.

 

2. 블록안에 문장이 하나 뿐일때 {} 생략가능

(int i) -> {

system.out.println(i)

}

위를 다음과 같이 생략

(int i) -> system.out.println(i);

 

람다식은 익명객체 이다.

위에서 람다식은 익명함수라고 했지만

사실 람다식은 익명 객체 이다.

그래서

(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) 

이렇게 호출할 경우 에러가 발생한다.

정확히는 작동은 하는데 Obj 안에 max 란 함수가 없다. 그래서 호출이 불가능하다.

즉 위에서 참조변수를 다음과 같이 받았지만 Object obj = new Object()

실제로 Object 안에 Max란 함수가 존재하지 않기 때문에 호출이 불가능한것이다.

 

그래서 결론적으로

람다는 익명객체이기 때문에 참조변수에 넣어주어야 한다.

그러기 위해서는 함수형 인터페이스가 필요하다.

 

람다식 Object obj = (a,b) -> a>b ? a:b는 

Object obj = new Object(){

 int max(int a, int b){

 return a > b ? a : b

}

}

와 같다.

 

 

'JAVA' 카테고리의 다른 글

람다6 메소드 참조  (0) 2023.03.15
람다5 함수 두개를 연결 andThan  (0) 2023.03.15
람다4 Predicate 람다 조건식  (0) 2023.03.15
람다3 함수형 인터페이스  (0) 2023.03.15
람다2  (0) 2023.03.14