전체 글 552

[Effective Java] 6-3. 열거 타입과 애노테이션

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다. 1. @Override 애너테이션을 일관되게 사용하라@Override상위 타입의 메서드를 재정의하였음을 뜻함추상메서드를 재정의한 경우, 애너테이션을 달지 않아도 됨 2. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라마커 인터페이스public interface Auditable {}public class User implements Auditable { private String name; private int age; // 생성자와 Getter/Setter public User(String name, int age) { this.name = name; this.age = ..

Java 2024.12.31

[Effective Java] 6-2. 열거 타입과 애노테이션

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다.1. ordinal 인덱싱 대신 EnumMap을 사용하라EnumMap열거 타입을 키로 사용하도록 설계한 Map 구현체데이터와 열거타입을 매핑 장점 (vs 배열)효율성내부에서 배열을 사용타입 안전성생성자에 키에 대한 클래스 리터럴(한정적 타입 토큰) 전달런타임 제네릭 타입 정보 제공인덱스 계산 오류 X내부적으로 인덱스 범위와 계산을 처리해줌스트 Stream 사용그룹화Arrays.stream(garden) // garden 배열을 스트림으로 변환 .collect(groupingBy( // groupingBy를 사용해 그룹화 ..

Java 2024.12.31

[Effective Java] 6-1. 열거 타입과 애노테이션

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다.1. int 상수 대신 열거 타입을 사용하라정수 열거 타입public final class IntEnumPattern { public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static final int APPLE_GRANNY_SMITH = 2; public static final int ORANGE_NAVEL = 0; public static final int ORANGE_TEMPLE = 1; public static final int ORANGE_BLOOD = 2;}타입 안정적이지 않음..

Java 2024.12.30

[Effective Java] 5-3. 제네릭: 고려 사항

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다. 1. 제네릭과 가변인수를 함께 쓸 때는 신중하라제네릭 varargs 배열 매개변수에 값을 저장하는 것은 안전하지 않음가변인수는 내부적으로 타입의 배열을 생성함제네릭 타입의 배열은 생성 불가생성 시, 힙 오염 발생 힙 오염public class Example { public static void unsafeMethod(T... args) { Object[] array = args; // args는 T[] 타입 배열로 생성됨 array[0] = "String"; // 런타임에는 Object로 처리되어 컴파일 가능 T t = args[0]; // ClassCastExc..

Java 2024.12.30

[Effective Java] 5-2. 제네릭: 권고 사항

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다. 1. 배열보다는 리스트를 사용하라배열은 공변Object[] objArray = new Long[1];objArray[0] = "hello"; // 런타임에 ArrayStoreException 발생구현 타입으로 변경됨잘못된 타입이 할당될 경우, 런타임에 예외 발생  제네릭은 불공변List ol = new ArrayList(); // 호환 X. 컴파일 타임에 오류 발생!ol.add("hello");매개변수 타입과 관련없이 제네릭 타입은 서로 다른 타입일치하지 않을 경우, 컴파일 타임에 오류 2. 이왕이면 제네릭 타입으로 만들라클래스 선언에 매개변수 타입을 추가하기 3. 이왕이면 제네릭 메서드로 만들라타입 매개변수 목록 메서드의 ..

Java 2024.12.28

[Effective Java] 5-1. 제네릭: 제한 사항

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다.1. 로 타입은 사용하지 말라타입제네릭 타입제네릭 클래스: 클래스 선언에 타입 매개변수가 쓰인 클래스제네릭 인터페이스: 인터페이스 선언에 타입 매개변수가 쓰인 인터페이스 매개변수화 타입타입 매개변수의 타입 로 타입제네릭 타입에서 타입 매개변수를 전혀 사용하지 않을 때호환성 때문에 남아있음 제네릭 타입 권고타입 안정성컬렉션에서 원소를 꺼내는 모든 곳에 보이지 않는 형변환을 추가 디버깅오류는 가능한 컴파일 타임에 발견하는 것이 좋음런타임에 발견 시, 원인 제공 코드를 발견하기 어려움 제네릭 규칙소거 방식컴파일 후, 런타임에 타입 정보가 제거되는 방식하위 호환성을 위해 소거 방식으로 구현되었음 하위 타입 규칙List objectLi..

Java 2024.12.27

[Effective Java] 4-4. 클래스와 인터페이스: 클래스

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다.1. 태그 달린 클래스보다는 클래스 계층구조를 활용하라태그 달린 클래스public class Shape { // 태그 필드 public enum ShapeType { CIRCLE, RECTANGLE } private final ShapeType type; // CIRCLE에만 필요한 필드 private double radius; // RECTANGLE에만 필요한 필드 private double width; private double height; // 생성자: 원 public Shape(double radius) { this.type = ShapeType.CIR..

Java 2024.12.27

[Effective Java] 4-3. 클래스와 인터페이스: 인터페이스

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다.1. 추상 클래스보다는 인터페이스를 우선하라추상클래스상속을 통한 재사용기본적인 구현을 제공일부 메서드를 abstract로 선언하여 하위 클래스가 이를 구현하도록 요구추상클래스가 정의한 타입을 구현한는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 함 인터페이스믹스인 정의주된 기능에 선택적 기능을 혼합기존 클래스에도 손쉽게 새로운 인터페이스를 구현해 추가 가능 계층구조가 없는 타입 프레임워크 생성 가능인터페이스가 선언한 메서드를 정의하고 규약을 지킨다면 어떤 클래스를 확장했던 같은 타입현실세계의 다양한 모델을 표현하는데 유용 2. 인터페이스는 구현하는 쪽을 생각해 설계하라디폴트 메서드인터페이스 메서드의 기본 구현을 제공하는..

Java 2024.12.27

[Effective Java] 4-2. 클래스와 인터페이스: 상속보다는 컴포지션을 사용하라

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다.1. 상속 주의사항재정의할 수 있는 메서드들이 내부적으로 어떻게 사용되는지 문서화하기API 호출에 사용되는 경우/** * Removes all elements from this collection. * * Implementation Requirements: * This method internally calls `removeRange(0, size())`. * If `removeRange` is overridden in a subclass, the behavior of this method * will change accordingly. */public void clear() { removeRange(0, size()..

Java 2024.12.27

[Effective Java] 4-1. 클래스와 인터페이스: 클래스와 멤버의 접근 권한을 최소화하라

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다.1. 내부 정보를 외부로부터 잘 숨기기캡슐화구현과 API를 분리컴포넌트들을 서로 분리시켜 개별적인 작업 수행 가능테스트, 최적화, 분석 등 정보 은닉 (접근 제한자)모든 클래스와 멤버의 접근성을 가능한 좁혀야 함 2. 접근성 제약사항리스코프 치환 원칙상위 클래스의 메서드를 재정의할 때, 접근 수준을 상위 클래스에서보다 더 좁게 설정 불가상위 클래스의 인스턴스는 하위 클래스의 인스턴스로 대체가 가능해야 하기 때문어길 경우, 컴파일 타임에서 오류 발생 3. public 필드를 지양하라값 제한 불가불변식 위반외부 코드에서 필드에 직접 접근하여 부적절한 값으로 설정할 수 있음 스레드 안정성외부에서 직접 수정할 수 있다면 멀티스레드 환..

Java 2024.12.27