[Java] enum
2022. 10. 5. 15:07ㆍDev.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의 장점 >
- 코드가 단순해지며, 가독성이 좋아짐
- 인스턴스 생성과 상속을 방지 ⇒ 상수값의 타입안정성 보장
- enum을 사용해 새로운 상수들의 타입을 정의함으로써 정의한 타입이외의 타입을 가진 데이터값을 컴파일시 체크함(⇒ 문법적 오류를 찾아낼 수 있다)
- 키워드 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 의 메서드 >
- values() : 해당 enum 타입에 해당하는 배열로 모든 상수를 리턴
- name() : 해당 enum 상수의 이름을 문자열로 리턴
- ordinal() : 해당 enum 상수의 순서번호(인덱스)를 정수로 리턴 ★
- 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
'Dev.Program > Java & Spring' 카테고리의 다른 글
[Java] java.lang.Object 클래스 - (1) equals() (1) | 2022.10.05 |
---|---|
[Java] 향상된for문 / 어노테이션 (1) | 2022.10.05 |
[Java] 인터페이스(interface) (1) | 2022.10.05 |
[Java] 추상(Abstract) 클래스/메서드 (0) | 2022.10.05 |
[Java] 싱글톤 디자인 패턴(Singleton Design Pattern) / final 키워드 (0) | 2022.10.05 |