16 Apr 2023 EffectiveJava
배열과 제네릭 타입에는 중요한 차이가 두가지 있다. 첫 번째로 배열은 공변(covariant : 함께 변한다)이다. Sub가 Super의 하위 타입이라면 배열 Sub[]는 배열 Super[]의 하위 타입이 된다. 반면, 제네릭은 불공변(invariant : 함께 변하지 않는다.)이다. 즉, 서로 다른 타입 Type1, Type2가 있을 때, List은 List의 하위 타입도 아니고...
16 Apr 2023 EffectiveJava
제네릭을 사용하기 시작하면 수많은 컴파일러 경고를 보게 될 수있다.
대부분의 비검사 경고는 쉽게 제거가 가능하다.
비검사경고 제거
아래와 같이 코드를 잘못 작성했을 때의 예시를 들어보자.
Set<Lark> exaltation = new HastSet();
…
16 Apr 2023 EffectiveJava
먼저 제네릭에 대해 간단하게 정의하고 출발하도록 하자. 클래스와 인터페이스 선언에 타입매개변수 (type parameter)가 쓰이면, 이를 제네릭 클래스 혹은 제네릭 인터페이스라 한다.
각각의 제네릭 타입은 일련의 매개변수화 타입을 정의한다. 먼저 클래스(혹은 인터페이스) 이름이 나오고. 이어서 꺽쇠괄호 안에 실제 타입 매개변수를 나열한다. 예를 들어, List<String>은 원소의 타입이...
15 Apr 2023 EffectiveJava
class 하나당 왜 파일을 하나만 만들까? 모두 당연하게 해왔지만, 왜 이렇게 하는지에 대해 정의해볼까 한다.
보통 소스 파일 하나에 톱레벨 클래스를 여러 개 선언하더라도 자바 컴파일러는 불평하지 않는다. 하지만 아무런 득이 없을 뿐더러 심각한 위험을 감수해야 하는 행위다.
이렇게 하면 한 클래스가 여러가지로 정의 될...
15 Apr 2023 EffectiveJava
중첩 클래스(nested class)란 다른 클래스 안에 정의된 클래스를 말한다. 중첩 클래스는 자신을 감싼 바깥 클래스에서만 쓰여야 하며, 그외의 쓰임새가 있다면 톱레벨 클래스로 만드는 것을 권장한다.
중첩 클래스의 종류는 정적 멤버 클래스, (비정적) 멤버 클래스, 익명 클래스, 지역 클래스 이렇게 네가지이며, 이중 첫번째를 제외한 나머지는 내부...