작년부터 최대한 자바 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(1, 2, new FuncInter() { @Override public int action(int x, int y) { return x + y; } }); System.out.println("fc1 = " + fc1.calc()); FuncClass fc2 = new FuncClass(1, 2, (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
'Tech' 카테고리의 다른 글
Akka, dependency (0) | 2017.04.08 |
---|---|
리액트와 하이브리드 랜더링 (0) | 2017.04.06 |
oracle-jdk-8 설치 (0) | 2017.03.10 |
우분투에 젠킨스 설치 'Jenkins_home' 이슈 트랙킹 (0) | 2017.03.10 |
https 설정하기 -1, 기본적인 톰켓에서의 https 설정 (0) | 2017.03.09 |