Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 데이터베이스
- FCM
- Spring Boot
- springboot
- deleteById
- NotEmpty
- Item04
- @Valid
- multi module
- Service Locator
- 트랜잭션
- restTemplate
- Proxy Patter
- @MockBean
- Web
- Firebase
- 이펙티브 자바
- NotBlank
- Service Locator 패턴
- Effetive Java
- 플라이웨이트
- java
- db
- 디자인 패턴
- Connection Pool
- @ControllerAdvice
- @SpyBean
- Effective Java
- JPA
- SQL 삽입 공격
Archives
- Today
- Total
NoTimeForDawdling
Enum 클래스 파헤치기 본문
Enum Class란?
Enum은 열거형이라고 불리며, 서로 연관된 상수들의 집합을 의미합니다.
Enum의 특징
- 열거 타입 자체는 클래스입니다.
- 상수 하나당 자신의 인스턴스를 하나씩 만들어 public static final 필드로 공개합니다.
- 열거형으로 선언된 순서에 따라 0부터 인덱스 값을 가집니다.(순차적으로 증가)
- 열거형으로 지정된 상수들은 모두 대문자로 선언해야 합니다.
- 열거 타입은 밖에서 접근할 수 있는 생성자를 제공하지 않으므로 사실상 final입니다.
- 따라서 클라이언트가 인스턴스를 직접 생성하거나 확장할 수 없으므로 열거 타입 선언으로 만들어진 인스턴스들은 딱 하나만 존재함이 보장됩니다.
Enum의 장점
- 컴파일타임 타입 안전성을 제공합니다.
- 열거 타입을 매개변수로 받는 메서드가 있다면, 건네받은 참조는 열거 타입의 값 중 하나입니다.
- 다른 타입의 값을 넘기면 컴파일 오류가 납니다.
public enum Apple {
FUJI, PIPPIN, GRANNY_SMITH;
public static void appleType(Apple appleType) {
}
public static void test() {
appleType(0); // complie error
appleType(Apple.FUJI);
}
}
- 열거 타입의 toString 메서드는 출력하기 적합한 문자열을 제공합니다.
- 열거 타입에 임의의 메서드나 필드를 추가할 수 있고 임의의 인터페이스를 구현할 수 있습니다.
Enum static 메서드
메서드 종류
- valueOf(String): 매개변수로 주어진 String 값을 해당 Enum 클래스에서 일치하는 이름을 갖는 원소를 반환합니다.
- valueOf(Class, String): 넘겨받은 Class에서 String값을 찾아 enum에서 가져옵니다.
- values(): enum에 정의한 상수들을 순서대로 enum 타입의 배열로 리턴합니다.
valueOf(String) 예제
public enum OperationType{
PLUS, MINUS, MULTIPLE, DIVIDE
}
public class Calculator{
public static void main(String[] args){
Calculator calculator = new Calculator();
OperationType type1 = OperationType.PLUS;
OperationType type2 = OperationType.valueOf("MINUS");
System.out.println(type1);
System.out.println(type2);
}
}
//출력 결과
//PLUS
//MINUS
values() 예제
public enum OperationType{
PLUS, MINUS, MULTIPLE, DIVIDE
}
public class Calculator{
public static void main(String[] args){
for(OperationType type : OperationType.values()){
System.out.println(type);
}
}
}
//출력 결과
//PLUS
//MINUS
//MULTIPLE
//DIVIDE
열거 타입 상수마다 각각의 동작 설정하기
열거 타입 상수마다 동작이 달라져야 하는 상황이 있을 겁니다.
예를 들어 사칙연산 계산기의 연산 종류를 열거 타입으로 선언하고, 실제 연산까지 열거 타입 상수가 직접 수행한다고 가정해봅시다.
switch문 사용 예제
public enum Operation {
PLUS, MINUS, TIMES, DIVIDE;
public double calculate(double x, double y) {
switch (this) {
case PLUS:
return x + y;
case MINUS:
return x - y;
case TIMES:
return x * y;
case DIVIDE:
return x / y;
}
throw new AssertionError(String.format("알 수 없는 연산 : %s", this));
}
}
위 코드는 동작은 하지만 깨지기 쉬운 코드입니다.
예를 들어 새로운 상수를 추가하면 해당 case 문도 추가해야 합니다. 개발자가 깜빡한다면, 컴파일은 되지만 새로 추가하 연산을 수행할 때 "알 수 없는 연산"이라는 런타임 오류가 발생합니다.
상수별 추상 메서드 구현
열거 타입에 calculate라는 추상 메서드를 선언하고 각 상수별 자신에 맞게 재정의하는 방법이 있습니다.
public enum Operation {
PLUS("+") {
public double calculate(double x, double y) {
return x + y;
}
}, MINUS("-") {
public double calculate(double x, double y) {
return x - y;
}
}, TIMES("*") {
public double calculate(double x, double y) {
return x * y;
}
}, DIVIDE("/") {
public double calculate(double x, double y) {
return x / y;
}
};
private final String symbol;
Operation(String symbol) {
this.symbol = symbol;
}
public abstract double calculate(double x, double y);
}
상수별 메서드 구현을 사용하면 새로운 상수를 추가할 때 추상 메서드(calculate)를 재정의하지 않았다면 컴파일 오류로 알려줍니다.
'Java' 카테고리의 다른 글
얕은 복사(Shallow Copy) vs 깊은 복사(Deep Copy) (0) | 2021.02.25 |
---|---|
접근 제어자(Access Modifier) (0) | 2021.02.24 |
[Java] 불변 리스트(Immutable ArrayList) (0) | 2021.02.15 |
Arrays.asList() (0) | 2021.02.15 |
Wrapper class Cache 파헤치기 (0) | 2021.02.13 |