[자바 인 액션] Ch 2

Ericamoyed·2021년 4월 5일
0

자바인액션

목록 보기
2/6

동적 파라미터화 (Behavior parameterization)

  • 아직은 어떻게 실행할 것인지 결정하지 않은 코드 블록
  • 나중에 실행될 메서드의 인수로 코드블록을 전달할 수 있다
  • Ch1에서 언급한 바와 같이, 상위 Predicate을 두고 해당 Predicate을 상속하게 filtering method를 정의한 후에 메소드의 parameter로 filtering method를 넘겨주는 형태
    • 이것이 바로 전략 디자인 패턴 (Strategy Design Pattern)
    • 각 알고리즘을 캡슐화하는 알고리즘 패밀리를 정의해둔 다음, 런타임에 알고리즘을 선택하는 기법
  • 하지만 이를 사용하게 되면 쓸데없는 코드가 늘어나는데 자바8은 람다 표현식으로 이 문제를 해결
    • 왜 쓸데없는 코드가 늘어나나?
    • 안타깝게도 메서드는 객체만 인수로 받기 때문에.. test 메서드를 Predicate 객체로 감싸서 전달해야했다
    • 하지만 람다를 사용하면 객체로 감싸지 않고, 클래스를 정의하지 않고도 메서드의 인수로 사용할 수 있다
  • 매번 구현하기 귀찮았던 클래스 -> 람다로의 변화과정 사이에는 익명 클래스가 있다
    • 자바의 지역 클래스 (local class, 블록 내부에 선언된 클래스)와 비슷한 개념
    • 익명 클래스 예시
    • Runnable은 인터페이스이지만 객체화 되는 것처럼 보임
  Thread t = new Thread(new Runnable() {
    public void run() {
    	System.cout.println("hihi");
    }
  });
    • 이 경우 살펴보면 인터페이스 자체로 객체화가 되는 것처럼 보이지만, 사실은 implement가 포함된 익명 메서드인데 anonymous라 생략되어 그렇게 보이는 것 뿐임
  • 하지만 람다 표현식을 사용하면? 익명 클래스도 만들 필요가 없다!

  • 동작 파라미터화 예시 (솔직히 얘기하면 전략 디자인 패턴의 예시라고 할 수 있겠다)

    • Comparator(정렬에 사용)
    • Runnable
      • 자바 스레드를 이용해서 병렬로 코드 블록 실행 가능
      • 여러 스레드가 각자 다른 코드를 실행하게 할 때, 나중에 실행할 코드를 구현할 때 해당 인터페이스를 사용
    • Callable
      • ExecutorService 인터페이스는 태스크 제출과 실행 과정의 연관성을 끊어줌 (비동기)
      • 태스크를 스레드 풀로 보내고, 결과를 Future로 저장하는데,
      • Callable 인터페이스를 이용해 완료된 작업의 결과를 반환하는 태스크를 만든다
profile
꿈많은 개발자, 일상 기록을 곁들인

0개의 댓글