Java | Enum

바다·2024년 4월 27일
0

Java

목록 보기
1/18
post-thumbnail

Spring Boot로 프로젝트를 하면서 "흠~ 이런 거군" 하고 사용하곤 있었지만, 정확히 어떤 구조인지! 어떤 메소드를 가지고 있는지! 몰랐던 Enum을 정리해보려고 한다 :)

Enum은?

"Enumeration" 의 약자로, 열거/목록/일람표라는 의미를 가지고 있으며 보통 한글로는 열거형이라고 부른다. 서로 관련 있는 상수들을 모아서 대표 이름으로 클래스를 정의하고 활용하는 데에 사용된다.

데이터 중에서 월, 화, 수, 목, 금, 토, 일 / 봄, 여름, 가을, 겨울 / 관리자, 사용자 등과 같은 몇 가지 한정된 값을 갖는 경우 열거형 타입을 사용한다!

본인은 프로젝트를 진행할 때 회원 엔티티의 권한을 관리할 때 사용하였다!

Enum 선언

public enum Role {
	ADMIN, VIP, USER
}

열거상수를 적을 때는 관례로 대문자로 적으며, 만약 열거 상수가 2개의 단어로 연결되어 있을 때는 _로 연결하는 것이 관례이다.

Java에서 열거 상수는 상수 각각을 내부적으로 public static final 필드이면서 단순한 상수가 아닌 객체로 제공되도록 한다!

Enum의 정의에 나열된 값들은 0부터 순서대로 1씩 증가하는 값을 가지게 된다.
그리고, 자바에서는 Enum을 클래스처럼 사용할 수 있다.

public enum Role {
	ADMIN("ad", 10),
    VIP("vip", 20),
    USER("user", 30);
    
    private final String name;
    private final int value;
    
    private Role(String name, int value) {
    	this.name = name;
        this.value = value;
    }
    
    public String getName() {
    	return this.name;
    }
    
    public int getValue() {
    	return this.value;
    }
}

Enum 참조 방식

Enum 타입 객체도 하나의 데이터 타입이므로 변수를 선언하고 사용한다

public class Member {
	
    /*
    	다른 필드들 선언
    */
    
    Role role = Role.USER;
}

Enum 메소드

메소드설명리턴 타입
name()열거 객체의 문자열을 리턴String
ordinal()열거 객체의 순번(0부터 시작)을 리턴int
compareTo()열거 객체를 비교해서 순번 차이를 리턴int
valueOf(String name)문자열을 입력받아서 일치하는 열거 객체를 리턴enum
values()모든 열거 객체들을 배열로 리턴enum[]

name()

  • 열거 객체가 가지고 있는 문자열을 리턴
  • 반환되는 문자열은 열거 타입을 정의할 때 사용한 상수 이름과 동일
Role r = Role.User;

String memberRole = r.name();
System.out.println(memberRole);	//user

ordinal()

  • 열거 타입을 정의할 때 주어진 순번을 리턴
  • 전체 열거 객체 중 몇 번째 열거 객체인지 알려 준다.
Role r = Role.ADMIN;

int roleNum = r.ordinal();
System.out.println(roleNum);	//0

compareTo()

  • 매개값으로 주어진 열거 객체를 비교해서 순번 차이를 리턴
  • 열거 객체가 매개값의 열거 객체보다 순번이 빠르다? 음수 리턴
  • 열거 객체가 매개값의 열거 객체보다 순번이 늦다? 양수를 리턴
Role r1 = Role.ADMIN;	//0
Role r2 = Role.USER;	//2

int compare1 = r1.compareTo(r2);	//USER 기준으로	ADMIN 위치
System.out.println(compare1);		//-2

int compare2 = r2.compareTo(r1);	//ADMIN 기준으로	USER 위치
System.out.println(compare1);		//2

valueOf()

  • 매개값으로 주어지는 문자열과 동일한 문자열을 가지는 열거 객체를 리턴
Role r1 = Role.valueOf("VIP");
System.out.println(r1);			//VIP

values()

  • 열거 타입의 모든 열거 객체들을 배열로 만들어 리턴
Role[] r = Role.values();

System.out.println(Arrays.toString(r));	//[ADMIN, VIP, USER]

Enum의 장점

  • 코드가 단순해지고, 가독성이 좋아진다!
  • 허용 가능한 값들을 제한하여 유형 안전을 제공한다!
  • 키워드 enum을 사요하기 때문에 구현의 의도가 열거임을 분명하게 나타낼 수 있다!
  • 자체 클래스 상수와 달리 switch문에서도 사용할 수 있다!
  • 리팩토링시 변경 범위가 최소환된다! (enum 내에서 한번에 관리)

그 외에도...

사실 Enum을 이렇게 단순하게만 사용하는 것이 아닌 더 많은 기능을 부여해서 사용할 수 있다!
하지만 나의 실력은 아직 그것을 담아낼 정도가 되지 못하기 때문에...
조금 더 공부를 한 이후에 Enum의 고급 문법과 활용에 대해서 다뤄보고 싶다 :)

profile
ᴘʜɪʟɪᴘᴘɪᴀɴs 3:14

0개의 댓글