Effective Java
-
제네릭 - 아이템 28. 배열보다는 리스트를 사용하라Study/Effective Java 2023. 1. 4. 14:55
배열보다는 리스트를 사용하라 배열과 제네릭의 차이 1. 공변과 불공변 배열과 제네릭 타입에는 중요한 두 가지 차이가 있다. 첫 번째, 배열은 공변이다. 예를 들어, Sub가 Super의 하위 타입이라면 배열 Sub[]는 배열 Super[]의 하위 타입이 된다. 즉, 같이 변한다는 의미이다. 반면, 제네릭은 불공변이다. 즉, 서로 다른 타입 Type1과 Type2가 있을 때, List은 List의 하위 타입도 아니고 상위 타입도 아니다. Object[] objectArray = new Long[1]; objectArray[0] = "타입이 달라 넣을 수 없다."; // ArrayStoreException을 던짐 Long용 저장소에 String을 넣을 수는 없다. 배열에서는 이러한 문제점을 런타임에야 알게 ..
-
제네릭 - 아이템 27. 비검사 경고를 제거하라Study/Effective Java 2023. 1. 4. 10:58
비검사 경고를 제거하라 비검사 경고란? 제네릭을 사용하기 시작하면 수많은 컴파일러 경고를 보게 될 것이다. 비검사 형변환 경고, 비검사 메서드 호출 경고, 비검사 매개변수화 가변인수 타입 경고, 비검사 변환 경고 등이다. 즉, 비검사 경고란 컴파일러 경고와 동일한 의미이다. 비검사 경고의 예시 Set set = new HashSet(); 위 코드와 같이 구현체의 타입을 명확히 주지 않은 채로 HashSet 객체를 생성할 수 있다. Note: Recompile with -Xlint:unchecked for details. 그러면 컴파일러는 무엇이 잘못됐는지 위와 같이 친절하게 알려줄 것이다. Set set = new HashSet(); 위 코드와 같이 다이아몬드 연산자()를 붙여주면 타입을 추론할 수 있으..
-
제네릭 - 아이템 26. 로 타입은 사용하지 말라Study/Effective Java 2023. 1. 3. 14:49
로 타입은 사용하지 말라 제네릭이란? 클래스와 인터페이스 선언에 타입 매개변수가 사용되면, 이를 제네릭 클래스 혹은 제네릭 인터페이스라고 부르며 이를 통틀어 제네릭 타입이라고 한다. 각각의 제네릭 타입은 일련의 매개변수화 타입을 정의한다. 먼저 클래스의 이름이 나오고, 바로 옆에 꺾쇠괄호 안에 실제 타입 매개변수들을 나열한다. 예를 들어, List은 원소의 타입이 String인 리스트를 뜻하는 매개변수화 타입이다. 여기서 String은 정규 타입 매개변수 E에 해당하는 실제 타입 매개변수이다. 로 타입이란? 제네릭 타입을 하나 정의하면 그에 딸린 로 타입도 함께 정의된다. 로 타입이란 제네릭 타입에서 타입 매개변수를 전혀 사용하지 않을 때를 말한다. 예를 들어, List의 로 타입은 List이다. 로 타..
-
클래스와 인터페이스 - 아이템 25. 톱레벨 클래스는 한 파일에 하나만 담으라Study/Effective Java 2022. 12. 27. 14:23
톱레벨 클래스는 한 파일에 하나만 담으라 톱레벨 클래스란? 톱레벨 클래스란 함수, 클래스 또는 다른 무언가로 감싸지지 않은 모든 구문을 의미한다. 즉, 톱레벨 클래스란 중첩 클래스가 아닌 것을 말한다. 다중 톱레벨 클래스의 문제점 소스 파일 하나에 톱레벨 클래스를 여러 개 선언하더라도 자바 컴파일러는 불평하지 않는다. 하지만 아무런 득이 없을뿐더러 심각한 위험을 감수해야 하는 행위다. 이렇게 하면 한 클래스를 여러 가지로 정의할 수 있으며, 그중 어느 것을 사용할지는 어느 소스 파일을 먼저 컴파일하냐에 따라 달라지기 때문이다. 위 문제점에 대한 구체적인 예를 들어 보겠다. // Main.java public class Main { public static void main(String[] args) { ..
-
클래스와 인터페이스 - 아이템 24. 멤버 클래스는 되도록 static으로 만들라Study/Effective Java 2022. 12. 27. 11:29
멤버 클래스는 되도록 static으로 만들라 중첩 클래스란? 중첩 클래스란 다른 클래스 안에 정의된 클래스를 말한다. 중첩 클래스는 자신을 감싼 바깥 클래스에서만 쓰여야 하며, 그 외의 쓰임새가 있다면 톱레벨 클래스로 만들어야 한다. 중첩 클래스의 종류는 정적 멤버 클래스, 비정적 멤버 클래스, 익명 클래스, 지역 클래스 이렇게 네 가지가 존재한다. 이 중 첫 번째를 제외한 나머지는 내부 클래스에 해당한다. 이번 게시글에서는 각각의 중첩 클래스를 언제 그리고 왜 사용해야 하는지에 대해서 알아보겠다. 정적 멤버 클래스 정적 멤버 클래스는 다른 클래스 안에 선언되고, 바깥 클래스의 private 멤버에도 접근할 수 있다. 정적 멤버 클래스는 다른 정적 멤버와 똑같은 접근 규칙을 적용받는다. 예컨대 정적 멤버..
-
클래스와 인터페이스 - 아이템 22. 인터페이스는 타입을 정의하는 요도로만 사용하라Study/Effective Java 2022. 12. 26. 16:32
인터페이스는 타입을 정의하는 요도로만 사용하라 인터페이스의 용도 인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다. 즉, 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해주는 것이다. 인터페이스는 오로지 이 용도로만 사용돼야 한다. 인터페이스의 잘못된 사용 public interface PhysicalConstants { static final double AVOGADROS_NUMBER = 6.022_140_857e23; static final double BOLZMANN_CONSTANT = 1.380_648_52e-23; static final double ELECTRON_MASS = 9.109_383-56e-31; }..