ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 챕터[3] 람다
    모던자바인액션 2020. 10. 21. 15:55

    서론

    람다가 무엇인지 람다는 어떤 조건에 사용할 수 있는지 등을 설명하는 챕터이다.


    람다란?

    람다란 (파라미터) -> {바디} 로 구현되어있으며, 메서드를 전달할 수 있는 익명 함수를 단순화한 것

     

    어디에 람다를 사용하는지?

    1. 함수형 인터페이스

     

    • 함수형 인터페이스를 인수로 받는 메서드에만 람다 표현식을 사용할 수 있는지는 추후 20, 21 챕터에 설명예정

    • 함수 디스크립터 : 함수형 인터페이스의 추상 메서드 시그니처는 람다 표현식의 시그니처를 가리킨다. 람다 표현식의 시그니처를 서술하는 메서드를 함수 디스크립터라고 부른다.

    실행 어라운드 패턴

    • 자원 처리에 사용하는 순환 패턴은 자원을 열고, 처리한 다음에, 자원을 닫는 순서로 이루어진다. 설정과 정리 과정 은 대부분 비슷하다. 즉 실제 자원을 처리하는 코드를 설정과 정리 두 과정이 둘러싸는 형태를 갖는다. 아래의 그림처럼 이루어진걸 실행 어라운드 패턴이라 부른다. (try-with-resources)

    함수형 인터페이스

    1. 하나의 추상 메서드만 존재하는 인터페이스이다. ex) Predicate의 test 메서드, Runnable의 run 메서드

    2. 함수형 인터페이스를 지정하는 어노테이션으로 @FunctionalInterface 가 존재한다. 단 어노테이션 사용한 인터페이스가 함수형 인터페이스가 아닌경우 컴파일 시 에러가 발생한다.

    박싱, 언박싱

    기본형을 참조형으로 변환하는게 박싱

    참조형을 기본형으로 변환하는걸 언박싱 이라한다.

     

     

    형식 검사, 형식 추론, 제약

    람다 표현식 자체에는 어떤 정보가 포함되어있는지 알 수 없으므로 람다의 실제 형식을 파악하고 있어야 한다.

    1. 람다가 사용돠는 콘텍스트를 이용해서 람다의 형식을 추론할 수 있다. (ex)람다가 전달될 메서드 파라미터나 람다가 할당되는 변수 등)어떤 콘텍스트에서 기대되는 람다 표현식의 형식을 대상 형식이라고 부른다. (Predicate, Runnable)

    2. 람다 표현식이 사용된 콘텍스트(대상 형식)를 이용해서 람다 표현식과 관련된 함수형 인터페이스를 추론한다. 즉 대상 형식을 이용해서 함수 디스크립터를 알 수 있으므로 컴파일러는 람다의 시그니처도 추론할 수 있다. 결과적으로 컴파일러는 람다 표현식의 파라미터 형식에 접근할 수 있으므로 람다 문법에서 이를 생략할 수 있다. ( 자바 컴파일러가 형식으로 추론하여 타입을 명시적으로 표현하지 않아도 된다.)

    3. 지역변수 사용과 제약 

      1. 명시적으로 상수(final)로 선언되있거나 실질적 final처럼 사용되는 변수만 사용할 수 있다.

      2. 지역변수는 

    지금까지 살펴본 람다 표현식은 인수를 자신의 바디 안에서만 사용했다. 하지만 람다 표현식에서 익명 함수가 하는 것처럼 자유변수(파라미터로 넘겨진 변수가 아닌 외부에서 정의 된 변수)를 활용할 수 있다.

    이걸 람다 캡처링 이라고 부른다


    람다같은 경우 아래와 같은방법으로도 사용이가능하다

    (List<String> list) -> list.isEmpty() // boolean 사용
    () ->new Apple(10) // 이런식으로 객체 생성도 가능하다.
    (Apple a) -> System.out.println(a.getWeight()) // 객체에서 소비
    (String s) -> s.length() // 객체에서 선택/추출
    // 람다 캡처링 예제
    Integer portNum = 8080;
    Runnable runnable = () -> System.out.println(portNum);
    // 여기서 들어가는 포트번호는 final로 선언이 되거나
    // final 처럼 한번만 선언된 경우만 넣고 사용 할 수 있다.

     

    그나마 git : github.com/hodolee246/ModernJavaStudygithub.com/hodolee246/ModernJavaStudy/blob/master/src/main/java/com/example/modernjava/ch2/ExamPredicate.javagithub.com/hodolee246/ModernJavaStudy/blob/master/src/main/java/com/example/modernjava/ch3/lamdaExcam.java

    '모던자바인액션' 카테고리의 다른 글

    챕터[7] 스트림 병렬화  (0) 2020.10.21
    챕터[6] 스트림 그룹화  (0) 2020.10.21
    챕터[5] 스트림 데이터 수집  (0) 2020.10.21
    챕터[4] 스트림  (0) 2020.10.21
    챕터[2] 동작 파라미터화  (0) 2020.10.21

    댓글

Designed by Tistory.