ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java-21] 화살표 연산자 (->) 그리고 람다 원리
    Java 2020. 11. 27. 14:42

    Java lambda expression

     

    우리가 -> 를 처음보면 당황할수 밖에 없다. 기본 개념을 모르고 접근하면, 요 안에서 무슨일을 하는지 도저히  알 수가 없기 때문이다. 이 포스팅은 클래스, 인터페이스를 알고 있다는 전제하에 얘기를 한다. 만약에 클래스와 인터페이스에 대한 개념이 부족하다면, 꼭 그 부분을 보고 와야 한다.

     

    1. 람다 이전의 자바

     

    (함수형) Interface

     

    interface는 말그대로 껍대기로만 생각을 하자, 기본적으로 interface를 사용하면, 보통은 그 안에다가 메소드 이름과 파타미터의 타입만 정의 한다. 말 그대로 interface의 역할만 하는 것이다. 

     

    물론 static과 default 키워드를 사용하면 Interface 안에서도 메소드 구현이 가능하지만, 그 부분까지 얘기하면 너무 삼천포로 빠진다. 

     

     

    여기서 interface에 정의된 printInt를 사용할 수 없다. 왜냐면 구현을 하지않고

    추상 메소드만 정의 했기 때문이다.

     

    추상메소드 사용하기

     

    - class로 구현체 만들기

    - 메소드 내에서 구현체 만들기 (내부 익명 클래스)

     

    람다는 메소드 내에서 저런 내부익명 클래스를 통해서 만든 구현체의 단점을 보안할 수 있다. 예를들어서, 정말 간단한 한줄짜라 System.out.println(x) ; 를 구현하기 위해서 대충 6줄이 추가되고, 가독성도 떨어진다. 이래서 자바는 자바 8부터 람다를 받아들였다. 

     

    - 람다를 이용한 구현체 만들기

     

    이렇게 한줄로 작성이 가능하다. 그럼 이런 생각을 할 수 있다. 

     

     

    어떻게 람다가 printInt()라는 메소드를 알고 구현한거야?

     

    다른 메소드를 구현할 수 있지않나?

     

    @FunctionalInterface 와 함수형 인터페이스

     

    우리가 interface를 선얼 할 때,

    다음과 같이 @FunctionalInterface 를 어노테이션에 붙히면 실질적으로 interface에는 추상 메소드 하나만 정의할 수 있다. 만약 2개를 정의하려 한다면,

    다음과 같이 @FunctionalInterface에서 에러를 뱉는다.

     

    @FunctionalInterface 를 제거하면?

     

    이렇게 람다를 구현부에서 에러를 뱉는다. 

    이게 사실 함수형 인터페이스, 의 특징인데, 함수 자체를 입급 객체로 사용할 수 있다. 일급객체의 특징에는 여러가지가있는데, 메소드를 리턴한다던지 여러가지가 있다. 이 부분은 나중에 포스팅 하도록 하겠다. 

     

    메소드 하나 때문에 interface를 만들어야되?

     

    그렇지 않다. 실제로 이렇게 구현하지 않고, 자바에서 기본적으로 지원하는 Interfece를 사용하면 문제없이 사용할 수 있다.

     

    이렇게 여러가지 몇개가 있는데 이건 나중에 더 자세히 알아보도록 하자 : D

     

     

     

    댓글

Designed by Tistory.