Home Enum 기초
Post
Cancel

Enum 기초

이 전에는 열거형 상수를 선언하려면

  • 클래스 내에 final static로 변수 선언
  • interface에 상수 선언

을 했어야 했다.


→ 한 클래스에 final static으로 선언하면 네임 충돌이 발생할 수도 있고 복잡하다.

→ 인터페이스를 사용하면 위 문제는 해결되나 타입 안정성이 떨어진다.
(컴파일 때 형검사를 하지 않으므로 오류 발생 소지→ 서로 다른 집합에 정의된 상수들은 서로 비교하면 안된다.)

*interface에서 선언된 변수는 public static final 속성을 생략할 수 있는 특징을 이용하여
코드를 조금 더 간결하게 작성할 수 있다.


  • 타입 안정성

    Type Safe(타입 세이프) 란 말그대로 타입에 안정적인 것을 의미한다.

    타입에 불안정적이다 라고 하는것은
    타입을 판별(Type Check) 하지 못해 Runtime 시 타입으로 인한 문제가 발생하는 것이다.

    Type Safe 하다 라는 것은
    그 반대로 타입을 판별(Type Check) 할 수 있어 Runtime시가 아닌 컴파일시 문제를 잡을 수 있는 것이다.

  • 열거형이란

    열거형(Enum)은 서로 연관된 상수들의 집합이라고 할 수 있다.
    자바의 열거형은 C언어의 열거형과 달리 값과 타입을 함께 비교하기 때문에 보다 논리적인 오류를 줄일 수 있다.



enum을 사용하는 이유

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Amart {
    static final int WATER = 500;
    static final int APPLE = 1000;
    static final int MILK = 1500;
}

class BreadRestaurant {
    static final int PASTA = 500;
    static final int SALAD = 1000;
    static final int PIZZA = 1500;
}

public class Main {
    private static void main(String[] args){
	      System.out.println(Amart.WATER == BreadRestaurant.PASTA ? "TRUE" : "FALSE");
}

출력 결과는 true이다. 500 == 500 과 같은 코드이므로 참이다.

하지만 WATER와 PASTA는 의미적으로 같지 않다.

또, Amart의 상수 값들이 변경된다면 결과는 달라진다.



WATER와 PASTA 등 똑같이 사용하고 싶은데 상수의 값이 변해버리면 다시 코딩해야하는 상황이 생겨버린다.

그래서 Enum을 사용하는 것이다.

1
2
3
4
5
6
7
8
enum Amart{WATER, APPLE, MILK}
enum BreadRestaurant {PASTA, SALAD, PIZZA}

public class Main {
    private static void main(String[] args) {
       // compile 에러가 뜬다.
	      System.out.println(Amart.WATER == BreadRestaurant.PASTA ? "TRUE" : "FALSE");
}

Type에 대해 검사를 하기 때문에 안정적인 코딩이 가능하다.

*타입이 다르다는 얘기
클래스를 다른걸로(ex. 메소드) 활용하면 타입으로 사용한다고 볼 수 있다. (검증 x)



1
2
3
4
5
public enum Student {
    ASTUDENT,
    BSTUDENT,
    CSTUDENT;
}

클래스 내부에서 이렇게 된다. → public static final Student ASTUDENT = new Student ();


enum은 클래스처럼 사용하거나 내부에서 사용될 수 있다.

  • enum만 선언해서 클래스처럼 사용
  • 클래스 내부에 enum을 내부 클래스처럼 사용



생성자

enum의 생성자는 private이다.

enum은 컴파일타임에 모든 값을 알아야 하고, 런타임 때 동적으로 어떤 값을 정해줄 수 없다.

그러므로 new할 수도 없고, public으로 접근해서도 안되니 private 생성자 밖에 안되는 것이다.



관련 메소드
메소드명설명
valueOf(String)String 값을 enum에서 가져옴
valueOf(Class, String)넘겨받은 class에서 String찾아, enum에 가져옴
values()enum의 요소들을 순서대로 enum타입의 배열로 리턴



Q. 여러 형태의 enum 데이터를 바인딩 하지 못해서 오류가 발생할 수 있기 때문에 Typehandler를 사용한다.
그런데 상수 안에 있는 변수가 2개 이상이면 typeHandler를 만들고 1개면 TypeHandler가 필요없었다.
알아서 매핑을 시켜주는걸까?
그래서 enum 수정 후에는 TypeHandler를 없애는 이유일까???

A. 변수가 2개 이상이라서가 아니라, DB에 저장된 값이 enum과 동일하지 않기 때문에 type handler 를 사용한다.
동일하면 자동으로 매핑된다.


Q. 파라미터가 2개 이상인 경우에는 @Param을 통해 parameter를 구분해서 사용한다.
그 이유가 파라미터가 2개 이상일 경우 mybatis에서 인식을 못하기 때문이다.
그러면 이것과 동일하게 enum의 변수가 2개 이상이면 TypeHandler를 만드는 이유도
mybatis에서 2개 이상은 인식을 하지 못하기 때문일까??

A. @Param 과 type handler 는 전혀 다른 이유이다.
https://mybatis.org/mybatis-3/configuration.html#typeHandlers



관련 글
enum
handler


출처 [JAVA] TYPE SAFE란?
https://www.nextree.co.kr/p11686/
https://cotak.tistory.com/162
https://onejunu.tistory.com/116
https://sjh836.tistory.com/134

This post is licensed under CC BY 4.0 by the author.