개인 학습자료
- Java에서 enum은 미리 정의된 값들의 집합을 나타내는 타입이다. 예를 들어, 요일, 상태, 사이즈, 나침반 등 고정된 값일 때 자주 사용한다.
- 열거 타입은 변수가 미리 정의된 상수 집합이 될 수 있도록 하는 특별한 데이터 타입이다.
- 변수는 미리 정의된 값 중 하나와 같아야 한다.
- 상수이기 때문에 열거 타입의 필드 이름은 대문자로 되어 있다.
- 고정된 상수 집합을 표현해야 할 때는 언제든 열거형 타입을 사용해야 한다.
- 기본문법
```
public enum enum이름 {
상수1, 상수2, 상수3, ...
}
```
예시 1) 요일을 enum으로 정의
public enum Day {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
예시 2) 상품 사이즈 정의
public enum size {
SMALL, MEDIUM, LARGE, XLARGE
}
enum 사용 예시)
Size size = Size.MEDIUM;
if (size == Size.MEDIUM) {
System.ou.tprintln("중간 사이즈입니다.");
}
** enum은 클래스와 비슷하게 사용할 수 있고, 각각 값들은 인스턴스(상수)로 취급한다.
** 필요하다면, 생성자나 필드, 메서드도 추가해서 쓸 수 있다.
- values() 메서드
- enum에 정의된 모든 상수들을 배열(Array) 형태로 반환한다.
- enum 타입에 자동으로 추가되는 static 메서드
- 반복문(for-each)등에서 모든 enum 값을 순회할 때 자주 사용한다.
- enum 타입을 정의하면, Java 컴파일러가 자동으로 static 메서드로 추가해 준다.
- 배열이 저장된 순서는 enum 선언 순서와 같다.
- 주로 for-each문으로 반복할 때 사용한다.
public enum Size {
}
for (Size s : Size.values()) {
System.out.println(s);
}
출력:
SMALL
MEDIUM
LARGE
- valueOf(String name) 메서드
- 매개변수로 전달된 문자열과 이름이 일치하는 enum 상수를 반환한다.
- 문자열 값을 enum 타입으로 변환할 때 사용한다.(예:외부 입력을 enum으로 매핑할 때)
- static 메서드이고, Java가 enum 타입마다 자동 생성해준다.
- 대소문자를 정확히 맞춰서 입력해야 한다.
- 일치하는 상수가 없으면, `IllegalArgumentException` 예외가 발생한다.
예시
Size size = Size.valueOf("MEDIUM");
System.out.println(size); //MEDIUM
** 만약 존재하지 않는 값을 넣으면 IllegalArgumentException이 발생한다.
java.lang.Enum 은 모든 enum 타입이 상속하는 추상(generic) 클래스이다.public enum Size { SMALL, MEDIUM, LARGE }
이 코드는 컴파일 하게 되면,
public final class Size Extends Enum<Size> {...}
이렇게 처리된다.
String name(): 상수의 이름(문자열)을 반환(예:"SMALL") - 선언 그대로의 이름int rdinal(): enum 상수가 정의된 순서의 인덱스(0부터)를 반환 (첫번째 상수는 0)int compareTo(E other): enum상수의 선언순서(ordinal)기준으로 비교boolean equals(Object other) : 두 enum 상수가 같은지 비교String toString(): 보통 name()과 같지만, 오버라이딩 가능Class<E> getDeclaringClass(): enum 클래스 객체 반환hashCode(): enum 상수 의 해시코드를 반환하는 메서드, 주로 Map의 Key로 쓸 때나, Set에서 중복 판단 등을 할 때 내부적으로 호출한다.haschCode()값이 있다.hashCode()구현은 Object클래스의 것과 유사하지만, 엔진이 보다 최적화 해서 제공한다. ```Enum 클래스를 상속받는 final class로 만들어진다. ```public enum Size {
SMALL, MEDIUM, LARGE
}
Size s = Size.MEDIUM;
System.out.println(s.name()); // "MEDIUM"
System.out.println(s.ordinal()); // 1
System.out.println(s.toString()); // "MEDIUM"
System.out.println(s.getDeclaringClass()); // class Size
java.lang.Object
->java.lang.Enum<GeoCode>
-> GeoCode
values(), valueOf() 등은 실제로 enum 타입을 정의할 때 컴파일러가 enum마다 자동으로 추가해주는 static 메서드다. 반면, java.lang.Enum의 메서드는 모두 각 enum 상수 인스턴스가 사용할 수 있는 인스턴스 메서드다.예시코드:
public enum Size {
SMALL, MEDIUM, LARGE
}
Size s = Size.MEDIUM;
// Enum에서 상속된 메서드를 사용
System.out.println(s.name()); // "MEDIUM"
System.out.println(s.ordinal()); // 1
System.out.println(s.toString()); // "MEDIUM"
System.out.println(s.compareTo(Size.SMALL)); // 1
// enum에 자동 추가된 static 메서드를 사용
Size[] arr = Size.values();
Size fromStr = Size.valueOf("LARGE");
java.util.EnumSet 패키지에 있다.public enum Day { MON, TUE }
EnumSet<DAY> set = EnumSet.noneOf(Day.class);
//null을 넣으려고 하면,
set.add(null); // 여기서 NullPointerException이 발생.
public enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }
// 모든 값
EnumSet<DAY> allDays = EnumSet.allOf(Day.class);
// 일부 값만
EnumSet<Day> weekend = EnumSet.of(Day.SAT, Day.SUN);
// 비어있는 EnumSet
EnumSet<Day> empty = EnumSet.noneOf(Day.class);
사용 예시:
EnumSet<Day> workingDays = EnumSet.range(Day.MON, Day.FRI);
for (Day d : workingDays) {
System.out.println(d);
}
//MON TUE WED THU FRI
add, remove, contains, size 등 Set에서 쓰는 기능 모두 지원한다.<<첨부> : 열거 유형 (자바™ 튜토리얼 > Java 언어 학습 >클래스와 객체)
Enum (Java SE 17 & JDK 17)
enum in Java - GeeksforGeeks >
try-catch-finally 구문을 사용해서 예외를 처리한다.// 기본구조
try {
// 예외가 발생 할 수 있는 코드
} catch (예외타입 변수명) {
// 예외가 발생했을 때 실행할 코드
} finally {
// (선택) 항상 실행할 코드 (예외 발생 여부와 무관)
}
예시:
try {
int result = 10 / 0; // 여기가 예외 발색(ArithmeticException)
System.out.println(result); // 실행되지 않음
} catch (ArithmeticException e) {
System.out.println("0으로 나눌 수 없습니다.");
} finally {
System.out.println("프로그램 종료");
}
//result
0으로 나눌 수 없습니다.
프로그램 종료
try {
// 예외 발생 가능 코드
} catch (ArithmeticException e) {
// 산술 예외 처리
} catch (NullPointerException e) {
// Null Pointer 예외 처리
} catch (Exception e) {
// 그 외의 모든 예외 처리(항상 마지막에 위치)
}
```
throw new IllegalArgumentException("잘못된 인자입니다.");
```
- 메서드에서 예외를 미루기(throws)
```
public void readFile() throws IOException (
// 파일을 읽는 코드
)
```
이 경우, 호출한 쪽에서 try-catch로 책임지고 처리해야 한다.
Trhowable- 예외와 오류를 모두 포함하는 최상위 클래스.
- Java에서 catch될 수 있는 것은 모두 이 클래스를 상속한다.
```
java.lang.Object
└─ java.lang.Throwable
```
1) Checked Exception (컴파일러가 체크)
IOException (입출력 오류)SQLException (DB관련)ClassNotFoundExceptionFileNotFoundExceptionThrowable의 하위: Exception vs Error
1) Exception
- 일반적인 예외 상황(입출력, 네트워크, 잘못된 로직 등)
- 직접처리(catch)하거나, throws로 전파
2) Error
- (심각한)시스템 오류나 JVM의 치명적 문제(메모리 부족 등)
- 개발자가 직접 처리하거나 catch해서 복구하지 않음
- OutOfMemoryError
- StackOverflowError
- VirtualMachineError
Throwable
├─ Error
└─ Exception
// RuntimeException - try-catch 없이 가능
public static void main(String[] args) {
int[] arr = new int[3];
System.out.println(arr[5]); //ArrayIndexOutBoundsExcepton, 컴파일OK, 실행중 에러!
}
// checked Exception - 반드시 처리 필요
public static void main(String[] args) {
FileReader fr = new FileReader("test.txt"); // 컴파일 에러! 예외 처리 요구
}
// -> 다음처럼 처리해야 컴파일 OK
public static void main(String[] args) throws FileNotFoundException {
FileReader fr = new FileReader("test.txt");
}
// 또는
try {
FileReader fr = new FileReader("test.txt");
} catch (FileNotFoundException e) {
// 예외 처리 코드
}
Exception을 상속받고,RuntimeException을 상속받는다.public class MyCheckedException extends Exception {
public MyCheckedException() {
super();
}
public MyCheckedException(String message) {
super();
}
} // 반드시 try-catch나 throws로 처리해야 컴파일 OK
(2) Unchecked Exception(컴파일이 강제되지 않는 예외)
public class MyUncheckedException extends RuntimeException {
public MyUncheckedException() {
super();
}
public MyUncheckedException(String message) {
super(message);
}
}
예외처리를 강제하지 않음, 필요에 따라 try-catch/throws
대부분 실무에서는 RuntimeException 상속 예외를 더 많이 쓴다고 한다.
public class MyException extends Exception {
public MyException() { super(); }
public MyException(String message) { super(message); }
public MyException(String message, Throwable cause) { super(message, cause); }
public MyException(Throwable cause) { super(cause); }
}// 예외 발생시키기
throw new MyCheckedException("사용자 정의 체크 예외!");
// 또는
throw new MyUncheckedException("사용자 정의 런타임 예외!");
예외 처리 예시:try {
throw new MyCheckedException("강제 예외 발생");
} catch (MyCheckedException e) {
e.printStackTrace();
}UserNotFoundExxception, InvalidOrderException)<참고: Creating Exception Classes (The Java™ Tutorials > Essential Java Classes > Exceptions)>