enum
1. 탄생 배경
오늘 우리는 Java에서 다른 종류의 데이터 유형인 enum
. 이름은 enumerationenum
이라는 단어에서 유래했습니다 . 이 데이터 유형은 무엇이며 용도는 무엇입니까?
때때로 프로그래머는 가능한 값이 작은 고정 목록으로 제한되는 새로운 데이터 유형을 만들어야 합니다.
예를 들어, 유형은 , , , ... DayOfTheWeek
값만 사용할 수 있습니다. 총 7개의 값이 있습니다. 또는 유형은 , , , ... 값만 사용할 수 있습니다. 총 12개의 값이 있습니다.MONDAY
TUESDAY
WEDNESDAY
Month
JANUARY
FEBRUARY
MARCH
물론 다음과 같은 수( int
유형)를 사용할 수 있습니다. 1
— 월요일, 2
— 화요일 등. 그러나 누군가 실수로 8
or와 같은 유효하지 않은 값을 0
변수에 할당할 수 있습니다.
한 프로그래머는 요일(또는 월)이 0부터 시작하여 번호가 매겨진다고 생각하고 다른 프로그래머는 번호가 1부터 시작된다고 생각하는 상황을 쉽게 가질 수 있습니다.
이것이 바로 Java가 유한한 값 집합enum
으로 구성된 데이터 유형을 도입한 이유입니다 .
2. 타입 선언
새 enum
데이터 유형을 선언하는 방법은 다음과 같습니다.
enum TypeName
{
VALUE1,
VALUE2,
VALUE3
}
여기서 TypeName
는 새 유형(클래스)의 이름이며 가능한 값은 쉼표로 구분되고 중괄호로 묶입니다: Value1
, Value2
, Value3
.
예를 들어, 우리 자신을 만들어 봅시다 DayOfTheWeek
enum
:
암호 | 메모 |
---|---|
|
새로운 Day 유형 월요일 화요일 수요일 목요일 금요일 토요일 일요일 |
새 유형의 변수에 값을 할당하는 방법은 다음과 같습니다.
Day day = Day.MONDAY;
예:
암호 | 메모 |
---|---|
|
화면 출력은 다음과 같습니다.
|
3. 방법enum
유형 enum
에는 몇 가지 기본 제공 메소드가 있으며 그 중 두 가지는 매우 흥미롭습니다.
정적 values()
메서드는 유형의 모든 값 배열을 반환합니다 enum
.
암호 | 메모 |
---|---|
|
변수 는 유형(7개 요소) days 의 값을 포함하는 배열을 저장합니다. 배열의 내용을 화면에 표시합니다.Day
|
메서드 ordinal()
는 상수의 서수를 반환합니다. enum
클래스 가 아닌 값 으로 호출합니다 enum
.
암호 | 콘솔 출력 |
---|---|
|
|
4. 클래스로 전환
실제로 여기에는 마법 같은 것이 없습니다. 컴파일러는 우리에게 약간의 구문 설탕을 제공했습니다. 컴파일 타임에 Day
열거형은 일반 클래스로 변환됩니다.
코드, 단순화된 버전 | 메모 |
---|---|
|
Day class 정적 상수 목록 enum 의 모든 값을 포함하는 배열 특정 객체 의 값을 저장하는 변수 클래스 는 전용이므로 클래스 의 객체는 클래스 내에서만 생성될 수 있습니다 . 메서드는 개체 에서 호출해야 합니다 . 객체의 값인 필드를 반환합니다. 이 메서드는 클래스 의 모든 값이 포함된 정적 배열을 반환합니다. Day Day Day constructor Day Day ordinal Day value Day |
클래스에서 모든 정적 메서드와 변수를 제거하면 Day
다음과 같은 결과가 나타납니다.
암호 | 메모 |
---|---|
|
객체 value 의 값을 저장하는 변수 객체 는 생성자가 이므로 클래스 내에서만 만들 수 있습니다 . 이 메서드는 객체 의 를 반환합니다 . Day Day Day private ordinal() value Day |
즉, 여기서 무서운 일이 일어나지 않습니다. 컴파일러는 Day
클래스를 만들고, 값을 나타내는 상수를 추가하고 enum
, 필요한 메서드를 추가하고, 클래스 생성자를 만듭니다 private
. 나중에 생성자가 어떻게 작동하는지 살펴보겠습니다.
바라건대, 이제 우리가 이런 식으로 변수에 값을 할당하는 이유가 분명해졌습니다.
Day day = Day.MONDAY;
MONDAY
클래스 의 정적 필드(상수)일 뿐입니다 Day
. 클래스 외부에서 정적 메서드 및 필드에 액세스할 때 필드 또는 메서드 이름 앞에 클래스 이름을 표시해야 합니다.
5. 더 많은 방법enum
모든 enum
클래스에는 몇 가지 흥미로운 기능이 있습니다.
문자열로 또는 문자열에서 변환
열거형 개체를 문자열로 변환하려면 해당 toString()
메서드를 호출해야 합니다.
String str = Day.MONDAY.toString();
다른 방향(문자열에서 객체로 Day
)으로 변환하려면 정적 valueOf()
메서드를 사용할 수 있습니다.
Day day = Day.valueOf("MONDAY");
그것은 매우 편리하고 많은 경우에 도움이 될 것입니다.
숫자로 변환하고 다시 되돌리기
enum
개체를 숫자로 변환하는 방법을 이미 알고 있습니다 . ordinal()
메서드를 호출합니다.
int index = Day.MONDAY.ordinal();
다른 방향(숫자에서 객체로 Day
)으로 변환하려면 보다 투명한 구조가 필요합니다.
Day day = Day.values()[2];
예:
암호 | 메모 |
---|---|
|
Monday 월요일의 인덱스 가져오기: 0 월요일 2일 후의 요일 |
중요한 점:enum
값은 고정된 상수 집합이므로 == 를 사용하여 비교할 수 있습니다 . 즉, MONDAY
주소가 다른 두 개의 동일한 객체를 가질 수 없습니다. 각 열거형 값의 단일 인스턴스만 존재합니다. 그리고 그것은 ==를 사용하여 enum 변수를 비교하는 것이 항상 작동한다는 것을 의미합니다.
6. 자신만의 메서드를enum
enum
an은 컴파일 타임에 일반 클래스로 바뀌기 때문에 메서드를 선언할 수 있습니다. 이러한 메서드는 컴파일러가 생성하는 클래스에 간단히 추가됩니다. Day enum
예를 들어 배열이 아닌 열거형 값 목록을 반환하기를 원한다고 가정합니다 .
그런 다음 다음 코드를 추가할 수 있습니다.
암호 | 메모 |
---|---|
|
값 목록 뒤에는 세미콜론이 필요합니다. 개체 만들기 메서드 에서 반환된 배열에 값을 추가합니다 . 목록을 반환합니다. ArrayList values() |
이제 이 메서드를 코드에서 호출할 수 있습니다.
암호 | 메모 |
---|---|
|
변수 list 는 의 모든 값 목록을 저장합니다 Day enum . |
GO TO FULL VERSION