이펙티브 자바

개인 공부/스터디

[이펙티브 자바] 열거타입과 인터페이스

🏠 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라 기본적으로 열거 타입은 기존 상수를 그대로 가져와, 새롭게 추가하여 다른 목적으로 사용할 수 없다. 그런데 확장할 수 있는 열거 타입의 쓰임이 어울리는 경우가 하나는 있는데, 그건 바로 연산 코드이다. 연산 코드의 각 원소는 특정 기계가 수행하는 연산을 뜻한다. ( 예를 들어 계산기 ) 가끔 API가 제공하는 기본 연산 외에 사용자마다 확장 연산을 추가해줘야 할 때가 있다. 이때 사용할 수 있는게 바로 열거 타입이다. 열거 타입은 임의의 인터페이스를 구현할 수 있다. 연산 코드용 인터페이스를 정의하고, 열거 타입이 해당 인터페이스를 구현하면 된다. 그러면 열거 타입이 인터페이스의 표준 구현체 역할을 한다. public interface Ope..

개인 공부/스터디

[이펙티브 자바] 제네릭

🏠 로 타입은 사용하지 말자. 제네릭 클래스란 클래스 선언에 타입 매개변수가 사용된 클래스이다. 각각의 제네릭 타입은 일련의 매개변수화 타입을 정의한다. 클래스 이름이 나온 후, 꺽쇠괄호 안에 실제 타입 매개변수들을 나열한다. List 은 원소의 타입이 String 인 리스트를 뜻하는 매개변수화 타입이다. 여기서 String이 정규타입 매개변수 E에 해당하는 실제 타입 매개변수이다. 제네릭 타입을 하나 정의하면 그에 해당하는 로 타입도 함께 정의된다. 로 타입이란 제네릭 타입에서 타입 매개변수를 전혀 사용하지 않을 때를 정의한다. List 에서 타입 매개변수 String 을 사용하지 않는 List 가 바로 로 타입이다. 로 타입은 타입 선언에서 제네릭 타입 정보가 전부 지워진 것처럼 동작한다. 로 타입을..

개인 공부/스터디

[이펙티브 자바] 인터페이스의 용도

🏠 인터페이스는 타입을 정의하는 용도로만 사용하라. 인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다. 즉 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에게 얘기하는 것이다. 인터페이스는 오직 이 용도로만 사용해야한다. 💊 잘못된 예시 ( 상수 인터페이스 ) 상수 인터페이스 안티패턴은 인터페이스를 잘못 사용한 예시다. 클래스 내부에서 사용하는 상수는 외부 인터페이스가 아닌, 내부 구현에 해당한다. 때문에 상수 인터페이스를 구현하는 것은 해당 내부 구현을 클래스의 API로 노출하는 행위이다. 이는 혼란을 줄 수 있을 뿐만 아니라, 클라이언트 코드가 내부 구현에 해당하는 상수들에 종속될 수 있다. 이로서 더는 쓰지 않게 되더라고,..

개인 공부/스터디

[이펙티브 자바] Builder

🏠 생성자에 매개변수가 많다면 빌더를 고려하라. 클래스를 설계하다보면 어떤 인스턴스임에 따라 필드 값이 필수일수도, 필요하지 않을 수도 있다. 이에 대해 모든 걸 고려해서 설계하다보면 생성자가 감당하기 힘들 정도로 많아진다. Builder 패턴이 나오기 전에는 점층적 생성자 패턴을 즐겨 사용했다고 한다. 💊 점층적 생성자 패턴이란 ? 점층적 생성자 패턴(Telescoping Constructor Pattern)은 생성자 오버로딩을 이용하여 객체를 생성하는 패턴이다. 이 패턴은 매개변수가 많은 객체를 생성할 때 유용하지만 매개변수가 많아질수록 코드의 가독성이 떨어지고, 실수할 가능성이 높아진다. public class Pizza { private int size; private boolean cheese;..

Da2isy
'이펙티브 자바' 태그의 글 목록