728x90
반응형

Effective Java 67

[Effective Java] 아이템 31. 한정적 와일드카드를 사용해 API 유연성을 높이라.

🎯 아이템 31. 한정적 와일드카드를 사용해 API 유연성을 높이라. 매개변수화 타입은 불공변이다. 즉 서로 다른 타입 Type1과 Type2가 있을 때 List은 List의 하위 타입도 상위 타입도 아니다. 즉, List은 List가 하는 일을 제대로 수행하지 못하니 하위 타입이 될 수 없다. ( 리스코프 치환 원칙 에 어긋난다. ) 와일드카드 타입을 사용하지 않은 pushAll 메서드 - 결함이 있다! // Stack의 public API public void pushAll(Iterable src){ for (E e : src) { push(e); } } 언뜻보면 컴파일도 되고 완벽해 보이지만 결함이 있다. public final class Integer extends Number implements..

Java 2023.03.21

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

🎯 아이템 30. 이왕이면 제네릭 메서드로 만들라. 제네릭 타입과 마찬가지로, 클라이언트에서 입력 매개변수와 반환값을 명시적으로 형변환해야 하는 메서드보다 제네릭 메서드가 더 안전하며 사용하기도 쉽다. 로 타입 사용 - 수용 불가! public static Set union(Set s1, Set s2) { Set result = new HashSet(s1); result.addAll(s2); return result; } 컴파일은 되지만 Raw use of parameterized class 'Set', Unchecked call to 'addAll(Collection

Java 2023.03.21

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

🎯 아이템 29. 이왕이면 제네릭 타입으로 만들라. 새로운 타입을 설계할 때는 형변환 없이도 사용할 수 있도록하라. 그렇게 하려면 제네릭 타입으로 만들어야 할 경우가 많다. 기존 타입 중 제네릭이었어야 하는 게 있다면 제네릭 타입으로 변경하자. 기존 클라이언트에는 아무 영향을 주지 않으면서, 새로운 사용자를 훨씬 편하게 해주는 길이다. Object 기반 스택 - 제네릭이 절실한 강력 후보!⭐ 지금 상태에서는 클라이언트가 스택에서 꺼낸 객체를 형변환해야 하는데, 이때 런타임 오류가 날 위험이 있다. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACI..

Java 2023.03.21

[Effective Java] 아이템 28. 배열보다는 리스트를 사용하라.

🎯 아이템 28. 배열보다는 리스트를 사용하라. 배열과 제네릭 타입에는 중요한 차이가 두 가지 있다. 1️⃣ 배열은 공변이지만, 제네릭은 불공변이다. Sub가 Super의 하위 타입이라면 배열 Sub[]는 배열 Super[]의 하위 타입이 된다. 반면, 서로 다른 타입 Type1, Type2가 있을 때, List은 List의 하위 타입도 아니고 상위 타입도 아니다. 어느 쪽이든 Long용 저장소에 String을 넣을 수는 없다. 다만 배열에서는 그 실수를 런타임에야 알게 되지만, 리스트를 사용하면 컴파일할 때 바로 알 수 있다. 2️⃣ 배열은 실체화(reify)된다. 배열은 런타임에도 자신이 담기로 한 원소의 타입을 인지하고 확인한다. 그래서 위 코드에 보듯 Long배열에 String을 넣으려 하면 Ar..

Java 2023.03.20

[Effective Java] 아이템 27. 비검사 경고를 제거하라.

>🎯 아이템 27. 비검사 경고를 제거하라. 비검사 경고 결과 : 위 처럼 영역이 하이라이트로 경고를 보여주는데 이를 비검사 경고라고 한다. 이러한 경고들은 할 수 있는 한 모두 제거하도록 하자. 컴파일러가 알려준 대로 수정 ( 다이아몬드 연산자만으로 해결 ) but. 경고를 제거할 수는 없지만 타입 안전하다고 확신할 수 있다면 @SuppressWarnings("unchecked") 애너테이션을 달아 경고를 숨기자. @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, MODULE}) @Retention(RetentionPolicy.SOURCE) public @interface SuppressWarnings { ... } ⭐ @Sup..

Java 2023.03.20

[Effective Java] 아이템 26. 로 타입은 사용하지 말라

🎯 아이템 26. 로 타입은 사용하지 말라 클래스와 인터페이스 선언에 타입 매개변수가 쓰이면, 이를 제네릭 클래스 혹은 제네릭 인터페이스라 한다. 제네릭 클래스 public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable { ... } 제네릭 인터페이스 public interface List extends Collection { ... } 제네릭 클래스와 제네릭 인터페이스를 통틀어 제네릭 타입(generic type)이라 한다. 각각의 제네릭 타입은 일련의 매개변수화 타입(parameterized type)을 정의한다. 제네릭 타입을 하나 정의하면 그에 딸린 로 타입(raw ..

Java 2023.03.20
728x90
반응형