chap17-enum 03-grammar

yj k·2023년 4월 5일

java

목록 보기
3/3

Enum 작성_UserRole1

Enum은 상수 하나하나가 인스턴스화 될 수 있다.

생성자 작성 시 열거형 상수 선언 마지막에 세미콜론을 붙여야한다.

기본 생성자를 가질 수 있다.

defualt와 private 접근 제한 사용 가능하지만 외부에서 호출은 불가능함(묵시적으로 private)
enum 타입은 고정된 상수들의 집합으로 런타임이 아닌 컴파일 시에 모든 값이 결정되어 있어야한다.
따라서 다른 클래스에서 enum 타입에 접근해 동적으로 생성자를 이용해 어떤 값을 전달해줄 수 없기 떄문이다.(외부에서 호출해서 값 초기화 불가능)

필요하다면 메소드도 만들 수 있다.

Application 작성


Enum에서 선언한 getNameToLowerCase() 메소드 사용

Enum 작성_UserRole2

각각 요소들이 특정한 값을 가지게 할 수도 있다.

이러한 경우에는 매개변수 있는 생성자가 반드시 필요하다.
enum상수의 괄호 안에 넣은 값이 해당 생성자 쪽으로 전달되며 enum 인스턴스가 생성된다.
생성된 인스턴스는 싱글톤 객체이다.

요소들이 가지는 기본 네임과 정수 값 외의 값을 외부에서 사용하려고 할 떄 필요드로 작성한 값을 반환하도록 메소드를 작성할 수 있다.

Application 작성

최초 enum 타입을 사용할 시 생성자가 호출된다. 하지만 이것이 동적으로 생성되는 것을 의미하는 것은 아니다.

UserRole2 consumer = UserRole2.CONSUMER;
	System.out.println(consumer.ordinal() + "" + consumer.name() + "" + consumer.getDescription());

최초 사용 시에만 열거 타입의 인스턴스를 생성하고 이후에는 생성자를 호출하지 않는다.

UserRole2 consumer2 = UserRole2.CONSUMER;

인스턴스는 싱글톤으로 관리되기 때문에 동일 비교 연산으로 비교가 가능하다.

System.out.println(consumer == consumer2);

결과 =========================================
true

EnumSet을 활용하여 여러 열거형 타입들을 set으로 취급할 수 있다.

EnumSet<UserRole2> roles = EnumSet.allOf(UserRole2.class);
	
	Iterator<UserRole2> iter = roles.iterator();
	while(iter.hasNext()) {
		
		System.out.println(iter.next().name());
	}

결과 =========================================
GUEST
CONSUMER
PRODUCER
ADMIN

특정 상수만 골라서 set에 추가할 수도 있다.

EnumSet<UserRole2> users = EnumSet.of(UserRole2.CONSUMER, UserRole2.PRODUCER);
	
	Iterator<UserRole2> userIter = users.iterator();
	while(userIter.hasNext()) {
		
		System.out.println(userIter.next().name());
	}

결과 =========================================
CONSUMER
PRODUCER

특정 상수만 골라서 제거하고 set에 추가할 수도 있다.

EnumSet<UserRole2> notGuest = EnumSet.complementOf(EnumSet.of(UserRole2.GUEST));
	
	Iterator<UserRole2> notGuestIter = notGuest.iterator();
	while(notGuestIter.hasNext()) {
		
		UserRole2 role = notGuestIter.next();
		System.out.println(role.ordinal() + "" + role.name() + "" + role.getDescription());
	}

결과 =========================================
1CONSUMER구매자
2PRODUCER판매자
3ADMIN관리자

0개의 댓글