2019. 2. 12. 10:20ㆍ[개발] 기록
자바 8버전부터 추가된 문법식
1. 자바는 매소드를 매개변수로 전달 할 수 없다.
2. 그래서 어떤 실행 메소드를 전달하길 원한다면 다음과 같이 전달해야한다.
public interface MethodDeliver{ public void execute(int a); } |
function1(new MethodDeliver{ @Override public void execute(int x){ System.out.println(String.valueOf)(x)); } } |
3. 이때 MethodDeliver 와 같이 메소드 전달을 위해 하나의 메소드만을 가지는 인터페이스를 함수형 인터페이스라고 부른다.
4. 그래서 나온게 람다식
5. (매개변수)->{ ... }
function1은 어차피 함수형 인터페이스 MethodDeliver를 매개변수로 받을 것이고 특정 타겟 메소드를 오버라이딩 할 것인게 정해져 있기때문에 기계적인 과정이다. 매개변수 이름만 적어도 타입에 맞춰 오버라이딩할 수 있는 함수형 인터페이스를 찾아 알아서 클래스를 만들어준다. 그렇기 때문에 함수형 인터페이스는 단 하나의 메소드만 가져야한다.
function1((x)->{ System.out.println(String.valueOf)(x)); } } |
6. 함수형 인터페이스가 단 하나의 메소드만을 가져야하므로 이를 체크하기 위해 만든 어노테이션이 있다.
@FunctionalInterface : 다른사람이 이 인터페이스를 착각하지 않고 함수를 추가하지 못하게 한다.
※ 요약하면 new 랑 똑같다. 그냥 간결화 시킨 것 뿐이다.
function1(new MethodDeliver{ @override public void execute(int x){ System.out.println(String.valueOf)(x)); } } |
function1((x)->{ System.out.println(String.valueOf)(x)); } } |
※ functional1이 또 다른 함수형 인터페이스를 이용하여 메소드 오버로딩을 하고 있을 경우를 생각해보자.
두 함수형 인터페이스의 단일 메소드가 매개 변수의 개수마저 동일하다면 컴파일러가 어떤 함수형 인터페이스를 쓸지 애매모호해진다.
그럴경우 매개변수 타입을 확실히 명시함으로서 해결 가능하다.
@FunctionalInterface public interface MethodDeliver1{ public void execute(int a); } @FunctionalInterface public interface MethodDeliver2{ public void executeString(String a); } | function1((int x)->{ System.out.println(String.valueOf)(x)); } } |
'[개발] 기록' 카테고리의 다른 글
[2019.02.21] 안드로이드 가이드 (0) | 2019.02.21 |
---|---|
[2019.02.12] RecyclerView 정리 (0) | 2019.02.12 |
[2019.02.11] RestAPI - GET (0) | 2019.02.11 |
[2019.01.22] 용어 (0) | 2019.01.22 |
[2019.01.22] npm, 크롬 디버깅 (0) | 2019.01.22 |