Java - 3. enum

갓김치·2020년 9월 19일
0

고급자바

목록 보기
10/47

enum (열거형)

  • 상수(Constant)로 사용할 값들을 미리 선언하여 사용할 때 사용하는 특별한 데이터 타입

장점

  • Type Safe한 코드 작성
    • 기존 static final 상수선언 방식: 해당 상수의 값만 비교
    • enum을 이용한 상수 정의: 값 뿐만 아니라 타입까지도 체크
  • 재컴파일 안해줘도 됨
    • 기존: 상수값이 변경되는 경우, 해당 상수를 참조하는 소스코드도 모두 재컴파일해줘야함

선언방법

enum 열거형이름 { 상수값1, 상수값2, ..., 상수값n };

기존방식과 비교

// 기존
static final int A = 0;
static final int B = 1;
static final int C = 2;
static final int D = 3;

// enum
enum Data (A, B, C, D);

열거형에서 사용되는 메서드

name()

  • 열거형 상수의 이름을 문자열로 반환

ordinal()

  • 열거형 상수가 정의된 순서값을 반환
  • 기본적으로 0부터 시작

valueOf("열거형상수이름")

  • 지정된 열거형에서 '열거형상수이름'과 일치하는 열거형상수를 반환한다.

예제

1단계: enum 선언

  • T08_EnumTest.java
  • 모든 단계는 public class T08_EnumTest {} 내에서 진행됨

기본값을 이용하는 열거형 객체 선언

// City 열거형 객체 선언
public enum City { // City 라는 Enum 상수
	서울, 부산, 대구, 광주, 대전
}; // 세미콜론!		└─▶ 광주() 괄호 생략된 것
//  서울, 부산,.. 하나하나가 전부 타입이 됨. => 객체가 될 것

데이터 값을 임의로 지정한 열거형 객체 선언

  • 데이터 값을 정해줄 경우에는 생성자를 만들어서 괄호속의 값이 변수에 저장되도록 해야한다.
public enum Season {("3월부터 5월까지"), 
  여름("6월부터 8월까지"), 
  가을("9월부터 11월까지"), 
  겨울("12월부터 2월까지");

  // 괄호 속의 값이 저장될 변수선언
  private String str;

  // 생성자 만들기: 제어자 - 묵시적으로 'private'
  // private: 접근제어, 클래스안에서만 사용가능, 
  //          사용시점에 자체적으로 생성자 호출해서
  //          필요한만큼만 생성함 (시즌은4개, 시티는5개)
  Season(String data){ // => private Season(String data){
      str = data;
  }

  // 값을 반환하는 메서드
  public String getStr() {
      return str;
  }
}

2단계: main메서드 내에서 사용

public static void main(String[] args) {

// 열거형 객체 변수 선언
City myCity1; 
City myCity2;

// 열거형 객체 변수에 값 저장
myCity2 = City.서울;
myCity1 = City.valueOf("서울"); // City enum에서 '서울'에 해당하는 enum 객체의 데이터를 가져옴

// 출력
// myCity1.name() : 서울 - 그냥 myCity1 해도됨. (toString 오버라이드)
// myCity1.ordnial() : 0


Season ss = Season.valueOf("여름");

// 출력
// ss.name() : 여름 -> name(): enum객체에서 '여름'이라는 string만 필요할 때
// ss.ordinal() : 1 -> ordinal(): 열거했던 순서대로 뽑아내기
// ss.getStr(): 6월부터 8월까지
}


// 열거형 객체의 이름과 값 꺼내기
// 1. 일반 for문 이용
Season[] enumArr = Season.values();
for (int i = 0; i < enumArr.length; i++) {
	System.out.println(enumArr[i].name() + " : " + enumArr[i].getStr());
}

// 2. foreach문
for (Season season : Season.values()) {
	System.out.println(season + " : " + season.getStr());
}

// 출력
// 봄 : 3월부터 5월까지
// 여름 : 6월부터 8월까지
// 가을 : 9월부터 11월까지
// 겨울 : 12월부터 2월까지


// 비교
City city = City.대구;

boolean result = city == City.대전 // false
result = city == City.대구 // true

int result2 = city.compareTo(City.대구); // 0
result2 = city.compareTo(City.서울); // 2
result2 = city.compareTo(City.대전); // -2
//enum 클래스가 Comparable 인터페이스를 구현했기때문에 compareTo() 사용가능
profile
갈 길이 멀다

3개의 댓글

comment-user-thumbnail
2020년 12월 30일

result2 = city.compareTo(City.서울); // 2
result2 = city.compareTo(City.대전); // -2
이렇게 나오는 이유를 모르겠습니다 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ

1개의 답글