Reference/Effective-Java

    [Effective-Java] Chapter8 #50. 적시에 방어적 복사본을 만들라

    📌 방어적 프로그래밍 💡 클라이언트가 우리의 불변식을 깨뜨리려 혈안이 되어 있다고 가정하고 방어적으로 프로그래밍하라. 자바로 작성한 클래스는 시스템의 다른 부분에서 무슨짓을 하든 그 불변식이 지켜진다. 하지만 악의적인 의도를 가지거나, 순전히 실수로 클래스를 오작동하도록 만들 수 있다. 📌 As-is. 불변식을 지키지 못한 클래스 public final class Period { private final Date start; private final Date end; /** * @param start 시작 시각 * @param end 종료 시각. 시작 시각보다 뒤여야 한다. * @throws IllegalArgumentException 시작 시각이 종료 시각보다 늦을 때 발생한다. * @throws Nu..

    [Effective-Java] Chapter8 #49. 매개변수가 유효한지 검사하라

    ✨ (오해 금지!) 메서드는 최대한 범용적으로 설계하라. 매개변수는 적을 수록 좋다. 📌 메서드와 생성자 일반적으로 메서드와 생성자 대부분은 입력 매개변수 값이 특정 조건을 만족하길 바란다. private List names; public String getNameOf(int index) { return names.get(index); } 인덱스 값은 음수여선 안 된다. 객체 참조는 null이 아니어야 한다. 위와 같은 제약은 반드시 문서화해야 하며, 메서드 몸체 시작 전에 검사(예외 처리)해야 한다. 💡 오류는 가능한 한 빨리 발생한 곳에서 잡아야 한다. 📌 매개변수 검증이 이루어지지 않은 경우 메서드가 수행되는 중간에 모호한 예외를 던지며 실패할 수 있다 더 나쁜 상황은 메서드가 잘 수행되지만 잘못된..

    [Effective-Java] Chapter7 #48. 스트림 병렬화는 주의해서 적용하라

    📌 동시성 프로그래밍 💡 동시성 프로그래밍에서는 안전성(safety)과 응답 가능(libeness) 상태를 유지해야 한다. 동시성 병렬성 동시에 실행되는 것처럼 보이는 것 실제로 동시에 여러 작업이 처리되는 것 싱글 코어에서 멀티 스레드 동작시키는 방식 멀티 코어에서 멀티 스레드 동작시키는 방식 한번에 많은 것을 처리 한번에 많은 일을 처리 논리적 개념 물리적 개념 주류 언어 중, 동시성 프로그래밍 측면에서 자바는 항상 앞서갔다. Java 7의 고성능 병렬 분해(parallel decom-position) 프레임워크인 포크-조인(fork-join) 패키지 Java 8의 Stream.parallel() 만으로 파이프라인 병렬 실행 ✒️ 포크-조인(Fork-Join) 프레임 워크 • 포크 단계에서 전체 데이..

    [Effective-Java] Chapter7 #47. 반환 타입으로는 스트림보다 컬렉션이 낫다

    💡 핵심 정리 • 원소 시퀀스 반환 메서드 작성 시, Stream 처리와 Iterable 처리 양쪽을 모두 만족시키려 노력하라. • Collection을 반환할 수 있다면 그렇게 하라. • 반환 전부터 이미 원소들을 Collection에 담아 관리하고 있거나, 하나 더 만들어도 될 정도로 작다면 표준 컬렉션(ex. ArrayList)에 담아 반환하라. • 그렇지 않다면 전용 Collection 구현을 고민하라. • 컬렉션 반환이 불가능하다면 Stream과 Iterable 중 더 자연스러운 것을 반환하라. 📌 Java 8 이전 원소 시퀀스, 일련의 원소를 반환하는 메서드 반환 타입은 Collection, Set, List 같은 Collection 인터페이스, 혹은 Iterable이나 배열을 사용했다. Co..