본문 바로가기

Reading

(65)
[Effective-Java] Item 49. 매개변수가 유효한지 검사하라 메소드와 생성자의 입력 매개변수 값에 제약이 있다면 반드시 문서화해야 하고, 메소드 몸체 시작 전 검사해야한다. 매개변수 검사를 제대로 하지 못하면 다음과 같은 문제가 있다. 메소드가 수행되며 모호한 예외를 던지며 실패한다. 메소드는 수행되며 잘못된 결과를 반환한다 메소드가 수행되며 반환된 잘못된 결과가 미래 알 수 없는 시점에 메소드와 관련없는 오류를 발생시킨다. 즉, 매개변수 검사에 실패하면 실패 원자성(failure atomicity)을 어기는 결과가 발생한다. *실패 원자성(failure atomicity): 호출된 메소드가 실패하더라도 해당 객체는 메소드 호출 전 상태를 가져야하는 성질(item76) 잘못된 매개변수의 검사 예외 public과 protected 메소드는 매개변수 값이 잘못됐을 때..
[Effective-Java] Item 48. 스트림 병렬화는 주의해서 적용하라 자바 7부터 고성능 병렬 분해(parallel decom-position) 프레임 워크인 포크-조인(fork-join) 패키지를 추가했다. 포크-조인(fork-join) : 병렬화 가능한 작업을 나누고(포크) 끝난 작업을 합친다(조인) [참고] --> 작업을 나누는게 Spliterator였다! 그리고 자바 8부터 parallel 메소드만 한 번 호출하면 파이프라인을 병렬 실행할 수 있는 스트림을 지원했다. 동시성 프로그래밍은 안정성(safety)과 응답 가능(liveness) 상태를 유지하기 위해 노력해야한다. 메르센 소수 병렬 파이프라인 스트림을 병렬처리한다고 무조건 속도가 올라가거나 성능이 향상하는 것은 아니다. 아이템45에서 썼던 메르센 소수를 병렬로 사용해보자. 그냥 .parallel()만 추가로..
[Effective-Java] Item 47. 반환 타입으로는 스트림보다 컬렉션이 낫다 자바 7까지는 반환타입으로 다음과 같이 사용했다. Iterable Interface: for-each(enhance) 문에서만 쓰이거나 반환된 원소 시퀀스가 일부 Collection 메소드를 구현할 수 없을 때 Collection 인터페이스를 활용할 상황이 없거나, 일부 메소드를 구현할 수 없다면 더 나은 선택지?란 것 같다. ex) contains(Object) Array: 반환 원소들이 Primitive Type이거나 성능에 민감한 상황 Collection Interface: 위 상황들을 제외한 기본적인 상황 그리고 자바 8 이후 Stream도 등장하면서 선택지는 더 늘어났다. Collection이 최적의 반환 타입인 이유 Stream은 반복(iteration)을 지원하지 않기에, 스트림과 반복을 알..
[Effective-Java] Item 46. 스트림에서는 부작용 없는 함수를 사용하라 스트림 패러다임 스트림은 또 하나의 API가 아니라 단지 함수형 프로그래밍에 기초한 패러다임이고, 핵심은 계산을 일련의 변환으로 재구성 하는 부분이다. 각 변환 단계는 가능한 이전 단계의 결과를 받아 처리하는 순수 함수여야 한다. 이렇게 하려면 중간 단계든 종단 단계든 스트림 연산에 건네는 함수 객체는 모두 부작용(side effect)이 없어야한다. 순수함수: 오직 입력만이 결과에 영향을 주는 함수, 다른 가변 상태를 참조하지 않고 함수 스스로도 다른 상태를 변경하지 않는다. --> 즉, 외부의 상태를 변경하거나 함수로 들어온 인자의 상태를 변경하면 안되고 동일한 인자일 때 항상 같은 결과가 나와야한다. 아래 코드는 텍스트 파일에서 단어별 수를 세어 빈도표로 만드는 일을 한다. Map freq = ne..