일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- jacoco
- 어댑티브 해시 인덱스
- DeleteAll
- 프리코스
- N+1
- useMutation
- 우테코
- BalancedTree
- 카카오 2차 코딩테스트
- useQuery
- 백기선 스터디
- mysql
- 멀티쓰레드 프로그래밍
- 회고
- Blue-Green
- 클래스
- 메서드명
- 블로그 병행
- 도커
- 계층별 구조
- SQL 실행순서
- 주간회고
- B+TREE
- ci/cd
- Jenkins
- 기능별 구조
- 월간회고
- InnoDB 버퍼 풀
- db
- java
- Today
- Total
Haneul's Blog
[Java] Enum 본문
목표 [백기선 자바 스터디 11주차]
자바의 열거형에 대해 학습하세요.
학습할 것
- enum 정의하는 방법
- enum이 제공하는 메소드 (values()와 valueOf())
- java.lang.Enum
- EnumSet
Enum이란?
enum은 서로 관련된 상수를 편리하게 선언하기 위한 것으로 상수를 여러 개 정의할 때 사용합니다. enum은 여러 상수를 정의한 후, 정의된 것 이외의 값은 허용하지 않습니다.
간단하게 enum을 정의하는 방법은 아래와 같습니다.
public enum Car {
Bently, K3, Audi,
}
enum은 왜 나왔을까요? 사실 enum을 처음 보았을 때 굳이 이걸써야 하나? 라는 생각을 했어서 그냥 넘어갔던 기억이 있습니다.
하지만 새로운 것이 나온 것에는 대부분 이유가 있기 때문에 자바를 조금 이해하고 개발을 조금 할 수 있을 때가 되었을 때는 enum을 왜 쓰면 좋은지 자연스럽게 알게 되었습니다.
본론으로 넘어가자면 enum은 잘 사용하게 되면 코드의 가독성을 높이고 논리적인 오류를 줄일 수 있습니다.
자세하게 설명을 하기 위해 enum을 사용하기 이전의 상수는 어떻게 처리했는지 확인해보겠습니다.
public class Test {
static final int BENTLY = 1;
static final int K3 = 2;
static final int AUDI = 3;
static final int GALAXY = 1;
static final int IPHONE = 2;
public static void main(String[] args) {
if (BENTLY == GALAXY) {
// 둘이 같은 의미로 쓴 것은 아니지만 값이 1로 같기 때문에 같다고 확인됌
}
}
}
위의 코드를 보면 BENLTY와 GALAXY를 같은 의미로 쓴 것이 아니지만 값이 1이기 때문에 if문을 통과하게 됩니다.
위의 코드는 극단적인 예시이지만 상수끼리의 비교에서 실수가 발생할 수 있습니다. 즉, 개발하는 입장에서 값이 같으면 안되는 의도를 가지고 있지만 컴파일 타임에서 인지하지 못하기 때문에 원하지 않은 결과를 받게 될 수 있습니다.(Thread-Safe하지 않음)
위의 코드를 enum으로 변환해서 비교해보겠습니다.
package level2;
enum Car {
BENTLY(1), K3(2), AUDI(3),
}
enum Phone {
GALAXY, IPHONE,
}
public class Test {
public static void main(String[] args) {
if (Car.BENTLY == Phone.GALAXY) {
// 타입이 다르기 때문에 컴파일 과정에서 에러 발생
}
}
}
위의 코드에서 Car, Phone을 enum으로 빼고, BENTLY와 GALAXY를 서로 비교하려고 한다면 type이 다르기 때문에 컴파일 과정에서 에러가 발생합니다. 즉, enum을 사용하면 Thread-Safe 해지는 것을 알 수 있습니다.
이처럼 enum을 사용하면 Thread-Safe해지면서 상수를 관리하기 편해지며 코드의 가독성을 높여준다는 많은 장점이 있기 때문에 사용합니다.
enum이 제공하는 메서드(values()와 valueOf())
values()와 valueOf()는 자바의 모든 열거형에 컴파일러가 자동으로 추가해줍니다.
values() 메서드
values() 메서드는 열거형의 모든 상수를 배열에 담아 반환해줍니다.
enum Car {
BENTLY, K3, AUDI
}
public class Test {
public static void main(String[] args) {
Car[] values = Car.values();
}
}
valueOf(String name)
valueOf()는 열거형 상수의 이름으로 문자열 상수에 대한 참조를 얻을 수 있게 해줍니다.
enum Car {
BENTLY, K3, AUDI,
}
public class Test {
public static void main(String[] args) {
Car k3 = Car.valueOf("K3");
if (Car.K3 == k3) {
// 같음
}
}
}
EnumSet
EnumSet은 Enum으로 Set 자료구조를 만들 수 있게 해줍니다.
EnumSet이 가진 메서드는 아래와 같습니다.
- allOf : enum에 정의된 정보를 모두 추가할 수 있습니다.
- noneOf : 아무것도 추가하지 않습니다.
- of : 요소를 직접 넣을 수 있습니다.
import java.util.EnumSet;
enum Car {
BENTLY, K3, AUDI,
}
public class Test {
public static void main(String[] args) {
EnumSet<Car> carsAllOf = EnumSet.allOf(Car.class);
EnumSet<Car> carsNoneOf = EnumSet.noneOf(Car.class);
EnumSet<Car> carsOf = EnumSet.of(Car.BENTLY, Car.AUDI);
}
}
'Java' 카테고리의 다른 글
[Java] I/O (0) | 2022.10.25 |
---|---|
[Java] 애노테이션 (0) | 2022.10.24 |
[Java] 멀티쓰레드 프로그래밍 (0) | 2022.10.22 |
[Java] 예외 처리 (0) | 2022.10.20 |
[Java] 인터페이스 (0) | 2022.10.19 |