오늘 배운 것
- 람다 기초
람다식
자바에는 2번의 큰 변화 있었다.
- generics의 등장
- 람다식의 등장
람다식의 도입으로 인해 자바는 객체지향 언어인 동시에 함수형 언어가 되었다.
람다식 덕분에 함수형 언어의 장점들도 자바에서 누릴 수 있게 되었다.
람다식 → 자바 = 객체지향 언어 + 함수형 언어
람다식이란?
람다식 = 메서드를 하나의 식으로 표현한 것
메서드를 람다식으로 표현 → 메서드의 이름, 반환 값 없어짐 → 람다식 = 익명 함수
아래 코드에서 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)
메서드에서 람다식을 만드는 방법을 정리하면 아래와 같다.
- 메서드에서 메서드명, 반환 타입 제거한다.
- 매개변수 선언부와 메서드 바디 = {} 사이에 →를 추가한다.
- return문은 식으로 대신하고 ;을 삭제할 수 있다.
- 매개변수 타입 추론 가능한 경우 매개변수 타입 생략해도 된다.
- 매개변수가 하나라면 ()를 생략해도 된다. (but 타입이 있다면 생략할 수 없다)
- 메서드 body 즉 {} 안에 문장이 하나라면 {}를 생략하고 ;를 삭제할 수 있다. (but return이라고 써있으면 생략할 수 없다)
'TIL' 카테고리의 다른 글
24.08.07 TIL - C++ 코딩 테스트 유용한 함수들 (0) | 2024.08.08 |
---|---|
24.08.06 TIL - MSA (0) | 2024.08.06 |
24.08.04 TIL - 윈도우 스프링 프로젝트 AWS 초 간단 배포 (0) | 2024.08.05 |
24.08.03 TIL - Effective Java Item 55 (0) | 2024.08.04 |
24.08.02 TIL - application.properties 분리 (0) | 2024.08.03 |