로 타입 로 타입이란 제네릭 타입 매개변수를 전혀 사용하지 않을 때를 말한다. 예컨대 List<E> 의 로 타입은 List다. 로 타입(타입 매개변수가 없는 제네릭 타입)을 쓰는 걸 언어 차원에서 막아 놓진 않았지만 절대로 써선 안된다. 로 타입을 쓰면 제네릭을 안겨주는 안정성과...
[이펙티브자바] 아이템25-톱레벨 클래스는 한 파일에 하나만 담으라
소스 파일 하나에 톱레벨 클래스를 여러 개 선언하더라도 자바 컴파일러는 문제 없이 컴파일 한다. 하지만 심각한 위험을 감수해야 하는 행위다. 이렇게 하면 한 클래스를 여러 가지로 정의할 수 잇으며, 그중 어느 것을 사용할지는 어느 소스 파일을 먼저 컴파일하느냐에 따라 달라지기 때문이다. public cla...
[이펙티브자바] 아이템24-멤버 클래스는 되도록 static으로 만들어라
중첩 클래스 중첩 클래스에는 정적 멤버 클래스, (비정적) 멤버 클래스, 익명 클래스, 지역 클래스 이렇게 네 가지 종류가 있다. 정적(static) 멤버 클래스 다른 클래스 안에 선언되고, 바깥 클래스의 private 멤버에도 접근할 수 있다는 점만 제외하곤 일반 클래스와 똑같다. 정적 멤버 클래스는 다른 정적 멤버와 똑같은 접근 ...
[이펙티브자바] 아이템23-태그 달린 클래스보다는 클래스 계층구조를 활용하라
// 코드 23-1 태그 달린 클래스 - 클래스 계층구조보다 훨씬 나쁘다! (142-143쪽) class Figure { enum Shape { RECTANGLE, CIRCLE }; // 태그 필드 - 현재 모양을 나타낸다. final Shape shape; // 다음 필드들은 모양이 사각형(RECTANGLE)일 때만 ...
[이펙티브자바] 아이템22-인터페이스는 타입을 정의하는 용도로만 사용하라
인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다. 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해주는 거이다. 인터페이스는 오직 이 용도로만 사용해야 한다. 상수 인터페이스 안티패턴은 인터페이스를 잘못 사용한 예다. // 코드 22-1 상수 인터페이스...
[이펙티브자바] 아이템21-인터페이스는 구현하는 쪽을 생각해 설계하라
자바 8전에는 기존 구현체를 깨드리지 않고는 인터페이스에 메서들르 추가할 방법이 없었다. 자바 8에 와서 기존 인터페이스에 메서드를 추가할 수 있도록 디폴트 메서드를 소개했지만 위험이 완전히 사라진 것은 아니다. 모든 기존 구현체들과 매끄럽게 연동되리라는 보장이 없다. 디폴트 메서드는 구현 클래스에 대해 아무것도...
[이펙티브자바] 아이템20-추상 클래스보다는 인터페이스를 우선하라
자바가 제공하는 다중 구현 메커니즘은 인터페이스와 추상 클래스, 이렇게 두 가지다. 자바8부터 인터페이스도 디폴트 메서드(default method)를 제공할 수 있다.(참고) 둘의 가장 큰 차이는 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 한다는 점이다. 자바는 단일 상속만 지원하기에, 추상...
[이펙티브자바] 아이템19-상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라
상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지(자기사용) 문서로 남겨야 한다. '재정의 가능' 이란 public과 protected 중 final이 아닌 모든 메서드를 뜻한다. 재정의 가능 메서드를 호출할 수 있는 모든 상황을 문서로 남겨야 한다. Implementation Requirements API 문...
[이펙티브자바] 아이템18-상속보다는 컴포지션을 사용하라
위 포스팅에서 언급하는 상속은 클래스가 인터페이스를 구현하거나 인터페이스가 다른 인터페이스를 확장하는 인터페이스 상속과는 무관하다. 상속은 코드를 재사용하는 강력한 수단이지만, 잘 못 사용하면 오류를 내기 쉽다. 같은 프로그래머가 통제하는 패키지 안에서라면 상속도 안전한 방법이다. 확장할 목적으로 설계되었고 문서화도 잘 된 클래스(아이템19...
[이펙티브자바] 아이템17-변경 가능성을 최소화하라
불변 클래스란? 인스턴스의 내부 값을 수정할 수 없는 클래스 String, 기본 타입의 박싱된 클래스들, BigInteger, BigDecimal이 여기 속한다. 클래스를 불변으로 만드는 다섯 가지 규칙 1) 객체의 상태를 변경하는 메서드(변경자, Setter)를 제공하지 않는다. 2) 클래스를 확장할 수 없도혹 해야 한다. 클래...