kok202
[2019.02.12] 자바 람다식

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