Java/Effective Java
-
[Effective Java] Item 27. 비검사 경고를 제거하라Java/Effective Java 2020. 9. 4. 23:42
제네릭을 사용하기 시작하면 수많은 컴파일러 경고를 보게 될 것입니다. 비검사 형변환 경고, 비검사 메서드 호출 경고, 비검사 매개변수화 가변인수 타입 경고, 비검사 변환 경고 등입니다. 비검사 경고는 할 수 있는 한 모두 제거해야 합니다. 모두 제거한다면 그 코드는 타입 안전성이 보장됩니다. 즉, 런타임에 ClassCastException이 발생할 일이 없고, 의도한 대로 잘 동작하리라 확신할 수 있습니다. 경고를 제거할 수는 없지만 타입 안전하다고 확신할 수 있다면 @SuppressWarnings("unchecked") 애너테이션을 달아 경고를 숨기는 것이 좋습니다. 타입 안전함을 검증하지 않은 채 경고를 숨긴다면, 그 코드는 경고 없이 컴파일되겠지만, 런타임에는 여전히 ClassCastExceptio..
-
[Effective Java] Item 26. 로 타입은 사용하지 말라Java/Effective Java 2020. 9. 3. 23:57
타입 매개변수(type parameter) 클래스와 인터페이스에 타입 매개변수(type parameter)가 쓰이면, 이를 제네릭 클래스 혹은 제네릭 인터페이스라고 합니다. 예를 들면, List 인터페이스는 원소의 타입을 나타내는 타입 매개변수 E를 받습니다. 제네릭 클래스와 제네릭 인터페이스를 통틀어 제네릭 타입(generic type)이라고 합니다. 각각의 제네릭 타입은 일련의 매개변수화 타입(parameterized type)을 정의합니다.매개변수화 타입은 클래스(혹은 인터페이스) 이름이 나오고, 이어서 꺽쇠괄호 안에 실제 타입 매개변수들을 나열합니다. 예를 들면, List은 원소의 타입이 String인 리스트를 뜻하는 매개변수화 타입입니다. 로 타입(raw type) 로 타입이란 제네릭 타입에서 ..
-
[Effective Java] Item 24. 멤버 클래스는 되도록 static으로 만들라Java/Effective Java 2020. 9. 2. 23:05
중첩 클래스(nested class) 중첩 클래스(nested class)란 다른 클래스 안에 정의된 클래스를 말합니다. 중첩 클래스는 자신을 감싼 바깥 클래스에서만 쓰여야 하며, 그 외의 쓰임새가 있다면 톱레벨 클래스로 만들어야 합니다. 중첩 클래스의 종류 정적 멤버 클래스 (비정적) 멤버 클래스 익명 클래스 지역 클래스 첫 번째를 제외한 나머지는 내부 클래스(inner class)에 해당합니다. 정적 멤버 클래스 정적 멤버 클래스는 다른 클래스 안에 선언되고, 바깥 클래스의 private 멤버에도 접근할 수 있다는 점만 제외하고는 일반 클래스와 똑같습니다. 정적 멤버 클래스는 다른 정적 멤버와 똑같은 접근 규칙을 적용받습니다. 예를 들면, private로 선언되었다면 바깥 클래스에서만 접근이 가능합니..
-
[Effective Java] Item 22. 인터페이스는 타입을 정의하는 용도로만 사용하라Java/Effective Java 2020. 9. 1. 22:12
인터페이스의 용도 인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 합니다. 즉, 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 이야기 해주는 것입니다. 인터페이스는 오직 이 용도로만 사용해야 합니다. 안티패턴 상수 인터페이스 - 안티패턴 public interface AntiPhysicalConstants { // 아보가드로 수 (1/몰) static final double AVOGADROS_NUMBER = 6.022_140_857e23; // 볼츠만 상수 (J/K) static final double boltzmann_constant = 1.380_648_52e-23; // 전자 질량 (kg) static final doubl..