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; }
- 호출자는 해당 열거자에 대해 함수의 반환값을 테스트 할 수 있으며, 이는 특정 정수 값에 대한 반환 결과를 테스트 하는 것보다 이해하기 쉽다.
- bool은 기본적으로 true와 false의 두 열거자를 가진 열거형이다. (그러나 C++에서 true와 false는 열거자 대신 키워드로 정의되어 있다.) enum을 통해 다양한 반환값을 가진 bool같은 걸 만들 수 있음!
// 열거형 Color의 변수들 정의 Color paint = COLOR_WHITE; Color house(COLOR_BLUE); Color apple { COLOR_RED };
- 식별자는 대문자로 시작하고 열거자는 모두 대문자로!
- 각 열거자는 세미콜론이 아닌 쉼표로 구분. 그러나 enum 자체는 세미콜론으로 끝나야함. 열거자는 열거와 같은 네임스페이스에 배치되므로, 열거자 이름은 같은 네임스페이스 내의 여러 열거(enum)에서 사용할 수 없다.
enum Color{
BLACK, //assigned 0
RED, //assigned 1
BLUE, //assigned 2
WHITE, //assigned 3
}
Color paint(WHITE);
std::cout<<paint;
출력:
4
enum Animal{
CAT = -3,
DOG, //assigned -2
PIG, //assigned -1
HORSE = 5,
GIRAFFE = 5, //shares same value as HORSE
CHICKEN //assigned 6
};
ex1) Animal animal = 5; //cause compile error
ex2) Color color = static_cast<Color>(5); //ugly but able to use
in JAVA
: '열거형'. 서로 연관된 상수들을 모아 대표할 수 있는 이름으로 타입을 정의하는 것. 클래스처럼 보이게 하는 상수.
[장점]
1. 코드가 단순해지며 가독성이 좋아짐
2. 인스턴스 생성과 상속을 방지하여 상수값의 타입안정성이 보장됨
3. 정의한 타입 이외의 타입을 가진 데이터값을 컴파일시 체크함 (즉, enum으로 정의한 상수값만 할당 가능)
4. 키워드 enum을 사용하기 때문에 구현의 의도가 열거임을 분명하게 알 수 있음
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
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
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;
}
}
}