TaBo
개척하는 기록
TaBo
전체 방문자
오늘
어제
  • 기록들 (63)
    • Programming (35)
      • Java (19)
      • Servlet&Jsp (4)
      • Spring (4)
      • SpringBoot (1)
      • 기타 (2)
      • BOJ (5)
    • CS (16)
      • 자료구조 (4)
      • 알고리즘 (4)
      • 운영체제 (5)
      • 기본 용어 (3)
    • Project (4)
      • [Spring] 게시판 (4)
    • 나에 대한 기록 (8)

블로그 메뉴

  • Github

인기 글

태그

  • 스프링 게시판
  • OS
  • 자바
  • spring
  • 운영체제
  • c++
  • java
  • 백준
  • Spring 게시판
  • 알고리즘

최근 글

티스토리

hELLO · Designed By 정상우.
TaBo

개척하는 기록

[Java] Enum 클래스
Programming/Java

[Java] Enum 클래스

2022. 8. 29. 22:28

※ 본문은 혼자 공부한 내용을 기록한 글입니다. 오개념이 있다면 댓글로 알려주세요!

 

[ 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
    'Programming/Java' 카테고리의 다른 글
    • [Java] 컬렉션 프레임워크
    • [Java] length, length(), size() 차이
    • [Java] Object 클래스
    • [Java] 타입 변환 (type conversion) - 자동 타입 변환, 강제 타입 변환
    TaBo
    TaBo

    티스토리툴바