무지를 아는 것이 곧 앎의 시작

Effective Java 7

옵셔널(Optional) 클래스

아이템55. 옵셔널(Optional) 자바 8 이전 메서드가 특정 조건에서 값을 반환할 수 없을 때 취할 수 있는 선택지 예외를 던진다. null을 반환한다. 위 두 방법의 문제점. 예외는 예외적인 상황에만 사용해야 하며, 예외를 생성할 때 스택 추적 전체를 캡처하므로 비용도 만만치 않다. null을 반환하도록 메서드를 구현하면, NPE를 고려해서 클라이언트에서 항상 null체크를 해야함. NPE(NullPointerException)이 무서운 이유 근본적인 원인 즉, null을 반환한 부분에서 예외가 발생하는 것이 아니라, 원인과 상관 없는 부분에서 그 값을 사용하려할 때 예외가 발생하기 때문에 발생 시점을 추적하기 번거롭다. 지비8 이후 null처리의 구원자 Optional Optional은 null..

Java 2022.05.02

타입 안전 이종 컨테이너

아이템33 타입 안전 이종 컨테이너 타입 안전 이종 컨테이너란?🧐 컨테이너 Set, Map, List 등 여러 요소를 담는 컬렉션들과 ThreadLocal, AtomicReference등 단일원소를 담는 클래스들. 타입 안전 이종 컨테이너 여러 타입을 안전하게 담을 수 있는 컨테이너 List는 오직 Integer 타입만 담을 수 있음. 그럼 여러 타입을 담게 하려면 어떻게 해야할까? Object에 저장하기 public class ObjectContainer { public static void main(String[] args) { List container = new ArrayList(); container.add("1"); container.add(1); container.add(1L); contai..

Java 2022.04.05

멤버 클래스는 되도록 static으로

이펙티브 자바의 아이템24. '멤버 클래스는 되도록 static으로 만들라' 부분을 읽고 정리하는 포스팅.✍️ 중첩 클래스 다른 클래스 안에 정의된 클래스. 중첩 클래스는 자신을 감싼 바깥 클래스에서만 쓰여야 하며, 그 외에 쓰임새가 있다면 톱 레벨 클래스로 만들어야 한다. 중첩 클래스 종류 정적 멤버 클래스 멤버 클래스 익명 클래스 지역 클래스 정적 멤버 클래스를 제외하고는 모두 비정적이며 내부 클래스(inner class)라고 부른다. 정적 멤버 클래스와 비정적 멤버 클래스 일반 내부 클래스는 바깥 클래스의 private 멤버에 접근할 수 있지만, 정적 클래스는 바깥 클래스와 관계가 없어야 함으로 private 멤버에 접근할 수 없다. 정적 멤버 클래스 public class Membe..

Java 2022.03.30

Stream.forEach() vs for-each

이펙티브 자바의 아이템46. '스트림에서는 부작용 없는 함수를 사용하라' 부분을 읽고 정리하는 포스팅.✍️ 아이템46. 스트림에서는 부작용 없는 함수를 사용하라 스트림 패러다임의 핵심: 계산을 일련의 변환(transformation)으로 재구성 하는 부분. 이때 각 변환 단계는 이전 단계의 결과를 받아 처리하는 순수 함수인 것이 좋다. 순수 함수: 다른 가변 상태를 참조하지 않고, 함수 스스로도 다른 상태를 변경하지 않는다. 스트림 연산에 쓰이는 함수를 순수 함수로 만드려면? 중간 단계든 종단 단계든 스트림 연산에 건네는 함수 객체가 side effect가 없어야 한다. ex) 스트림 패러다임을 이해하지 못하고 사용한 코드 예시 Map freq = new HashMap(); try (Str..

Java 2022.03.14

표준 함수형 인터페이스

이펙티브 자바의 아이템44. '표준 함수형 인터페이스를 사용하라' 부분을 읽고 정리하는 포스팅.✍️ 아이템44 표준 함수형 인터페이스 정리 함수형 인터페이스란? 오직 하나의 추상 메소드만 저장하는 인터페이스. 필드 메소드를 파라미터화 할 수 있음. 많은 디폴트 메소드가 있더라도 추상 메소드가 오직 하나면 함수형 인터페이스다. @FunctionalInterface를 붙이지 않아도 추상 메서드가 한개면 함수형 인터페이스이다. ex) @FunctionalInterface public interface Predicate { boolean test(T t); // ... } 표준 함수형 인터페이스를 사용하라. 꼭 필요한게 아니라면, 굳이 함수형 인터페이스를 정의하지 말자. 필요한 용도에 맞는 게 있..

Java 2022.03.08

추상 클래스와 인터페이스의 용도 차이

이펙티브 자바의 아이템20. '추상 클래스보다는 인터페이스를 우선하라' 부분을 읽고 정리하는 포스팅.✍️ 클래스에 특정 역할을 부여하는 데에는 인터페이스가 우선이다. 자바 8부터 인터페이스도 default 메서드를 지원하여 인스턴스 구현 메서드를 구현 형태로 제공할 수 있다. 그리고 추상 클래스는 정의한 타입을 구현하는 클래스가 반드시 추상 클래스의 하위 클래스가 되어야한다는 제약 조건이 따른다. 반면에, 인터페이스는 구현한 모든 클래스를 어떤 클래스를 상속했든 같은 타입으로 취급한다.그래서 인터페이스는 기존 클래스에도 새로운 인터페이스를 구현하도록 하는데 제약이 없다. 인터페이스는 믹스인(mixin) 정의에 안성맞춤이다. 믹스인이란, 클래스가 구현할 수 있는 타입으로, '주된 타입'외에 특정 선택적 행..

Java 2022.03.03

생성자에 매개변수가 많아도 안무섭게 해주는 Builder!

이펙티브 자바의 아이템2. '생성자에 매개변수가 많다면 빌더를 고려하라' 부분을 읽고 정리하는 포스팅.✍️ 만약 필드의 갯수가 많고, 그 필드를 모두 생성자를 통해 받아야 하는 상황이라면?🤔 점층적 생성자 패턴 필수 매개변수만 받는 생성자, 필수 매개변수 + 선택 매개변수 1개 받는 생성자, 필수 매개변수 + 선택 매개변수 2개 받는 생성자 ... 이렇게 생성자를 늘려가는 패턴. public class NutritionFacts { private final int servingSize; // (mL, 1회 제공량) 필수 private final int servings; // (회, 총 n회 제공량) 필수 private final int calories; // (1회 제공량당) 선택 private fina..

Java 2022.02.28