기록과 정리

람다표현식&메소드 레퍼런스 본문

IT/Java

람다표현식&메소드 레퍼런스

zepetto 2021. 7. 26. 21:27

이 글은 백기선님의 '더 자바, Java 8' 강의를 참고하였습니다.

https://www.inflearn.com/course/the-java-java8/lecture/48041?speed=1&tab=curriculum 

 

더 자바, Java 8 - 인프런 | 학습 페이지

지식을 나누면 반드시 나에게 돌아옵니다. 인프런을 통해 나의 지식에 가치를 부여하세요....

www.inflearn.com

 

람다 표현식

(인자리스트) -> {바디}

 

의 형태를 가진다. 또한 인자의 타입은 생략이 가능하다. (*컴파일러에서 어느정도 추론이 가능)

인자가 2개이상, 타입을 선언하지 않은 경우

 

변수 캡쳐 (Variable Capture)

자바 8부터는 final 키워드는 생략 가능하다. baseNumber라는 변수가 사실상 final인 경우가 그러하다. 사실상 final이라는 것은 final이라는 키워드가 없지만 baseNumber을 어디서도 변경하지 않는 경우 , 사실상 final하다라고 표현한다. ( effective final )

람다는 로컬클래스(Local Class) 와 익명클래스 (Anonyumous Class)와는 다르게 쉐도잉( int baseNumber =11 로 인해 baseNumber가 재정의 되는 것, 가려지는 것이 더 와 닫는다. )이 되지 않는다. 람다를 감싸고 있는 메서드와 스코프가 동일 레벨에 있다. 아래 코드에서 baseNumber을 재정의 하면 컴파일시 오류가 날 것이다.

basenumber가 이미 스코프에 정의되어 있다고 한다.

같은 스코프가 아니기 때문에 똑같은 이름의 변수를 정의할 수 없다. ( )안에 받는 인자의 이름을 신경을 써야할 것 같다. 

 

또한 effective final인 경우가 아니게 되버리면, 즉 baseNumber가 어떠한 요인으로 변하게 된다면 람다에서는 사용을 할 수 없다.

effective final이 아닌 경우

 

메소드 레퍼런스

 메소드 레퍼런스는 기존 람다를 더욱 간결하게 표현해주는 표현 방식이다.

예를들어 다음과 같이 Greeting 클래스에 다음과 같은 메서드들이 있다.

Greeting Class
::을 두개 사용하면서 static한 메서드를 사용
인스턴스를 만들어 그 안에 메서드를 사용할 수 있다.

입력값이 X, 출력값은 X와 같은 경우가 발생하는 생성자를 사용할 때

get()을 함으로써 Supplier을 호출한다.

입력값을 넣는 생성자를 이용하는 경우는 다음과 같다.

apply()를 함으로써 Greeting을 만든다.

 

'IT > Java' 카테고리의 다른 글

기본 메서드와 스태틱 메서드  (0) 2021.08.03
Iterator/ListIterator/Enumeration 란?  (0) 2021.07.30
Java 함수형 인터페이스  (0) 2021.07.20
가비지 컬렉션 (Garbage Collection) GC란?  (0) 2021.02.02
JAVA (JDK & JRE & JVM ) 정리  (1) 2021.02.01