자바&스프링

[자바] java 람다식 작성하는 법 & 예제

내가 그린 코딩 그림 2022. 12. 19. 23:06
반응형

회사를 다니면서 쓰지 않던 것 중에 많이 접하게 되는 것 중 하나가 람다식이다. 자바 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()가 없음


//이렇게 실제로 기능이 존재하더라도 사용하지 못하게 되는 문제가 생긴다.

이 문제로 인해 함수형 인터페이스에 대해서도 공부해야 한다.

 

 

 

이 글은 아래 영상을 바탕으로 공부하고 작성했습니다.

 

반응형