TIL

24.08.05 TIL - Java 람다 기초

개발공명 2024. 8. 6. 09:52

 

오늘 배운 것 

  • 람다 기초

 

람다식

자바에는 2번의 큰 변화 있었다.

  1. generics의 등장
  2. 람다식의 등장

 

람다식의 도입으로 인해 자바는 객체지향 언어인 동시에 함수형 언어가 되었다.

 

람다식 덕분에 함수형 언어의 장점들도 자바에서 누릴 수 있게 되었다.

 

람다식 → 자바 = 객체지향 언어 + 함수형 언어

 

람다식이란?

람다식 = 메서드를 하나의 식으로 표현한 것

 

메서드를 람다식으로 표현 → 메서드의 이름, 반환 값 없어짐 → 람다식 = 익명 함수

 

아래 코드에서 arr 뒤의 코드가 람다식

int[] arr = new int[5];
Arrays.setAll(arr, (i) -> (int) (Math.random()*5)+1);

 

람다식을 메서드로 표현하면 다음과 같다.

(i) -> (int) (Math.random()*5)+1

int method(){
	return (int) (Math.random()*5)+1;
}

 

메서드 단점

모든 메서드는 클래스에 포함되어야 한다.

그래서 클래스도 새로 만들어야 하고 객체도 생성해야만 메서드 호출할 수 있다.

 

람다식 장점

메서드보다 람다식이 간결하면서도 이해하기 쉽다.

람다식은 클래스, 객체 생성 없이 람다식 자체만으로 메서드 역할 대신 할 수 있다.

람다식은 메서드의 매개변수로 전달 되어지는 것이 가능하다.

람다식은 메서드의 결과로 반환될 수 있다.

람다식으로 인해 메서드를 변수처럼 다루는 것이 가능해진다.

 

람다식 작성하기

메서드에서 람다식을 만드는 방법은 아래와 같다.

 

메서드에서 메서드명, 반환 타입 제거한다.

 

매개변수 선언부와 메서드 바디 = {} 사이에 →를 추가한다.

반환타입 메서드명 (매개변수 선언){
	메서드 바디
}

->

(매개변수 선언) -> { 메서드 바디 }

 

반환 값이 있는 메서드는 return문 대신 식으로 대신할 수 있다.

 

식의 연산 결과가 자동적으로 반환 값이 된다.

 

식의 끝에는 ;을 붙이지 않는다.

(int a, int b) -> { return a>b ? a:b; } 

-> 

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

 

람다식에 선언된 매개변수의 타입은 추론 가능한 경우 생략할 수 있다.

 

대부분의 경우 추론 가능해 생략할 수 있다.

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

->

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

 

매개변수가 하나뿐인 경우 소괄호를 생략할 수 있다.

 

하지만 매개변수 타입이 있으면 소괄호를 생략할 수 없다.

(a) -> a*a
(int a) -> a*a

->

a -> a*a      (O)
int a -> a*a  (X)

 

중괄호 안의 문장이 하나일 때에는 중괄호를 생략할 수 있다.

 

이때 문장의 끝에 ;을 붙이면 안된다.

(String name, int i) -> { System.out.println(name+"="+i); }

->

(String name, int i) -> System.out.println(name+"="+i)

 

그러나 중괄호 안의 문장이 return문일 경우 중괄호를 생략할 수 없다.

(int a, int b) -> { return a>b ? a:b; } (O)

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

 

메서드에서 람다식을 만드는 방법을 정리하면 아래와 같다.

  1. 메서드에서 메서드명, 반환 타입 제거한다.
  2. 매개변수 선언부와 메서드 바디 = {} 사이에 →를 추가한다.
  3. return문은 식으로 대신하고 ;을 삭제할 수 있다.
  4. 매개변수 타입 추론 가능한 경우 매개변수 타입 생략해도 된다.
  5. 매개변수가 하나라면 ()를 생략해도 된다. (but 타입이 있다면 생략할 수 없다)
  6. 메서드 body 즉 {} 안에 문장이 하나라면 {}를 생략하고 ;를 삭제할 수 있다. (but return이라고 써있으면 생략할 수 없다)