Q.enum은 무엇이고 어떤 상황에서 사용되는지 설명해주세요.
A.열거형 타입으로 하나의 enum으로 등록하면 여러 타입의 변수들을 등록하고 관리하고 호출 할 수 있어서 쓰는 것 같습니다. 일주일 과 같은 데이터를 등록하면 편리합니다
Q.enum을 사용하는 주된 목적은 무엇이며, 어떤 장점이 있는지 설명해주세요. 또한, enum 내부에 메서드를 추가할 수 있는지 알고 계신가요?
A.코드의 가독성을 높이고 유지보수 성을 높이고 상수 값에 대한 안전성을 보장하기 위합니다.
enum에 메서드와 필드를 추가하여 복잡한 기능을 구현할 수 있습니다.
Q
Java enum의 생성자에 대해 설명해주세요. 생성자 안에서 필드를 초기화하는 방법과 enum 상수별로 다른 동작을 수행하는 방법이 있는지 알아봅시다.
A.
private 접근 제어자를 가지며 외부에서 호출 할 수 없습니다. enum 상수 별로 다른 동작을 수행하도록 메서드를 정의할 수도 있습니다. 이는 오버라이드를 사용해서 구현합니다. 필드 초기화 하는 방법은 MONDAY("월요일", false),
TUESDAY("화요일", false), 와 같이 초기화 해 줍니다.
Q. enum의 추상 메서드를 사용하여 enum 상수마다 반드시 구현해야 하는 메서드를 만들 수 있는지 알고 계신가요? enum에서 추상 메서드를 구현하는 방법과 활용 예시에 대해 알아보세요.
A.
public abstract double apply(double x, double y); 처럼 선언 하면 ENUM안의 익명 내부 클래스에서 반드시 오버라이드 해서 구현 해야 함
Q. Java에서 ENUM 내부에 정의된 추상 메서드를 구현하는 실제 예시 코드를 작성해보세요. 이를 통해 ENUM 내부의 추상 메서드가 각각의 상수에서 어떻게 다르게 구현되는지 확인해보는 것이 좋습니다.
A.
public enum Operation {
PLUS {
@Override
public double apply(double x, double y) {
return x + y;
}
},
MINUS {
@Override
public double apply(double x, double y) {
return x - y;
}
},
TIMES {
@Override
public double apply(double x, double y) {
return x * y;
}
},
DIVIDE {
@Override
public double apply(double x, double y) {
if (y == 0) {
throw new ArithmeticException("Division by zero");
}
return x / y;
}
};
// 추상 메서드 선언
public abstract double apply(double x, double y);
}
public class TestEnum {
public static void main(String[] args) {
double x = 10.0;
double y = 2.0;
for (Operation op : Operation.values()) {
System.out.printf("%f %s %f = %f%n", x, op, y, op.apply(x, y));
}
// 추가 테스트: 나눗셈에서 0으로 나누기
try {
double result = Operation.DIVIDE.apply(x, 0);
System.out.printf("Result: %f%n", result);
} catch (ArithmeticException e) {
System.out.println("Caught exception: " + e.getMessage());
}
}
}
설명
- Operation enum: PLUS, MINUS, TIMES, DIVIDE 네 개의 상수를 정의하고, 각 상수는 apply 추상 메서드를 오버라이드하여 고유의 동작을 구현합니다.
- PLUS: 두 수를 더합니다.
- MINUS: 두 수를 뺍니다.
- TIMES: 두 수를 곱합니다.
- DIVIDE: 두 수를 나눕니다. 나누는 수가 0일 경우 ArithmeticException을 던집니다.
- 추상 메서드 apply: Operation enum은 추상 메서드 apply를 정의하여 각 상수가 이를 반드시 구현하도록 강제합니다.
- 테스트 클래스 TestEnum: main 메서드에서 Operation enum의 모든 상수를 순회하며 각각의 apply 메서드를 호출합니다. 또한, DIVIDE 연산에서 0으로 나눌 때의 예외 처리도 테스트합니다.
이 예제 코드를 통해 enum 내부에 추상 메서드를 정의하고 각 상수에서 이를 다르게 구현하는 방법을 확인할 수 있습니다. enum 상수별로 고유한 동작을 정의할 수 있으며, 추상 메서드를 사용하여 공통 인터페이스를 강제할 수 있습니다.
Q. enum을 사용하는 이유와 enum의 장단점에 대해 설명해보세요. 또한, enum의 values() 메서드가 어떤 역할을 하는지 알아봅시다.
A. 사용하는 이유로는 타입안정성, 가독성 향상, 유지보수 용이성, 집합 관리 가 있고
장점은 타입 안전성, 가독성, 코드 중복 감소, 유연성, switch 문과의 통합 단점은 약간의 성능 오버헤드, 유연성 제한, 동일한 이름의 상수 제한이 있습니다. values()은 이넘 타입에서 자동으로 생성되는 메서드로 모든 상수를 배열 형태로 반환합니다. 디넘의 모든 상수를 순회하거나 목록으로 사용할 떄 유용합니다
Q. enum에서 switch 문을 사용하는 것이 권장되지 않는 이유는 무엇인지 알아보고, 대안적으로 어떤 방식으로 처리하는 것이 좋은지 검색하여 설명해보세요.
A.그 이유로는 유지보수의 어려움이 있고 형거형 상수의 분산 처리, 개방 폐쇄 원칙 위반이 있습니다.
대안 방법으로 다형성, 전략 패턴, enumMap 사용이 있습니다.
Q. 다형성을 이용한 대안 방법으로 구체적으로 어떻게 enum의 한계를 극복할 수 있는지에 대해 예시와 함께 설명해보세요. 또한, enumMap을 사용하여 어떻게 enum 타입의 상수와 값을 매칭하여 사용하는지 자세히 알아보는 것이 좋습니다.
A. 다형성을 이용해서 메서드 의 이름은 같게 하면서 내부 로직을 변경해서 반환되는 값을 변경시키는 방법으로 코드의 가독성을 증가시킬 수 있습니다.
enumMap은 enum을 전문적으로 다루는 구현체입니다.HASHMAP보다 빠르며, enum을 다루는 기본 메서드가 있기 때문에PUT과GET등으로 값을 넣거나 가져올 수 잇습니다.
Q. EnumMap이 왜 HashMap보다 효율적인지, EnumMap을 사용하는 장점은 무엇인지 좀 더 자세히 설명해보세요. 또한, EnumMap의 활용 예시와 Enum 클래스의 values() 메서드를 통해 Enum 상수에 접근하는 방법을 코드를 통해 보여주세요.
A. ENUMMAP은 내부적으로 배열을 사용하고 enum상수를 인덱스로 하여 값을 저장합니다. 따라서 공간 효율성이 좋고 속도도 해시 충돌이 없기 때문에 HASHMAP보다 빠른 성능을 가지고 있습니다. EnumMap 사용의 장점은 이넘만 쓰기때문에 안정적이로 성능과 이넘 타입을 키로 사용하기 때문에 타입 안전성을 가지고 있습니다.
이넘 VALUES()로 모든 상수 반환하는 코드 for (Day day : Day.values()) { System.out.println(day); }
Q. EnumMap을 사용할 때 주의할 점이나 특별히 고려해야 할 점에 대해 알아보고 고려해야 할 상황에 대한 예시를 공유해보세요.
A. 키로 사용 할 수 있는 enum 타입(이넘타입만) , 널 키 허용 안 됨, 초기 용량(상수 많으면 메모리 용량 차지), 불변성(공유 자원 으로 사용할 때 동기화 필요)이 있습니다.
Q. EnumMap의 초기화 용량은 어떻게 설정할 수 있고, 왜 이를 고려해야 하는지에 대해 더 알아보고, EnumMap을 공유 자원으로 사용할 때 어떻게 동기화를 구현해야 하는지 추가로 조사해보시기 바랍니다.
A. 이넘은 내부적으로 배열을 사용해서 이넘 상수에 대한 값을 저장합니다. 초기화 용량을 설정 할 수는 없지만 EnumMap은 enum 타입의 모든 상수에 대해 자동으로 공간을 할당합니다.
동기화는 자동으로 이루어지지 않으므로 멀티스레드 호나경일 때는 동기화가 필요합니다,. Collections.synchronizedMap()를 사용해서 enumMap을 생성 할 수 있습니다.
import java.util.Collections;
import java.util.EnumMap;
import java.util.Map;
enum Status {
STARTED, IN_PROGRESS, COMPLETED
}
public class SynchronizedEnumMapExample {
public static void main(String[] args) {
EnumMap<Status, String> statusDescriptions = new EnumMap<>(Status.class);
statusDescriptions.put(Status.STARTED, "Task has started");
statusDescriptions.put(Status.IN_PROGRESS, "Task is in progress");
statusDescriptions.put(Status.COMPLETED, "Task is completed");
// 동기화된 EnumMap 생성
Map<Status, String> synchronizedStatusDescriptions = Collections.synchronizedMap(statusDescriptions);
// 여러 스레드가 접근할 때 안전하게 접근 가능
synchronized (synchronizedStatusDescriptions) {
for (Map.Entry<Status, String> entry : synchronizedStatusDescriptions.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}
}
요약
- 초기화 용량: EnumMap은 모든 enum 상수에 대해 공간을 자동으로 할당하므로 초기화 용량 설정이 불필요합니다.
- 동기화: 멀티스레드 환경에서 안전하게 사용하려면 Collections.synchronizedMap()을 사용하여 동기화된 EnumMap을 생성해야 합니다.
이러한 방법을 통해 EnumMap을 효율적으로 초기화하고 안전하게 사용할 수 있습니다.
'[프래피티]' 카테고리의 다른 글
| 자바에서 자주 쓰는 자료구조 2 (0) | 2024.05.17 |
|---|---|
| 자바에서 자주 쓰는 자료구조1 (0) | 2024.05.17 |
| 자바 어노테이션 (0) | 2024.05.17 |
| Checked Exception과 Unchecked Exception (0) | 2024.05.17 |
| 자바의 예외 (0) | 2024.05.17 |