인프런 지식공유자 최태현 님의 자바 스프링부트 서버개발 올인원 강의 커리큘럼에 포함된 과제입니다.
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인
최태현 | Java와 Spring Boot, JPA, MySQL, AWS를 이용해 서버를 개발하고 배포합니다. 웹 애플리케이션을 개발하며 서버 개발에 필요한 배경지식과 이론, 다양한 기술들을 모두 학습할 뿐 아니라, 다양한
www.inflearn.com
[키워드]
익명 클래스 / 람다 / 함수형 프로그래밍 / @FunctionalInterface / 스트림 API / 메소드 레퍼런스
[질문]
- 자바의 람다식은 왜 등장했을까?
- 람다식과 익명 클래스는 어떤 관계가 있을까? - 람다식의 문법은 어떻게 될까?
↓이전에 블로그에 작성했던 람다식에 대한 글을 참고해 답변해보겠다
2023.08.11 - [TIL/JAVA] - [Java] 람다식(Lambda Expressions) - 1. 람다식이란, 람다식 기본 작성법
[Java] 람다식(Lambda Expressions) - 1. 람다식이란, 람다식 기본 작성법
※ 다음은 공식문서, 남궁성 님의 자바의 정석 등 다양한 자료를 참고해 기초적인 개인 공부를 위해 작성한 글로, 비판적 읽기를 권장합니다. 람다식 (Lambda Expression) 이란 람다식은 메서드를 하
dev-de.tistory.com
자바의 람다식은 왜 등장했을까?
람다식은 Java 8 버전에서 함수형(Functional) 프로그래밍을 지원하기 위하여 도입되었다.
전통적인 명령형 프로그래밍에서는 모든 함수에 이름을 붙여 변수를 선언해 할당하고 값을 대입한다. 함수형 프로그래밍은 함수에 불필요한 명명을 하지 않는다. 값의 대입을 멀리하고 불변 데이터를 유지해 참조 투명성을 갖는다. 참조 투명성이란 쉽게 말해 동일한 인자에는 투명하게 동일한 결과를 반환하는 것을 의미한다. 함수형 프로그래밍은 코드를 간결하고 유연하게 해주며 병렬, 비동기 프로그래밍에 유용하다. 객체지향 중심 언어인 자바는 이러한 함수형 프로그래밍을 지원하여 기존 자바의 기능을 확장하기 위해 함수형 인터페이스를 도입하였다. 함수형 인터페이스(Functional Interface)는 단 하나의 추상 메서드를 갖는 인터페이스로, 람다식은 함수형 인터페이스의 인스턴스를 생성하기 위한 편리한 문법 표현식이다.
람다식을 사용하면 익명함수 객체를 보다 간결하게 표현하여 컬렉션 처리 등의 작업을 효율적으로 처리하고 코드의 가독성과 유지보수성을 향상할 수 있다.
@FunctionalInterface
@FunctionalInterface는 함수형 인터페이스를 정의할 때 사용되는 어노테이션으로, 하나의 추상메서드만을 가진 함수형 인터페이스의 조건을 만족하는지 검사해준다.
@FunctionalInterface
interface MyFunctionalInterface {
void myMethod();
void anotherMethod(); // error
}
람다식과 익명 클래스는 어떤 관계가 있을까?
One issue with anonymous classes is that if the implementation of your anonymous class is very simple, such as an interface that contains only one method, then the syntax of anonymous classes may seem unwieldy and unclear.
" 익명 클래스의 한 가지 문제는, 하나의 메소드만 포함하는 인터페이스와 같이 그 구현이 매우 간단한 경우 익명 클래스의 문법이 (불필요하게) 다루기 어렵고 불명확하게 보일 수 있다는 것"
···
In these cases, you're usually trying to pass functionality as an argument to another method ··· Lambda expressions enable you to do this, to treat functionality as method argument, or code as data.
" 이러한 경우에는 일반적으로 함수를 다른 메서드의 인수로 전달하려고 한다. ··· 람다식을 사용하면 함수를 메서드 인수로 처리하거나 코드를 데이터로 처리할 수 있다. "
···
Lambda expressions let you express instances of single-method classes more compactly.
" 람다식은 하나의 추상 메서드를 가진 클래스의 인스턴스를 보다 간결하게 표현하게 해줌 "
자바 튜토리얼 공식문서의 람다 표현식 파트를 시작하는 글이다. Java 8 이전에는 인터페이스나 추상 클래스를 구현할 때에 주로 익명 클래스가 사용되었다. 코드 가독성을 위해 도입된 익명 클래스를 함수형 프로그래밍을 위해 더 간소화하여 표현할 수 있는 방법이 람다식이다.
람다식은 익명 클래스의 대안으로 자주 사용되지만 분명히 다른 점이 있다. 익명 클래스는 새로운 클래스 인스턴스를 생성하지만, 람다식은 함수형 인터페이스의 인스턴스로 컴파일되어 별도의 새로운 클래스 파일이 생성되지 않고 메서드를 생성한다. 따라서 this 바인딩도 달라지는데, 익명 클래스 this는 해당 익명 클래스 자체를 가리키지만 람다식 내부의 this는 람다식을 포함하고 있는 외부 클래스를 가리킨다.
즉, 익명 클래스는 클래스 인스턴스를 생성하고 그 안에 메서드를 만드는 방법으로 객체지향 프로그래밍의 개념을 따르고 있는 반면에 람다식은 함수형 프로그래밍의 개념을 반영해 코드 자체를 데이터로 취급하여 메서드처럼 사용할 수 있게 한다.
람다식의 기본문법
메서드에서 이름과 반환 타입을 제거하고 매개변수(parameter) 선언부와 { } 사이에 '->'를 추가한다.
(매개변수) -> {실행문;}
// 익명함수
int sum (int a, int b) {
return a + b;
}
// 람다식
(int a, int b) -> {
return a + b;
}
- 매개변수 타입을 생략할 수 있다. (추론 가능한)
- 매개변수가 하나만 있을 경우 괄호( )를 생략할 수 있다.
- 타입을 명시할 경우 매개변수가 하나여도 괄호를 생략할 수 없다.
(a) -> a + a;
a -> a + a; // 생략(O)
(int a) -> a + a; // (O)
int a -> a + a; // error(X) (타입 명시)
- 중괄호{ }에 하나의 실행문만 있을 경우 중괄호{ }를 생략할 수 있다.
- 중괄호{ }에 하나의 return문이 존재할 경우에는 중괄호를 생략할 수 없다.
- 그러나 return과 중괄호 { }를 모두 생략하는 것은 가능하다.
- 중괄호{ } 생략 시 세미콜론(;)도 사용하지 않아야 함에 주의한다.
// 람다식
(int a, int b) -> {
return a + b;
}
// 매개변수 타입 자동 추론, { }생략, return 생략, ;생략
(a, b) -> a + b
메소드 레퍼런스(Method Reference)
람다식을 사용할 때 메소드 레퍼런스를 이용해 메소드 호출이나 참조를 대체하여 코드를 더 간결하게 만들 수 있다.
<람다식>
List<String> words = Arrays.asList("apple", "banana", "orange");
words.forEach(str -> System.out.println(str.toUpperCase()));
<메소드 레퍼런스>
words.forEach(String::toUpperCase); // toUpperCase() 메소드 호출
'인프런 워밍업 클럽 1기 - 백엔드' 카테고리의 다른 글
| 6일차 과제 - Controller - Service - Repository 계층 분리 (0) | 2024.05.13 |
|---|---|
| 5일차 과제 - 클린코드 (0) | 2024.05.09 |
| 4일차 과제 - API 만들기 2 (0) | 2024.05.07 |
| 2일차 과제 - api 만들기 (0) | 2024.05.01 |
| 1일차 과제 - 어노테이션(서버 개발을 위한 환경설정 및 네트워크 기초) (0) | 2024.04.29 |