[모던 자바 인 액션] 스터디 1장 2장 정리

책을 읽으면서, 스터디 하면서 중요하다고 생각되는 내용이나 질문을 정리합니다.


동작 파라미터화

동작 파라미터화란? 아직은 어떻게 실행할 것인지 결정하지 않은 코드 블록을 의미한다. 코드 블록은 나중에 프로그램에서 호출한다. 즉, 코드 블록의 실행은 나중으로 미뤄진다. 메서드를 다른 메서드의 인자로 넘겨주는 것이다. 실행과 동작의 관심사를 분리한 것이다. 전략패턴이 동작 파라미터화의 한 방법이다.

전략 디자인 패턴은 각 알고리즘(전략)을 캡슐화하는 알고리즘 패밀리를 정의해둔 다음에 런타임에 알고리즘을 선택하는 기법이다. 메서드가 다양한 동작(전략)을 받아서 내부적으로 다양한 동작을 수행할 수 있다.

일급 함수? 일급 객체?

일급 객체란 사용할 때 다른 요소들과 아무런 차별이 없는 것을 의미한다.

  1. 변수나 데이터에 담을 수 있다
  2. 함수의 파라미터로 전달 할 수 있다
  3. 함수의 리턴값으로 사용할 수 있다

(부록) 함수랑 메서드 차이?

사이드 이펙트가 있냐 없냐로 구분 할 수 있다. 사이드 이펙트가 없으면 함수, 정적 메서드라 본다.

디폴트 메서드란?

인퍼페이스에 있는 구현된 메서드다. 디폴트 메서드는 인터페이스에 작성하는데, 인터페이스에 구현 메소드를 작성하는 이유는 뭘까? 공통의 의미다. 모든 인터페이스 구현체에 필요한 공통 메서드가 있고, 구현체마다 똑같이 구현되어있다고 한다면 변경에 취약하다. 그러나 인터페이스에 구현 메소드가 있다면, 인터페이스를 구현한 모든 구현체를 변경하지 않고 인터페이스의 디폴트 메서드만 수정하면 되기 때문에, 기존 코드를 건드리지 않고도 원래의 인터페이스 설계를 자유롭게 확장할 수 있다.

Stream() vs ParallelStream()

병렬 실행하기 때문에 ParallelStream()이 더 빠른거 아냐? 생각할 수 있지만, 아니다. 각 상황에 맞게 사용해야한다. 병력적으로 사용하려면 그만큼 자원을 많이 써야한다. 백그라운드에서 여러 스레드가 데이터 처리를 동시에 하는데, 이때 스레드 간의 동기화 스케줄링 및 관리에 따른 오버헤드가 발생할 수 있어 실질적 이점보다 더 큰 성능 저하를 야기할 수 있다. 병렬 스트림이 좋은 성능을 내는 자료구조들이 있다.

As a rule, performance gains from parallelism are best on streams over ArrayList, HashMap, HashSet, and ConcurrentHashMap instances; arrays; int ranges; and long ranges. What these data structures have in common is that they can all be accurately and cheaply split into subranges of any desired sizes, which makes it easy to divide work among parallel threads. The abstraction used by the streams library to perform this task is the spliterator, which is returned by the spliterator method on Stream and Iterable.

The best terminal operations for parallelism are reductions, where all of the elements emerging from the pipeline are combined using one of Stream’s reduce methods, or prepackaged reductions such as min, max, count, and sum. The short- circuiting operations anyMatch, allMatch, and noneMatch are also amenable to parallelism.

  • Effective Java -

p80 Quiz 2-2 익명 클래스 문제

public class MeaningOfThis {
    public final int value = 4;
    public void doIt() {
        int value = 6;
        Runnable r = new Runnable() {
            public final int value = 5;
            public void run(){
                int value = 10;
                System.out.println(this.value);
            }
        };
        r.run();
    }
    public static void main(String...args) {
        MeaningOfThis m = new MeaningOfThis();
        m.doIt();
    }
}

main 실행 결과는 5가 된다. 그 이유는 코드를 살펴보면 m.doIt()을 실행하면 제일 밑에 r.run(); 코드가 있다. 결국, 이 코드를 실행한다. 그럼 다시 rrun() 코드를 보면 System.out.println(this.value); this의 value를 출력한다. 자바에서 this는 인스턴스 자기 자신을 가리키는 키워드이다. 즉, 여기서 this는 Runnable을 참조하기 때문에 public final int value = 5; 5를 출력하게 된다.

results matching ""

    No results matching ""