개발서적/Effective Java

    [Effective Java] 이왕이면 제네릭 메서드로 만들라

    매개변수화 타입을 받는 정적 유틸리티 메서드 메서드도 제네릭으로 만들 수 있다. 먼저 원소 타입을 타입 매개변수로 명시하고, 메서드 안에서도 이 타입 매개변수만 사용할 수 있게 만들면 된다. public static Set union(Set s1, Set s2) {} 위 코드에서 타입 매개변수는 이고 반환 타입은 Set이다. 제네릭 싱글턴 팩터리 패턴 다음 처러 제네릭 싱글턴 팩터리을 만들어 사용하면 타입을 사용하는 쪽에서 정해주기만 하면 된다. import java.util.function.UnaryOperator; public class GenericSingletonFactory { private static UnaryOperator IDENTITY_FN = (t) -> t; @SuppressWarn..

    [Effective Java] 이왕이면 제네릭 타입으로 만들라

    배열을 제네릭으로 바꾸기 배열을 제네릭으로 바꾸는 과정에서 마주칠 수 있는 에러는 다음과 같다. Stack.java8: generic array creation elements = new E[DEFAULT_INITIAL_CAPACITY]; 이 에러는 E와 같은 실체화 불가 타입으로는 배열을 만들 수 없기 대문에 발생한다. 이를 위한 해결책은 다음과 같다. Object 배열로 생성하고 제네릭 배열로 형변환 하는 방법 - 컴파일러는 오류 대신 경고를 보여주지만, 일반적으로 타입 안전하지 않다. elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY]; 이 방법은 형변환을 배열 생성시 한 번만 하지만, 힙 오염의 단점이 있다. E[]에서 Object[]로 바꾼다. - 컴..

    [Effective Java] 배열보다는 리스트를 사용하라

    배열과 제네릭 타입의 차이 배열 - 공변 | 리스트 - 불공변 공변이란 함께 변한다는 뜻이다. 예를 들어 Sub가 Super의 하위 타입이라면 배열 Sub[]는 배열 Super[]의 하위 타입이 된다. 배열은 공변타입이다. 따라서 다음과 같은 코드를 작성해도 컴파일타임에 경고를 띄우지 않는다. Object[] objectArray = new Long[1]; objectArray[0] = "타입이 달라 넣을 수 없다"; 리스트는 불공변타입이다. 예를 들어 List은 List의 하위 타입도 아니고 상위 타입도 아니다. 따라서 컴파일타임에 에러를 확인할 수 있다. List ol = new ArrayList(); ol.add("타입이 달라 넣을 수 없다."); 실체화(reify)의 여부 배열은 런타임에도 자신이..

    [Effective Java] 비검사 경고를 제거하라

    비검사 경고를 제거하라 대부분의 비검사 경고는 쉽게 제거할 수 있다. 할 수 있는 한 모든 비검사 경고를 제거하는 것이 타입 안정성을 보장해준다. 경고를 제거할 수는 없지만 타입 안전하다고 확신할 수 있다면 @SuppressWarnings 어노테이션을 달아 경고를 숨기자. 다이아몬드 연산자. Set exaltation = new HashSet(); Set exaltation = new HashSet(); @SuppressWarnings 이 어노테이션을 사용할 때는 타입 안전함 검증이 선행되어야 하며, 항상 가능한 한 좁은 범위에 적용해야 한다. 어노테이션은 선언에만 달 수 있기 때문에 return문에는 이 어노테이션을 적을 수 없다. 그렇다고 메서드 전체에 달기 보다는 직연변수를 선언해서 이를 이용하도록..

    [Effective Java] raw 타입은 사용하지 말자

    제네릭 클래스/인터페이스 클래스와 인터페이스 선언에 타입 매개변수가 쓰이면 제네릭 클래스 혹은 제네릭 인터페이스라 한다. 제네릭 타입은 일련의 매개변수화 타입을 정의한다. => List, Map, Integer etc raw 타입 제네릭 타입에서 타입 매개변수를 전혀 사용하지 않을 때를 말하며 List에서 List가 raw 타입이다. 다음과 같이 raw타입으로 변수를 선언할 수 있다. private final Collection stamps = ...; 하지만 이 코드를 사용하면 stamp대신 coin을 넣어도 아무 오류 없이 컴파일되고 실행된다. 이 에러가 발견되는 시점은 다음과 같이 이 동전을 꺼낼 때이다. Stamp stamp = (Stamp) stamps.get(0); 하지만 제네릭을 활용하면 이..