Tech

자바8과 람다에 대한 생각

glqdlt 2017. 3. 15. 11:18

작년부터 최대한 자바 8을 적극적으로 써보려고 노력해보았다.

기타 사정이 없으면 팀내에서도 적극적으로 자바8을 쓰자고 어필하고 노력했다.




FuncInter 라는 함수형 인터페이스를 작성한다.


1
2
3
4
5
6
7
@FunctionalInterface
public interface FuncInter {
    
    public int action(int x, int y);
 
}
 
cs


@FunctionalInterface  어노테이션을 달아준다. 


이 어노테이션은 필수는 아니다. 컴파일에서 에러를 마크해주기 위한 용도이다.

함수형 인터페이스는 0개 혹은 2개이상의 추상메소드를 가질 수 없다는 조건을 표기하기 위할 뿐이지,

꼭 써야하는 것은 아니고, 메소드가 하나인 경우는 생략해도 된다.


지금 예제에서는 action 이라는 메소드를 가지고 있다. 이 action 은 두 수 x 와 y 를 이용해서 무언가를 하려고 하는 구현되지 않은 메소드이다. 지금은 여기까지만 기억하자.







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class FuncClass {
 
    private FuncInter f;
    private int x;
    private int y;
 
    public FuncClass(int x, int y, FuncInter f) {
        this.f = f;
        this.x = x;
        this.y = y;
    }
 
    public int calc() {
 
        return f.action(x, y);
    }
 
}
 
cs



FuncClass 는 계산기라고 생각하면 된다.  calc 라는 메소드를 f.cation에서 구현된 계산기로서의 기능(action) 을 가지고 int 값을 반환해준다.





TestLam 은 실제 코드에서 사용될 법한 구문을 써보기 위한 테스트 클래스다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class TestLam {
 
    public static void main(String[] args) {
 
        FuncClass fc1 = new FuncClass(12new FuncInter() {
 
            @Override
            public int action(int x, int y) {
                return x + y;
            }
        });
 
        System.out.println("fc1 = " + fc1.calc());
 
        FuncClass fc2 = new FuncClass(12, (x, y) -> x * y);
 
        System.out.println("fc2 = " + fc2.calc());
 
    }
 
}
 
cs



보면 알겠지만 두 가지 방안으로 테스트를 했다.


첫번쨰 fc1 의 식은 익명함수를 구현하는 식으로 처리한 형태이고,


두번쨰 fc2 는 람다문법으로 작성한 형태이다.


fc2 의 예제에는 FuncClass에서 FuncInter 함수형인터페이스를 받을 때 action 이라는 키워드 자체가 기입되지 않는다. 여기서 FuncInter는 action 함수를 수단이라고 생각이 될 것이다. 그게 맞다.

자바에서는 람다식이 유연하게 대응할 수 있지 못해서 인터페이스를 통해서 조금 번거롭게 만든다.

결국 FuncInter는 action이라는 함수 그 자체라고 쉽게 생각해도 된다. (이해를 돕기 위한 것이지 정확한 것은 아니다. 익명클래스와 람다는 다르다고 한다.)

그렇다보니 fc2의 초기화 예제를 보듯 (x, y) -> x * y  라는 식으로 함수 자체를 선언해줄수있다.

이게 가능캐 해주는 것은 타입추론이라는 개념덕분에 가능하다고 한다.


참조 

https://www.slideshare.net/gyumee/java-8-lambda-35352385