목록EffectiveJava3/E (28)
초보개발자 긍.응.성

배열과 제네릭 타입의 차이 배열 공변(covariant)이다 (Sub가 Super의 하위 타입이라면 배열 Sub[]는 배열 Super[]의 하위 타입이 된다) 런타임에도 자신이 담기로 한 원소 타입을 인지하고 확인한다. 제네릭 불공변(invariant)이다 타입 정보가 런타임에는 소거(erasure)된다. 원소타입을 컴파일 타임에만 검사하며 런타임에는 알 수 없다. 이러한 차이로 배열과 제네릭은 잘 어우러지지 못한다. 제네릭 배열은 만들 수 없는데 타입 안전하지 않기 때문이다. 실체화 불가 타입 (non-reifiable type) 실체화되지 않아서 런타임에는 컴파일타임보다 타입 정보를 적게 가지는 타입이다. E, List, List 같은 타입이 실체화 불가 타입에 해당된다. 제네릭 타입과 가변 인수 메..

할 수 있는 한 모든 비검사 경고를 제거하라 제네릭을 사용하기 시작하면 수많은 컴파일러 경고를 보게 된다. 비검사 형변환 경고 비검사 메서드 호출 경고 비검사 매개변수화 가변인수 타입 경고 비검사 변환 경고 할 수 있는 한 모든 비검사 경고를 제거하라. 모두 제거한다면 그 코드는 타입 안전성이 보장된다. 즉, 런타임에 ClassCastException이 발생할 일이 없으며, 의도한 대로 잘 동작한다. @SuppressWarning 경고를 제거할 수는 없지만 타입 안전하다고 확신할 수 있다면 @SuppressWaring("unchecked") 애너테이션을 달아 경고를 숨기자. Type Safety를 검증하지 않은 채 경고를 숨기면 스스로에게 잘못된 보안 인식을 심어주게 된다. 코드는 경고 없이 컴파일되겠지..

용어 제네릭 클래스 : 클래스의 선언에 타입 매개변수가 쓰인 클래스 제네릭 인터페이스 : 인터페이스의 선언에 타입 매개변수가 쓰인 인터페이스 제네릭 타입 : 제네릭 클래스와 제네릭 인터페이스를 통틀어 제네릭이라고 부른다 매개변수화 타입 (parameterized type) : 제네릭 타입에 실제 매개변수가 함께 선언된 타입 로 타입 (raw type) : 제네릭 타입에서 타입 매개변수를 사용하지 않을 때의 타입 예를 들어 매개변수화 타입이 List 이라면 실제 타입 매개변수는 String이며 로 타입은 List이다. 제네릭 타입을 하나 정의하면 그에 딸린 로 타입(raw type)도 함께 정의된다. 로 타입의 사용 제네릭 대신 로 타입을 사용해도 동작을 하지만 좋은 예가 아니다 (하위 호환성을 위해 지원..

톱 레벨 클래스 톱레벨톱 레벨 클래스는 소스파일에서 가장 바깥에 존재하는 클래스를 말한다. 일반적으로 하나의 소스파일에서는 하나의 톱 레벨 클래스를 가진다. 예로 파일 이름이 SimpleService.java라면 클래스 이름도 SimpleService로 하나의 톱 레벨 클래스를 갖는다. 사실 소스 파일 하나에 톱레벨 클래스를 여러 개 선언하더라도 자바 컴파일러의 동작에는 아무런 문제가 없다. 단 이런 사용은 아무런 득이 없을뿐더러 심각한 위험을 감수해야 하는 행위다. 다수의 톱레벨 클래스 정의의 문제점 한 클래스를 여러 가지로 정의할 수 있으며, 그중 어느 것을 사용할지는 어느 소스 파일을 먼저 컴파일하냐에 따라 달라진다. public class Main { public static void main(S..

중첩 클래스의 종류와 각각의 중첩 클래스를 언제 그리고 왜 사용해야 하는지 알아보자. 중첩 클래스 (nested class) 중첩 클래스(nested class)란 다른 클래스 안에 정의된 클래스를 말한다. 중첩 클래스는 자신을 감싼 바깥 클래스에서만 쓰여야 하며, 그 외의 쓰임새가 있다면 톱 레벨 클래스로 만들어야 한다. 중첩 클래스의 종류는 정적 멤버 클래스, (비정적) 멤버 클래스, 익명 클래스, 지역 클래스 이렇게 네 가지다. 이 중 첫번째를 제외한 나머지는 내부 클래스(inner class)에 해당된다. 정적 멤버 클래스 정적 멤버 클래스는 다른 클래스 안에 선언되고, 바깥 클래스의 private 멤버에도 접근할 수 있다는 점만 제외하고는 일반 클래스와 동일하다. 정적 멤버 클래스는 다른 정적 ..

태그 달린 클래스의 단점과 해결방법을 알아보자 태그 달린 클래스 두 가지 이상의 의미를 표현할 수 있으며, 그중 현재 표현하는 의미를 태그 값으로 알려주는 클래스를 태그 클래스라고 한다. 아래의 클래스는 태그 클래스의 예이다. class Figure { enum Shape { RECTANGLE, CIRCLE }; // 태그 필드 - 현재 모양을 나타낸다. final Shape shape; // RECTANGLE에서 사용하는 필 double length; double width; // CIRCLE에서 사용하는 필드 double radius; Figure(double radius) { shape = Shape.CIRCLE; this.radius = radius; } Figure(double length, d..