본문 바로가기
개발/자바

자바 (람다식, Lambda Expression)

by EPdev 2020. 5. 8.
728x90

*** 이 개념은 "이것이 자바다. 신용권의 Java 프로그래밍 정복" 을 보고 정리한 것입니다. ***

 

람다식(Lambda Expression)이란 ?

 

역사를 잠깐 보자면... 이전에 함수적 프로그래밍 언어들이 있었는데 학계를 제외하고는 큰 호응을 얻지 못했다고 한다.

그러다가 최근 들어 함수적 프로그래밍이 다시 부각되고 있는데 이유는 병렬 처리와 이벤트 지향 프로그래밍에 적합하기 때문이라고 한다.

그래서 객체 지향 프로그래밍과 함수적 프로그래밍을 혼합해 더욱 효율적인 프로그래밍이 될 수 있도록 개발 언어가 변하고 있다고 한다.

 

자바는 8부터 람다식을 지원하면서 기존 코드에서 변화가 많이 생겼다.

람다식은 수학자 알론조 처치(Alonzo Church) 가 발표한 람다 계산법에서 사용된 식으로, 이를 제자 존 메카시(John McCarthy)가 프로그래밍 언어에 도입했다.

 

람다식은 익명 함수(anonymous function)를 생성하기 위한 식으로 객체 지향 언어보다는 함수 지향 언어에 가깝다.

자바에서 람다식을 수용한 이유는 1. 코드가 매우 간결해지고, 2. 컬렉션의 요소를 필터링하거나 매핑해서 원하는 결과를 쉽게 집계할 수 있기 때문.

 

람다식의 형태는 매개 변수를 가진 코드 블록이지만, 런타임 시에는 익명 구현 객체를 생성한다.

[ 람다식 -> 매개 변수를 가진 코드 블럭 -> 익명 구현 객체 ]

예를 들어, Runnable 인터페이스의 익명 구현 객체를 생성을 비교해보면

// 전형적인 방법
Runnable runnable = new Runnable(){
	public void run() { ... }
};

// 람다식
Runnable runnable = () -> { ... };

람다식은 (매개변수) -> {실행코드} 형태로 작성되는데, 마치 함수 정의 형태를 띠고 있지만 런타임 시에 인터페이스의 익명 구현 객체로 생성된다.

 

람다식의 기본 문법

//(타입 매개변수, ...) -> { 실행문; }

// 기본적으로
(int a) -> { System.out.println(a); }

// 매개 변수 타입은 자동으로 인식될 수 있기 때문에 생략 가능
(a) -> { System.out.println(a); }

// 하나의 매개변수만 있다면 () 생략 가능, 하나의 실행문만 있다면 {} 생략 가능
a -> System.out.println(a);

// 매개변수가 없다면 ()를 사용
() -> { 실행문; ... }

// 결과를 반환하고 싶다면
(x, y) -> { return x + y; }

// {} 안에 return 문만 있다면 다음과 같이
(x, y) -> x + y

타겟 타입

람다식의 형태는 매개 변수를 가진 코드 블록이기에 마치 자바의 메소드 처럼 보인다. 자바는 메소드를 단독으로 선언하는게 아니라 항상 클래스의 구성 멤버로 선언하기 때문에 람다식은 단순히 메소드를 선언하는 게 아니라 메소드를 가진 객체를 생성하는 것이다.

[ 인터페이스 변수 = 람다식; ]

여기서 알 수 있는 점은 람다식이 인터페이스의 익명 구현 객체를 생성한다는 것이다.

인터페이스는 직접 객체화할 수 없기 때문에 구현 클래스가 필요한데, 람다식은 익명 구현 클래스를 생성하고 객체화한다.

람다식은 대입될 인터페이스의 종류에 따라 작성법이 달라지기 때문에 람다식이 대입될 인터페이스를 람다식의 타겟 타입(target type) 이라고 한다.

 

함수적 인터페이스

모든 인터페이스를 람다식의 타겟 타입으로 사용할 수는 없다. 람다식이 하나의 메소드를 정의하기 때문에 인터페이스도 하나의 추상 메소드를 가진 것만 타겟 타입이 될 수 있다. 이러한 인터페이스를 함수적 인터페이스(Functinoal interface)라고 한다. 함수적 인터페이스를 만족하는지 컴파일러가 체킹해주는 기능이 있는데 @FunctionalInterface 를 어노테이션으로 붙여주면 된다. (선택사항)

 

이러한 람다식에는 메소드가 나뉘는 것처럼 부류가 나뉜다.

매개변수 X, 리턴값 X

매개변수 O, 리턴값 X

매개변수 X, 리턴값 O

매개변수 O, 리턴값 O

 

코드는 추후에 다시 정리하겠다.

728x90

'개발 > 자바' 카테고리의 다른 글

쓰레드 (Thread)  (0) 2020.05.22
인터페이스와 추상클래스 - Interface and Abstract Class  (0) 2020.05.22
클래스 (Class)  (0) 2020.05.21
JavaFX  (0) 2020.05.17
자바 (제네릭, Generic)  (0) 2020.05.08

댓글