[JAVA] 열거형(Enums)

maxxyoung·2023년 1월 31일

열거형(enums)

열거형이란

  • 값 뿐만 아니라 타입까지 관리 -> 논리적 오류는 더 줄일 수 있음
  • 상수를 사용했을 경우, 상수의 값이 바뀌면 해당 상수를 사용하는 모든 소스를 다시 컴파일 해야하지만 열거형 상수를 사용하면, 기존의 소스를 다시 컴파일 하지 않아도 됨

열거형의 정의와 사용

enum 열거형 이름 { 상수명1, 상수명2, ... }
  • "==" 연산 사용 가능("<", ">" 사용 불가)
  • compareTo() 사용 가능
  • switch문 사용 가능
    • case문에 열거형의 이름은 적지 않고 상수의 이름만 적어야함
void move() {
switch(dir) {
	case EAST: x++;
    	break;
    case WEST: x--;
    	break;
    case SOUTH: y++;
    	break;
    case NORTH: y--;
    	break;
}

모든 열거형의 조상 - java.lang.Enum

  • Class <E> getDeclaringClass()
    • 열거형의 Class객체를 반환
  • String name()
    • 열거형 상수의 이름을 문자열로 반환
  • int ordinal()
    • 열거형 상수가 정의된 순서를 반환.(0부터 시작)
  • T valueOf(Class<T> enumType, String name)
    • 지정된 열거형에서 name과 일치하는 열거형 상수를 반환
  • values()
    • 열거형의 모든 상수를 배열에 담아 반환

열거형에 멤버 추가하기

  • 열거형 옆에 ()를 쓰고 그 안에 원하는 값을 넣어주면 됨
  • 지정된 값을 저장할 수 있는 인스턴스 변수와 생성자를 새로 추가해주어야함
enum CardType{
	CHECK(0), CREDIT(1)
    
    private final int value;
    CardType(int value) { this.value = value; }
    int getValue() {return vlaue;}
}
  • 열거형의 생성자는 제어자가 묵시적으로 private이라서 직접 생성자 호출 안됨

열거형 상수의 이해

  • 열거형 상수 하나하나가 클래스 객체들임
  • 열거형 상수들은 static class들의 주소값을 가지고 있음. 따라서 "==" 비교가 가능한 것
class CardType {
	staic final CardType CHECK = new CardType("CHECK");
    staic final CardType CREDIT = new CardType("CREDIT");
    
    private String name;
    
    private CardType(String name) {
    	this.name = name;
    }
}
  • 주의할 점은 enum을 사용할 때 static 클래스 단 1개만 만들어짐. 때문에 중간에 enum 객체의 멤버를 변화시킬 경우 코드 전체 enum 멤버 쓰는 곳이 영향을 받을 수 있음 -> 따라서 enum의 멤버를 set하는 경우는 없어야함!!

출처

  • 자바의 정석
profile
오직 나만을 위한 글. 틀린 부분 말씀해 주시면 감사드립니다.

0개의 댓글