[Java] enum

2022. 10. 5. 15:07Dev.Program/Java & Spring

728x90

p.295 → 3.enum

======== TestEnum.java 만들기 (Enum으로)

> 평소에 만들던 Class 말고 Enum 으로 만들어보기

  • Enum 만들기

  • 그냥 나열만해도 색 / 기울임꼴 바뀌어서 나옴(자동 static final)

 

======== JAVA0323 - Ex.java 만들기

< enum >

  • 자바 1.5버전부터 새롭게 추가된 것
  • Enum은 열거형이라고 불리며, 서로 연관된 상수들의 집합을 의미
    • ⇒ 서로 관련있는 상수들끼리 모아 상수들을 대표할 수 있는 이름으로 타입을 정의
  • 기존에 상수를 정의하는 방법이였던 final static string 과 같이 문자열이나 숫자들을 나타내는 기본자료형의 값을 enum을 이용해서 같은 효과를 낼 수 있다.

< enum의 장점 >

  1. 코드가 단순해지며, 가독성이 좋아짐
  2. 인스턴스 생성과 상속을 방지 ⇒ 상수값의 타입안정성 보장
  3. enum을 사용해 새로운 상수들의 타입을 정의함으로써 정의한 타입이외의 타입을 가진 데이터값을 컴파일시 체크함(⇒ 문법적 오류를 찾아낼 수 있다)
  4. 키워드 enum을 사용하기 때문에 구현의 의도가 열거임을 분명하게 알 수 있음

 

<Ex.java>

  • enum 도 class/interface 만드는 것처럼 만든다 ⇒ enum키워드 enum명 {}
enum Grade {
	// 단순히 사용할 상수의 이름을 나열하기만 하면 된다.
	SALES, PART_TIME_JOP, NORMAL
}​

 

<Ex.java ⇒ main()에서 호출>

  • 선언한 SALES, PART_TIME_JOP, NORMAL 전부 S(Static)와 F(Final)가 붙은 것을 볼 수 있다.

  • 출력창 (enum에 나열했던 것이 이름이자 값이다!)

  • Enum{} ⇒ E 라고 표시되어있음

  • TestEnum 에 Grade.SALES 를 넣으려면 오류남

  • 오류창 확인 : 다른 타입의 enum 상수 저장 불가(Grade 타입과 TestEnum 타입)

 

  • 대문자 사용(enum 아니고 Enum)

 

  • 출력창

 

p. 298

  • main() 메서드 안에 저장된 ‘//enum 상수에 대한 판별’을 calculate() 메서드로 만든다.

  • 따로 calculate() 메서드로 만들어줌

  • 메인창에서 호출해봄
  • 출력창

  • 이건 오류남!
  • 오류창 확인 : Grade 타입 enum 상수만 전달 가능! (SPRING은 Season 타입)

  • instanceof 를 사용하였을 때 오류남.
  • 오류창 확인 : 일치하지 않는 타입이라서 오류

  • Ex.java에 이 부분 Season1로 바꾸기(Ex2.java 에서 Season 을 만들거기 때문에)

 

p.300

======== Ex2.java

public class Ex2 {
	public static void main(String[] args) {
		
	}
	
	public void compareEnum(Season season) {
		
	}
	
	public void enumSwitch(Season season) {
		
	}
}

enum Season {
	SPRING, SUMMER, FALL, WINTER
}
 
  • 이렇게 틀 먼저 만들기
enum Season {
	// enum 상수는 자동으로 ordinal 값이 순차적으로 부여되며,
	// 인덱스처럼 0부터 부여됨
	SPRING/*0*/, SUMMER/*1*/, FALL/*2*/, WINTER/*3*/
      // 여기 부여된 숫자 값 잘보기!
      // (이 값이 실제 int 값은 아니기 때문에 부등호로 비교 불가)
}
 
  • enum Season{} 정의
  • enum 에서 열거된 상수들도 대문자로 적어줌(→ 좋은 코드)

  • 출력창 -1 숫자 잘 보기!

  • 이런식으로 계산 됨! (enum 내부에 인덱스처럼 부여된 숫자 확인)

 

> switch ~ case 문(조건문) 사용

⇒ switch() 파라미터 값으로 정수값, 문자열, Enum 3가지만 가능

  • 여기선 Enum 타입 season 을 넣어줌
  • 값을 불러올 때 season. 을 붙이지 않는다!
  • ⇒ 붙일 경우 이렇게 오류 뜸
  • switch 문에 전달받은 enum 타입을 자동으로 감지!
public void enumSwitch(Season season) {
    // switch() 파라미터로 정수, 문자열, enum 3가지만 전달 가능
    // enum 타입 전달 시 case 문에는 상수 이름만 사용하면 됨!
    switch (season) { // switch 문에 전달받은 enum 타입을 자동 감지
        case SPRING : // Season.SPRING 지정 시 오류 발생!
            System.out.println("봄!");
            break;
        case SUMMER :
            System.out.println("여름!");
            break;
        case FALL :
            System.out.println("가을!");
            break;
        case WINTER :
            System.out.println("겨울!");
    }
}
 
  • 최종 코드

 

<Ex2.java → main()에서 호출>

  • 출력창

 

p. 301

< enum 의 메서드 >

  1. values() : 해당 enum 타입에 해당하는 배열로 모든 상수를 리턴
  2. name() : 해당 enum 상수의 이름을 문자열로 리턴
  3. ordinal() : 해당 enum 상수의 순서번호(인덱스)를 정수로 리턴
  4. valueOf() : 입력받은 문자열이 enum 상수와 일치하는 경우

1. values() : 해당 enum 타입에 해당하는 배열로 모든 상수를 리턴

  • Season[] 배열타입 (S 대문자 주의)
  • Season.values();

2. name() : 해당 enum 상수의 이름을 문자열로 리턴

  • String 타입인 것을 확인할 수 있다.
  • sArr[i].name();
  • 출력창
  • 이렇게 하면 String 타입으로 리턴받아 옴  (아까는 enum 타입)

3. ordinal() : 해당 enum 상수의 순서번호(인덱스)를 정수로 리턴

  • int 타입인 것을 확인할 수 있다.
  • sArr[i].ordinal();
  • 출력창
  • int 형으로 리턴해줌!

4. valueOf() : 입력받은 문자열이 enum 상수와 일치하는 경우

  • Season 타입

  • 문법적 오류는 안남

  • 실행해보면 오류남!
  • 콘솔창에서 오류 확인 : 문법적 오류는 없지만 Season.봄 이 없기 때문에 오류!

  • 다시 제대로 출력된다!

 

728x90