핵심 요약 클라이언트에서 직접 형변환해야 하는 타입보다 제네릭 타입이 더 안전하고 쓰기 편하다. 그러니 새로운 타입을 설계할 때는 형변환 없이도 사용할 수 있도록 하라. 기존 타입 중 제네릭이었어야 하는 게 있다면 제네릭 타입으로 변경하자. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITiNAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITiNAL_CAPACITY]; } public Object push(Object item) { ensureCapacity(); elements[size++..
배열 제네릭 공변(Sub가 Super의 하위 타입이라면 배열 Sub[]는 배열 Super[]의 하위 타입이 된다.) 불공변(서로 다른 타입 Type1과 Type2가 있을 때, List은 List의 하위 타입도 아니고 상위 타입도 아니다.) 런타임 단계에서 발견 컴파일 단계에서 발견 실체화(런타임에도 자신이 담기로 한 원소의 타입을 인지하고 확인) 실체화 x(원소 타입을 컴파일 타임에만 검사하여 런타임에는 알 수 없음) 제네릭 타입, 매개변수화 타입, 타입 매개변수 사용 불가(cuz Type Safety) 실체화 타입 컴파일 타임과 런타임에 동일한 타입 정보를 가지는 타입 반대로 실체화 불가 타입은 런타임에는 타입 정보가 소거되어 컴파일 타임보다 타입 정보를 적게 가지는 타입 실체화, 소거 String[]..
제네릭을 사용하면서 Unchecked Warning을 많이 접할 수 있다. 타입 안정성을 보장하기 위해, 최대한 Unchecked Warning이 발생하지 않도록 코드를 작성해야 한다. Checked Exception Unchecked Exception 확인 시점 컴파일 시점 런타임 시점 처리 여부 반드시 예외 처리해야 한다. (컴파일 안됨) 명시적으로 하지 않아도 된다. (특정 런타임 때 에러가 발생할 가능성이 있다.) 종류 IOException, ClassNotFoundException 등 NullPointerException, ClassCastException 등 @SuppressWarnings("unchecked") 경고를 제거할 수는 없지만 타입 안전하다고 확신할 수 있다면 @SuppressWa..
용어 정리 한글 용어 영문 용어 예 아이템 매개변수화 타입 parameterized type List 아이템 26 실제 타입 매개변수 actual type parameter String 아이템 26 제네릭 타입 generic type List 아이템 26, 29 정규 타입 매개변수 formal type parameter E 아이템 26 비한정적 와일드카드 타입 unbounded wildcard type List 아이템 26 로 타입 raw type List 아이템 26 한정적 타입 매개변수 bounded type parameter 아이템 29 재귀적 타입 한정 recursive type bound 아이템 30 한정적 와일드카드 타입 bounded wildcard type List
아이템 25는 매우 간단하다. 핵심 내용은 아래와 같다. 자바 언어에서는 하나의 소스 파일 안에 여러 개의 클래스를 선언할 수 있지만, 권장되지 않는 방식이다. 이는 코드의 가독성을 떨어뜨릴 뿐만 아니라, 컴파일 동작에도 영향을 줄 수 있다. 따라서 일반적으로는 하나의 소스 파일 안에는 톱 레벨 클래스(top-level class) 하나만을 사용하도록 권장한다. 이렇게 하면 코드가 직관적이고 이해하기 쉽기 때문이다. 인터페이스도 클래스와 마찬가지로 톱 레벨 인터페이스(top-level interface)를 사용하도록 권장한다. 그러나, 때로는 클래스를 중첩 클래스(nested class)로 선언해야 하는 경우가 있다. cf) 중첩 클래스는 외부 클래스의 멤버로 선언되며, 외부 클래스의 멤버에 접근할 수 ..
불변 클래스 불변 클래스란 해당 인스턴스 내부의 값을 수정할 수 없도록 구현된 클래스다. 불변 인스턴스에 설정된 정보는 객체 생성 시점에 고정되어, 해당 객체가 파괴되는 순간까지 절대 달라지지 않는다. 대표적인 예로 기본 타입의 박싱된 클래스들, BigInteger, BigDecimal 등이 있다. 불변 클래스는 가변 클래스보다 오류가 생길 여지가 적고, 훨씬 안전하다. 불변 클래스를 만드는 다섯 가지 규칙 객체의 상태를 변경하는 메소드(ex. setter)를 제공하지 않는다. 당연한 말이다. 클래스를 확장할 수 없도록 한다. 하위 클래스에서 부주의하게 혹은 나쁜 의도로 객체의 상태를 변하지 않도록 막아준다. 상속을 막는 대표적인 방법으로 클래스를 final로 선언하는 방법, private(or defa..
핵심 요약 public 클래스는 절대 가변 필드를 직접 노출하면 안된다. 불변 필드라면 덜 위험하지만 안전한 것은 아니다. package-private 클래스나 private 중첩 클래스에서는 불변, 가변 상관없이 필드를 노출하는 게 좋은 경우도 있다. class Point { public double x; public double y; } 어딜봐도 문제가 많아 보이는 위 클래스의 문제점이 무엇인가? 1. 데이터 필드에 직접 접근이 가능하여 캡슐화 원칙을 위배한다. 2. 내부 표현을 바꾸려면 API를 수정해야 한다. 예를 들어, double 대신 다른 타입으로 저장하려고 하면, API를 수정해야만 한다. 즉, 클래스 내부 구현 방식이 외부에 노출되어 있으므로, 클래스 내부 구현 방식 변경이 API까지 영..
잘 설계된 컴포넌트는 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 숨긴 채, 캡슐화를 통해 보호한다. 즉, 내부 데이터와 내부 구현 정보는 클래스 내부에 숨겨져 있으며, 외부에서는 클래스가 제공하는 공개된 API를 통해서만 데이터와 동작을 조작할 수 있다. 이는 코드의 유지보수성과 확장성을 향상시키는 소프트웨어 설계의 근간이 되는 원리이다. 접근 지정자 멤버에 접근하는 클래스멤버의 접근 지정자privatepackage-privateprotectedpublic같은 패키지의 클래스XOOO다른 패키지의 클래스XXXO접근 가능 영역클래스 내동일 패키지 내동일 패기지와 자식 클래스모든 클래스 기본 원칙 : 모든 클래스와 멤버의 접근성을 가능한 한 좁혀야 한다. 톱레벨 클래스와 인터페이스 : pack..