열거 타입

    메서드 시그니처를 신중히 설계하라 - [8장. 메서드(아이템51)]

    이번 글을 통해 API 설계 요령들을 살펴보자. 이를 활용하면 배우기 쉽고, 쓰기 쉬우며, 오류 가능성이 적은 API를 만들 수 있을 것이다. 📙 1. 메서드 이름을 신중히 짓자. 메서드 이름을 신중히 짓는 것에 대해서는 너무나 많이 들어봤을 것이다. 알고 있는 것을 한번 더 상기시킨다는 생각으로 보고 넘어가자. 항상 표준 명명 규칙을 따라야 한다. 이해할 수 있고, 같은 패키지에 속한 다른 이름들과 일관되게 짓자. 개발자 커뮤니티에서 널리 받아들여지는 이름을 사용하자. 긴 이름을 피하자. 애매하면 자바 라이브러리의 API 가이드를 참조하자. 📙 2. 편의 메서드를 너무 많이 만들지 말자. 메서드가 너무 많은 클래스는 익히고, 사용하고, 문서화하고, 테스트하고, 유지보수하기 어렵다. 인터페이스도 마찬가지..

    확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라 - [6장. 열거 타입과 애너테이션(아이템38)]

    📙 1. 열거 타입의 확장 타입 안전 열거 패턴과 달리 열거 타입은 확장할 수 없다. (이 점을 제외하고는 거의 모든 상황에서 열거 타입이 타입 안전 열거 패턴(typesafe enum pattern) 보다 우수하다.) 타입 안전 열거 패턴은 열거한 값들을 그대로 가져온 다음 값을 더 추가하여 다른 목적으로 쓸 수 있는 반면, 열거 타입은 그렇게 할 수 없다. 설계가 잘 못 된 것은 아니다. 하지만 다음과 같은 이유로 대부분 상황에서 열거 타입을 확장하는 건 좋지 않은 생각이기 때문이다 열거 타입을 확장할 수 없도록 설계한 것이다. 확장한 타입의 원소는 기반 타입의 원소로 취급하지만, 기반 타입의 원소를 확장한 타입의 원소로 취급할 수 없는 건 이상하기 때문이다. 기반 타입과 확장된 타입들의 원소 모두를..

    int 상수 대신 열거 타입을 사용하라 - [6장. 열거 타입과 애너테이션(아이템34)] - (2)

    이전 글을 통해 '정수 열거 패턴의 단점, 열거 타입의 장점, 열거 타입의 기본 사용법'을 알아보았다. 이번 글에서는 열거 타입의 다양한 기능들에 대해서 알아보도록 하자. 📙 1. 상수별 메서드 구현 (constant-specific method implementation) 사칙연산 계산기와 같이 상수마다 동작이 달라져야 하는 경우가 있다. 가장 간단하게 생각해 볼 수 있는 것은 switch문을 통하여 분기하는 방법이다. public enum Operation { PLUS, MINUS, TIMES, DIVIDE; // 상수가 뜻하는 연산을 수행한다. public double apply(double x, double y) { switch(this) { case PLUS: return x + y; case ..

    int 상수 대신 열거 타입을 사용하라 - [6장. 열거 타입과 애너테이션(아이템34)] - (1)

    자바를 이용하여 코딩을 하다 보면 정수 열거 패턴(int enum pattern)과 열거 타입(enum type)을 사용해 본 적이 있을 것이다. 이번 글에서는 정수 열거 패턴의 단점들을 살펴보고, 왜 열거 타입을 사용해야 하는지 알아보고자 한다. 그리고 기본적인 열거 타입의 사용법도 알아볼 것이다. 📙 1. 정수 열거 패턴 (int enum pattern) public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static final int APPLE_GRANNY_SMITH = 2; public static final int ORANGE_NAVEL = 0; public static final int ..

    private 생성자나 열거 타입으로 싱글턴임을 보증하라 - [2장 객체 생성과 파괴(아이템3)]

    해당 장에서는 싱글턴을 만드는 방식을 소개하고 있다. private 생성자를 이용하는 2가지 방식과 열거 타입을 이용하는 1가지 방식, 총 3가지 방식을 소개하고 있다. 각각의 장점과 단점에 대해서 알아보자. 1. 'private 생성자 + public static final 필드'를 이용하는 방법 public class Elvis{ /** * 싱글톤 오브젝트 */ public static final Elvis INSTANCE = new Elvis(); private Elvis(){} public void leaveTheBuilding(){ System.out.println("Whoa baby, I'm outta here!"); } public void sing(){ System.out.println("..