자바

자바 람다식 java 기본 문법과 함수적 인터페이스

알통몬_ 2017. 3. 19. 15:58
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 

이번 포스팅부터는 람다식에 대해 공부하겠습니다.

자바8로 바뀌면서부터 함수적 프로그래밍을 위해서 람다식을 지원했습니다.

따라서 코드 패턴이 많이 달라졌는데요.

람다식을 함수지향 언어에 가깝고 익명 함수 생성을 위한 식입니다.

자바 코드가 간결해지고, 컬렉션의 요소 필터링 or 매핑해서 원하는 결과 집계를 쉽게 할 수 있어서

자바에서 람다식을 수용했습니다.


예제를 보겠습니다.

Runnable runnable = new Runnable() {

    public void run() { ... }

} ;

이러한 익명 구현 객체를 람디식을 사용하면

==> 

Runnable runnable = () -> { ... };

처럼 간결하게 표현할 수 있습니다.


람다식의 형태

(매개변수) -> { 실행 코드}


다음으로 람다식의 기본 문법에 대해 보겠습니다.

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

(...) 는 오른쪽의 중괄호 블록을 실행하기 위해 필요한 값들을 제공하는 역할

매개 변수 이름의 경우는 개발자가 임의로 주면 됩니다.

' ->'  기호는 매개 변수를 이용해 중괄호 블록을 실행한다는 뜻


이제 람다식 예제를 보겠습니다.

1. 

(int num) -> { System.out.print( num ); }

2. 매개 변수 타입은 런타임 시 대입 되는 값에 따라 자동 인식 가능하므로

람다식에서는 일반적으로 매개 변수 타입을 선언하지 않아요.

(num) -> { System.out.print( num ); }

3. 매개 변수가 하나면 ()를 생략할 수 있고, 실행문이 하나라면 {}를 생략할 수 있습니다.

num -> System.out.print( num );

4. 또한 매개변수가 없을 경우는 ()를 생략할 수 없습니다.

() -> {실행문;}

5. 그리고 {}를 실행하고 리턴값이 있다면 아래처럼 할 수 있습니다.

(x, y) -> { return x + y; };

==> {} 안에 리턴문만 있으면 아래처럼 사용하는 것이 정석입니다.

(x, y) -> x + y 



다음으로 함수적 인터페이스와 타겟 타입에 대해 공부하겠습니다.

람다식을 보면 매개 변수를 가진 코드 블록이기 때문에 

메소드를 선언하는 것처럼 보입니다.

람다식은 단순히 메소드를 선언하는 것이 아니고 

메소드를 가지고 있는 객체를 생성해 냅니다.

인터페이스 타입 = 람다식;

람다식은 인터페이스 타입에 대입됨

==>> 람다식은 인터페이스의 익명 구현 객체를 생성한다는 의미

람다식이 인터페이스의 익명 구현 클래스를 생성하고 객체화

대입될 인터페이스 종류에 따라 작성방법이 달라지므로

람다식이 대입될 인터페이스를 람다식의 타겟 타입이라고함.


함수적 인터페이스란??

@FunctionalInteface)

=> 모든 인터페이스가 람다식의 타겟타입이 될 수는 없음.

람다식은 하나의 메소드를 정의하므로 

두개 이상의 추상 메소드가 선언된 인터페이스의 경우

람다식의 타겟타입이 될 수 없습니다.

추상 메소드가 하나만 선언된 인터페이스만

람다식의 타겟 타입이 될 수 있는데

이런 인터페이스를 함수적 인터페이스라고 함.


함수적 인터페이스 작성 시 추상 메소드가

두 개 이상 생성되지 않도록 컴파일러가 검사해주는 기능이 있는데

@FunctionalInterface 어노테이션을 인터페이스 선언 시에 붙여주면 됩니다.


어노테이션이 있는 인터페이스에서 두 개 이상의 추상 메소드가 선언되어 있다면

컴파일 오류를 발생시킵니다.


ex)

@FunctionalInterface

public interface FInterface {

    public void method1();

    public void method2(); // 

}  

=> 이 경우 컴파일 에러가 발생


그렇다고 꼭 함수적 인터페이스를 만들 때 어노테이션을 붙일 필요는 없습니다.

하지만 실수방지를 위해서는 어노테이션을 붙여주는 것이 좋습니다.


다음 포스팅에서 이어서 공부하겠습니다.

이상입니다.

반응형