Enum class?

niraaah·2023년 4월 9일
2

혼자하는 스터디

목록 보기
1/25
post-thumbnail

in C++

: 사용자 정의 자료형. JAVA와 유사!

[장점]
1. 특정 상태의 집합을 나타내야 할 때 코드 문서화 및 가독성 목적으로 매우 유용하다.

enum ParseResult {
    SUCCESS = 0,
    ERROR_OPENING_FILE = -1,
    ERROR_READING_FILE = -2,
    ERROR_PARSING_FILE = -3
};
ParseResult readFileContents() {
    if (!openFile())
        return ERROR_OPENING_FILE;
    if (!readFile())
        return ERROR_READING_FILE;
    if (!parsefile())
        return ERROR_PARSING_FILE;
    return SUCCESS;
}
  1. 호출자는 해당 열거자에 대해 함수의 반환값을 테스트 할 수 있으며, 이는 특정 정수 값에 대한 반환 결과를 테스트 하는 것보다 이해하기 쉽다.
  2. bool은 기본적으로 true와 false의 두 열거자를 가진 열거형이다. (그러나 C++에서 true와 false는 열거자 대신 키워드로 정의되어 있다.) enum을 통해 다양한 반환값을 가진 bool같은 걸 만들 수 있음!
// 열거형 Color의 변수들 정의
Color paint = COLOR_WHITE;
Color house(COLOR_BLUE);
Color apple { COLOR_RED };
  1. 식별자는 대문자로 시작하고 열거자는 모두 대문자로!
  2. 각 열거자는 세미콜론이 아닌 쉼표로 구분. 그러나 enum 자체는 세미콜론으로 끝나야함. 열거자는 열거와 같은 네임스페이스에 배치되므로, 열거자 이름은 같은 네임스페이스 내의 여러 열거(enum)에서 사용할 수 없다.
enum Color{
	BLACK,	//assigned 0
    RED,	//assigned 1
    BLUE,	//assigned 2
    WHITE,	//assigned 3
}

Color paint(WHITE);
std::cout<<paint;

출력:
4
  1. 열거자의 값을 명시적으로 정의할 수 있다. 이러한 정수 값은 양 또는 음의 값일 수 있으며 다른 열거자와 같은 값을 공유할 수도 있다. 정의되지 않은 모든 열거자는 이전 열거자보다 1 더 큰 값이 부여됨.
enum Animal{
	CAT = -3,
    DOG,	//assigned -2
    PIG,	//assigned -1
    HORSE = 5,
    GIRAFFE = 5, //shares same value as HORSE
    CHICKEN	//assigned 6
};
  1. 열거형 값은 정수로 평가되므로 정수 변수에 할당할 수 있다. 컴파일러는 정수를 열거형 값으로 암시적으로 변환하지 않는다.
    그러나 state_cast를 통해 강제로 변환 가능.
ex1) Animal animal = 5; //cause compile error
ex2) Color color = static_cast<Color>(5); //ugly but able to use
  1. 컴파일러는 std::cin을 사용해 열거형을 입력할 수 없다.
  2. 열거형은 고유한 자료형으로 간주. 따라서 열거형에 다른 열거형을 할당하려고 하면 컴파일 오류가 뜸.
  3. 상수 변수와 마찬가지로 디버거에 표시되므로 #define보다 유용함.
  4. 대부분의 열거형 변수는 표준 int와 같은 크기

출처: 소년코딩


in JAVA

: '열거형'. 서로 연관된 상수들을 모아 대표할 수 있는 이름으로 타입을 정의하는 것. 클래스처럼 보이게 하는 상수.

[장점]
1. 코드가 단순해지며 가독성이 좋아짐
2. 인스턴스 생성과 상속을 방지하여 상수값의 타입안정성이 보장됨
3. 정의한 타입 이외의 타입을 가진 데이터값을 컴파일시 체크함 (즉, enum으로 정의한 상수값만 할당 가능)
4. 키워드 enum을 사용하기 때문에 구현의 의도가 열거임을 분명하게 알 수 있음

  • 별자는 대문자로 시작하고 열거자는 모두 대문자로!
    각 열거자는 세미콜론이 아닌 쉼표로 구분. 그러나 C++과는 다르게 enum 자체는 세미콜론 없이 끝나야함.
  • 메소드
  1. values(): 열거된 모든 원소를 배열에 담아 순서대로 리턴
package EnumExample;

public class Developer{
	public static void main(String[] args){
    	for  (DevType type: DevType.values()) {
        	Syste.out.println(type);
        }
    }
}

enum DevType{
	MOBILE, WEB, SERVER
}

결과:
MOBILE
WEB
SERVER
  1. ordinal(): 원소에 열거된 순서를 정수값으로 리턴
package EnumExample;

public class Developer{
	public String name;
    public int career;
    public DevType type;
    
    public static void main(String[] args){
    	Developer developer = new Developer();
        developer.name = "Jane";
        developer.career = 3;
        developer.type = DevType.MOBILE;
        System.out.println(developer.type.ordinal());
        DevType tp = developer.type.SERVER;
        System.out.println(tp.ordinal());
    }
}

enum DevType{
	MOBILE, WEB, SERVER
}

결과:
0
2
  1. valueOf(): 매개변수로 주어진 String과 열거형에서 일치하는 이름을 갖는 원소를 리턴 (일치하지 않는 경우 예외(IllegalArgumentException) 발생)
package EnumExample;

public class Developer{
	public String name;
    public int career;
    public DevType type;
    
    public static void main(String[] args){
    	DevType tp1 = DevType.MOBILE;
        DevType tp2 = DevType.valueOf("WEB");
        System.out.println(tp1);
        System.out.println(tp2);
    }
}
enum DevType{
	MOBILE, WEB, SERVER
}

결과:
MOBILE
WEB
  • 열거형 상수를 다른 값과 연결하기
package EnumExample;

public class Developer {
	public String name;
	public int career;
	public DevType type;

	public static void main(String[] args) {
		for (DevType type : DevType.values()) {
			System.out.println(type.getName());
		}
	}
}

enum DevType { 
	//상수("연관시킬 문자") <- 이땐 줄 끝에 세미콜론 (;) 붙이기. 
	MOBILE("안드로이드"), 
	WEB("스프링"), 
	SERVER("리눅스"); 
	
	final private String name; 
	public String getName() { 
		return name; 
		} 
	private DevType(String name){ 
		this.name = name; 
		} 
	}
}

출처: Limky 삽질블로그

profile
코딩천재

0개의 댓글