본문 바로가기

TIL

[TIL] Enum 활용법, Generics [Java]

Enum

  • 생성자의 접근 제한자 기본 값이 private이다.
    - Enum은 서로 연관된 고정된 상수의 집합이기 때문에 외부객체의 생성을 막기 위해서이다.
    - 생성자를 통해 값을 초기화하거나 동적으로 변환하지 못하게 하기 위함이다.
  • IDE의 적극지원을 받는다. (자동완성, 오타검증, 텍스트 리팩토링, ...)
  • Type Safety하다.
    - 타입 안정성을 보장한다.
  • 가독성을 높여준다.
  • 관리가 용이하다.
    - 값의 추가와 변동을 위해서 한 곳만 수정하면 되기 때문이다.
  • 싱글톤을 보장해준다.
    - 싱글톤이란? 객체의 인스턴스가 오직 1개만 생성되는 디자인 패턴이다.
public enum OperatorType {
    PLUS("+"),
    MINUS("-"),
    MUL("*"),
    DIV("/"),
    REM("%");

    private String operator;

    // 싱글톤 패턴
    OperatorType(String operator) {
        this.operator = operator;
    }

    // 해당 연산자를 찾아주는 것이다.
    public static OperatorType findOperator(String operator) {
        for (OperatorType op : OperatorType.values()) {
            if (op.getOperator().equals(operator)) {
                return op;
            }
        }
        throw new RuntimeException();
    }

    public String getOperator() {
        return operator;
    }
}
switch (operatorType) {
            case PLUS: result = operator[0].operate(num1, num2); break;
            case MINUS: result = operator[1].operate(num1, num2); break;
            case MUL: result = operator[2].operate(num1, num2); break;
            case DIV: result = operator[3].operate(num1, num2); break;
            case REM: result = operator[3].operate(num1, num2); break;
            default: throw new OperatorException("잘못된 연산자입니다.");
}

Generics

나오게 된 배경

ArrayList list = new ArrayList();
list.add(10);
list.add(20);
list.add("30");

Integer i = (Integer)list.get(2); // err 발생
  • 위 코드는 컴파일 에러가 아닌 런타임 에러가 발생한다. 즉, 프로그램이 실행되면 죽는다.
  • list.get(2)에서 Object 타입을 반환하고 Integer 타입으로 변환하는 것이라 오류가 없다한다.
    - 하지만 실제로는 String 타입이기에 오류가 발생한다.
  • 이렇게 런타임 에러까지 가지 않고 컴파일 에러를 발생시킴으로써 예방시켜주기 위해서 Generics가 나왔다.
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(10);
list.add(20);
list.add("30"); // err

Integer i = list.get(1); // 형변환을 해주지 않아도 된다.
  • 처음 생성할 때 타입을 명시해 줌으로써 다른 타입이 들어왔을 경우 컴파일 에러를 발생시켜준다.
  • 또한, 타입이 정해져있으므로 형변환도 필요가 없다.
  • 코드를 조금 더 간결하게 만들어준다.

 

첫번째 코드처럼 사용할 수는 있으나 권장되는 방식이 아니다.

자바 1.5버전 이후로는 2두번째 코드처럼 쓰도록 권장되고 있다.

 

장점

  1. 타입 안정성 제공
    - 지정된 타입 외 타입이 들어가는 것을 막아준다.
    - 런타임 에러 중 ClassCastException이 일어나지 않도록 막아준다. (형변환 에러이다.)
  2. 형변환 생략 가능