[Modern Java] 동작 파라미터화, 익명 클래스, 람다 표현식

Sohyun Liiim·2021년 1월 1일
0

Modern Java

목록 보기
2/2

동작 파라미터화

  • 메서드가 받게 될 다양한 동작을 추상화해, 내부적으로(=알아서) 수행하도록 하는 것

  • 어떻게 실행할 것인지 아직 결정하지 않은 코드 블록 (→ 코드 블록은 나중에 실행)

  • 장점 : 다양하게 변화하는 클라이언트의 요구사항에 유연하게 대응 가능

    • 이를 전략 디자인 패턴 이라고 한다.
      (서버 실행 중에 알고리즘 전략을 유연하게 선택하도록 하는 패턴)
  • 단점 : 여러 클래스를 구현해 인스턴스화하는 과정 필요 → 익명 클래스 를 사용해 개선!

익명 클래스

  • 이름이 없는 클래스

  • 블록 내부에 선언되어야 익명처리를 할 수 있다.

  • 장점 : 클래스 선언과 인스턴스화를 동시해 할 수 있으므로 필요한 구현을 즉시 사용 가능

  • 단점 : 코드가 장황해져 구현 및 유지보수가 비효율적 → 람다 표현식 를 사용해 개선!

람다 표현식

  • 메서드로 전달할 수 있는(=call back) 익명 함수(anonymous function)을 단순화한 것

  • 람다의 특징

    • 보통의 메서드와 달리 이름이 없으므로 익명 이라고 표현한다.
    • 특정 클래스에 종속되지 않으므로 함수 라고 부른다.
    • 파라미터, 화살표, 바디(람다의 return값에 해당), 세미콜론(;)으로 이루어진다.
    • 람다 표현식은 메서드의 파라미터로 전달하거나, 변수로 저장할 수 있다.
    • 람다를 사용하면 익명 클래스보다 간결하게 코드를 구현할 수 있다.
  • 람다는 함수형 인터페이스에서 사용할 수 있다.

    • 함수형 인터페이스 : 오직 하나의 추상 메서드만을 정의하는 인터페이스

    • 람다 표현식으로 함수형 인터페이스 구현을 직접 전달할 수 있으므로,
      전체 표현식을 함수형 인터페이스의 인스턴스로 취급할 수 있다.

    • 대표적인 함수형 인터페이스와 그에 대응하는 함수형 디스크립터

      함수형 인터페이스함수 디스크립터추상 메서드명비고
      Function<T, R>파라미터 : O
      리턴값 : O
      apply
      Predicate파라미터 : O
      리턴값 : O (boolean type)
      testFuction의 한 종류
      Consumer파라미터 : O
      리턴값 : X
      accept
      Supplier파라미터 : X
      리턴값 : O
      get
      Runnable파라미터 : X
      리턴값 : X
      run자연계에 존재하지 않음

  • 람다 캡쳐링 : 자유 변수(파라미터 외부에서 정의된 변수)를 활용하는 것

  • 람다는 인스턴스 변수와 static 변수를 자신의 바디에서 참조(=캡쳐)할 수 있다.

    • 람다, 익명 클래스는 자신의 외부 영역의 변수에 접근 가능하다.
    • 람다, 익명 클래스는 람다가 정의된 메서드의 지역 변수 값은 바꿀 수 없다.
      (따라서 지역 변수의 값은 final로 선언하거나, final처럼 변수의 값이 바뀌면 안됨)

메서드 참조

  • 특정 람다 표현식을 축약한 것

  • 기존의 메서드 정의를 재활용해서 람다처럼 전달할 수 있다. (Customize 가능)

  • 간결하게 표현할 수 있어 가독성이 좋다.

  • 메서드명 앞에 구분자(::)를 붙여서 표현한다.

profile
새싹개발자를 꿈꾸고 있어요🌱

0개의 댓글