article thumbnail image
Published 2022. 9. 18. 00:49

주요내용✔
  • 람다식
  • 메서드 참조

 

 

 

 

람다식

 

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

JDK 1.8 함수형 프로그래밍에서 이 기법을 도입하였다.

 

 

 

 

람다식의 규칙

 

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) -> return a>b ? a:b;

//람다식 변환
(int a,int b) ->  a>b ? a:b

 

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

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

//다음과 같이 변형 가능
(a,b) -> a>b ? a:b

 

4.매개변수가 하나인 경우 괄호() 생략 가능(타입이 없을 때만)

(a) -> a*a

//람다식 변형
a -> a*a

 

5. 블록 안의 문장이 하나뿐일 떄 괄호{}생략가능(끝에 ; 안붙임)

int i -> {
	System.out.println(i)
}

//람다식 변형
(int i) -> System.out.println(i)

 

 

 

람다식은 익명 객체, 더 정확히 말하면 익명 클래스이다.

익명 클래스란 객체의 선언과 생성을 동시에 하여 오직 하나의 객체를 생성하고, 단 한번만 사용되는 일회용 클래스를 뜻함.

// sum 메서드 람다식
(num1, num2) -> num1 + num2

// 람다식을 객체로 표현
new Object() {
	int sum(int num1, int num2) {
		return num1 + num1;
	}
}

 

 

따라서 람다식을 다루기 위한 참조변수가 필요

 

그 참조변수의 타입은 Object 

하지만 위의 경우에서 Object리모콘에는 sum 메서드가 존재하지 않기 때문에 사용 불가

 

 

따라서

=> 함수형 인터페이스 선언

=> 그 안에 sum메서드를 껍데기만 정의 

=> 객체의 생성(함수형 인터페이스 타입)과 선언을 동시에 하는 익명클래스 생성

=> 함수형 인터페이스 타입의 참조변수에서 sum을 불러오면! 정상적으로 참조 가능

 

 

함수형 인터페이스 - 단 하나의 추상 메서드만 선언된 인터페이스!

 

 

 

 

 

메서드 참조

람다식에서 불필요한 매개변수를 제거 주로 사용

 

 

종류 람다 메서드 참조
Static메서드 참조 (x) -> ClassNAme.method(x) ClassName::method
인스턴스 메서드 참조 (obj.x) -> obj.method(x) ClassName::method
특정 객체 메서드 참조 (x) -> obj.method(x) obj::method

 

 

ex) 두 개의 값을 받아 수를 리턴하는 Math 클래스의 max() 정적 메서드를 호출하는 람다식

(left, right) -> Math.max(left, right);

여기서 람다식은 단순히 개의 값을 Math.max() 메서드의 매개값으로 전달하는 역할

입력값과 출력값의 반환타입을 쉽게 유추가능

 

 

따라서 이때 메서드 참조를 이용

// 클래스이름::메서드이름

Math :: max; // 메서드 참조

 

 

정적 메서드를 참조하는 경우

클래스 이름 뒤에 :: 기호를 붙이고 정적 메서드 이름 작성

클래스 :: 메서드

 

 

인스턴스 메서드를 참조하는 경우

객체를 생성한 후 참조 변수 뒤에 ::기호를 붙이고 인스턴스 메서드 이름 작성

참조 변수 :: 메서드

 

 

생성자를 참조하는경우

생성자를 참조한다는 것은 객체 생성을 의미

클래스 이름 뒤에 :: 기호를 붙이고 new 연산자를 작성

//람다식
(a,b) -> {return new 클래스(a,b);};

//생성자 참조
클래스 :: new

 

 

 

 

 

학습후 느낀점👀

익숙하지 않을 땐 손코딩을 해보자!

 

익숙하지 않은 방법이라 헷갈리고 어려웠다.

공책에 메서드의 식을 람다식으로 바꿔보는 연습을 몇번 했더니 조금 익숙해졌다.

 

그치만 아직 메서드 참조가 많이 헷갈린다.

막상 오른쪽에 무엇을 써야할지 왼쪽에 무엇을 써야할지 모르겠다.

스트림 문제를 풀때 메서드 참조를 이용하여 풀어야 하는 경우가 많았는데

이때문에 시간을 많이 잡아먹었다. 메서드 참조가 들어간 문제는 거의 페어분이 푸신 것 같다...ㅎ

람다식을 메서드 참조로 메서드 참조를 람다식으로 바꾸어 보는 연습을 자꾸 해야겠다.

 

'Java' 카테고리의 다른 글

Java - 배열 - > ArrayList변환하기  (1) 2022.09.23
Java - 컬렉션 프레임워크  (0) 2022.09.19
Java-삼항연산자  (0) 2022.09.17
Java - 다형성  (0) 2022.09.17
Java - 클라스와 객체,필드와 메서드  (5) 2022.09.17
복사했습니다!