※ 본문은 혼자 공부한 내용을 기록한 글입니다. 오개념이 있다면 댓글로 알려주세요!
[ 1 ] Enum 클래스란?
enum 이란 관련있는 상수(constant)들의 집합을 의미한다.
Java에서는 final, interface 활용 등 상수를 정의할 수 있는 여러가지 방법이 있다. 하지만, 여러가지 불편함과 한계가 있었기에 JDK 1.5부터 enum 을 사용할 수 있게 되었다.
enum 클래스의 대표적인 장점은 다음과 같다.
(1) 코드가 단순해진다.
(2) 인스턴스 생성과 상속을 방지할 수 있다.
(3) 구현의 의도가 열거임을 분명하게 나타낼 수 있다.
final과 interface로 상수 정의하는 방법을 먼저 살펴보며 enum 클래스의 장점을 느껴보자.
[ 2 ] final 활용
public class Main {
private final static int APPLE = 1;
private final static int PEACH = 2;
private final static int BANANA = 3;
public static void main(String[] args) {
int type = BANANA;
switch(type) {
case APPLE:
System.out.println(60);
break;
case PEACH:
System.out.println(30);
break;
case BANANA:
System.out.println(90);
break;
}
}
}
위 코드처럼 final static 으로 상수를 선언할 수 있다. 하지만, 더 많은 변수를 추가하게 되면 한 눈에 어떤 상수가 있는지 파악하기 어렵고, 같은 이름을 가진 상수가 정의되면 문제가 발생할 수 있다.
[ 3 ] interface 활용
interface Fruit {
int APPLE = 1;
int PEACH = 2;
int BANANA = 3;
}
public class Main {
public static void main(String[] args) {
int type = Fruit.BANANA;
switch(type) {
case Fruit.APPLE:
System.out.println(60);
break;
case Fruit.PEACH:
System.out.println(30);
break;
case Fruit.BANANA:
System.out.println(90);
break;
}
}
}
위처럼 interface를 활용하면 public final static을 생략할 수 있어 코드도 간결해지고, 다른 interface 내에서 같은 이름의 상수를 선언할 수도 있게 된다.
하지만, interface를 활용할 때에도 치명적인 단점이 있다.
interface Company {
int APPLE = 1;
int GOOGLE = 2;
int SAMSUNG = 3;
}
interface Fruit {
int APPLE = 1;
int PEACH = 2;
int BANANA = 3;
}
public class ConstantDemo {
public static void main(String[] args) {
if(Company.APPLE == Fruit.APPLE) {
System.out.println("두 상수는 같다.");
}
}
}
서로 비교하면 안 되는 값들이 비교 가능해진다는 문제가 있다. 컴파일 단계에서는 문제가 없어서 추후 런타임에서 문제가 발생할 수 있고(원인 찾기 어려움), 개발자의 의도와 다른 결과가 도출될 수 있다.
[ 4 ] 상수의 인스턴스화
위 문제를 해결하기 위해 우리는 상수를 인스턴스화할 수 있다.
class Company {
public final static Company APPLE = new Company();
public final static Company GOOGLE = new Company();
public final static Company SAMSUNG = new Company();
}
class Fruit {
public final static Fruit APPLE = new Fruit();
public final static Fruit PEACH = new Fruit();
public final static Fruit BANANA = new Fruit();
}
위처럼 각 상수를 인스턴스화한다면, 각 상수는 모두 다른 값을 가지므로 더이상 비교가 불가능해진다. 하지만, 상수 사용 시 가독성을 높일 수 있는 switch의 조건문에는 class를 사용할 수 없다는 단점이 있다.
[ 5 ] Enum
enum 클래스는 위의 모든 단점을 커버한다. enum을 비교할 때에는 실제 값뿐만 아니라 데이터 타입까지 체크하기 때문에 값을 비교할 수 없고, switch의 조건문에도 사용가능하다.
enum Fruit {
APPLE, PEACH, BANANA;
}
public class Main {
public static void main(String[] args) {
Fruit type = Fruit.PEACH;
switch(type) {
case APPLE:
System.out.println(50 + "kcal");
break;
case PEACH:
System.out.println(30 + "kcal");
break;
case BANANA:
System.out.println(90 + "kcal");
break;
}
}
}
또한, 이름을 나열함으로써 상수를 선언할 수 있어 코드가 간결해진다.
enum은 클래스이므로 필드와 메소드도 가질 수 있다.
enum Fruit {
APPLE("red"), PEACH("pink"), BANANA("yellow");
private String color;
public String getColor() {
return this.color;
}
Fruit(String color) {
this.color = color;
}
}
public class Main {
public static void main(String[] args) {
Fruit type = Fruit.PEACH;
switch(type) {
case APPLE:
System.out.println(50 + "kcal, color " + Fruit.APPLE.getColor());
break;
case PEACH:
System.out.println(30 + "kcal, color " + Fruit.PEACH.getColor());
break;
case BANANA:
System.out.println(90 + "kcal, color " + Fruit.BANANA.getColor());
break;
}
}
}
생성자 매개변수에는 위 소스코드처럼 상수 선언부 뒤 ( ) 를 통해 인자를 전달할 수 있다.
마지막으로 enum의 values() 메소드를 활용하여 해당 열거체의 모든 상수를 저장한 배열을 생성할 수 있다.
enum Fruit {
APPLE("red"), PEACH("pink"), BANANA("yellow");
private String color;
public String getColor() {
return this.color;
}
Fruit(String color) {
this.color = color;
}
}
public class Main {
public static void main(String[] args) {
Fruit[] fruit = Fruit.values();
// APPLE - PEACH - BANANA 순으로 출력
for(Fruit f : fruit) {
System.out.println(f);
}
}
}
[ 참고자료 ]
http://www.tcpschool.com/java/java_api_enum
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
https://www.nextree.co.kr/p11686/
Java: enum의 뿌리를 찾아서...
이번 글에서는 자바 1.5버전부터 새롭게 추가된 열거형 상수인 enum(enumeration)에 대해 알아보겠습니다. 열거형은 서로 연관된 상수들의 집합입니다. 이번 글은 enum 정의와 enum 사용방법, 그리고 enum
www.nextree.co.kr
https://www.youtube.com/watch?v=AWEvmFs7RJ4
'Programming > Java' 카테고리의 다른 글
[Java] 컬렉션 프레임워크 (1) | 2022.10.03 |
---|---|
[Java] length, length(), size() 차이 (1) | 2022.10.02 |
[Java] Object 클래스 (0) | 2022.08.25 |
[Java] 타입 변환 (type conversion) - 자동 타입 변환, 강제 타입 변환 (0) | 2022.08.18 |
[Java] 다형성(Polymorphism) (0) | 2022.08.16 |