Java/[인프런 김영한 실전 자바 - 중급편]

[인프런 김영한 실전 자바 - 중급편] 열거형 - ENUM

h2boom 2024. 7. 19. 18:58

ENUM

  • 문자열을 사용하는 경우 특정 상황에서 문제가 발생할 수 있다.
    • 타입 안정성 부족 : 문자열은 오타가 발생하기 쉽고 유효하지 않은 값이 입력될 수 있다.
      • ex) 만약 등급(GOLD, SILVER ...)에 대해서 입력받는 경우
        GOLD를 소문자 gold / 오타로 인해 golld 등의 오타 및 유효하지 않은 값이 입력될 수 있다.
      • 이러한 실수들은 컴파일 시 오류 감지가 불가하다.
    • 데이터 일관성 : "GOLD", "gold", "Gold" 등 다양한 형식으로 문자열을 입력할 수 있기에 일관성이 떨어진다.
    • String은 어떤 문자열이든 받을 수 있기 때문에 문법에 어긋나지 않는다.
      • 이런 문제를 해결하기 위해서 특정 범위로 값을 제한해야한다.
        • ex) "SIVER", "GOLD", "DIAMOND"라는 정확한 문자만 입력받을 수 있도록 범위를 제한해야 한다.
  • static final String과 같이 문자열 상수를 만들어 사용하면 상수의 이름을 잘못 적을 시 컴파일 오류가 발생한다.
    • 문자열 상수를 만들어 놓더라도 사용을 하지 않는다면 근본적인 문제가 해결되지 않는다!!
  • 결국 이러한 근본적인 문제를 해결하기 위해서는 타입 안전 열거형 패턴을 사용해야 한다.

타입 안전 열거형 패턴 (Type-Safe Enum Pattern)

  • enumeration (열거) : 어떤 항목을 나열하는 것으로 타입 안전 열거형 패턴을 사용하면 나열한 항목만 사용할 수 있다.
    • String처럼 아무런 문자열이나 사용할 수 있는 것이 아닌 나열한 항목 범위 안에서만 사용할 수 있다.
  • 타입 안전 열거형 패턴의 장점
    • 타입 안정성 향상 - 정해진 객체만 사용할 수 있기 때문에 잘못된 값을 입력하는 문제를 방지할 수 있다.
      • 특정 메소드에서 특정 열거형 타입의 값을 요구하는 경우 그 타입의 인스턴스만 전달할 수 있다.
    • 데이터 일관성 - 정해진 객체만 사용하므로 데이터 일관성이 보장된다.
    • 제한된 인스턴스 생성 - 사전에 정의된 몇 개의 인스턴스만 생성하고 외부에서는 이 인스턴스만 사용할 수 있도록 함으로 미리 정의된 값들만 사용하도록 보장한다.
  • 타입 안전 열거형 패턴의 단점
    • 직접 타입 안전 열거형 패턴을 구현하려면 유의해야할 점들이 많다.
      => 그래서 자바에서 ENUM Type 열거형을 제공한다.

열거형 - ENUM Type

  • 열거는 일련의 명명된 상수들을 사용해서 코드 내에서 미리 정의된 값들의 집합을 나타낸다.
  • 타입 안정성을 제공, 코드 가독성을 높이고 예상 가능한 값들의 집합을 표현하는데 사용된다.
public enum Grade {
    BASIC, GOLD, DIAMOND
}
  • 열거형 특징
    • 열거형을 정의할 때 class 대신 enum을 사용한다.
    • 원하는 상수의 이름을 나열한다.
    • 열거형도 클래스다.
    • 자동으로 java.lang.Enum을 상속받는다.
      • 다른 클래스를 상속받을 수 없다. (다중 상속이 불가하기 때문)
    • 외부에서 임의로 생성할 수 없다.
    • static import를 사용해서 더 가독성 좋은 코드로 작성할 수 있다.
    • 열거형은 인터페이스를 구현할 수 있다.
      • 추상 메소드를 선언, 구현할 수 있다. (익명 클래스와 같은 방식을 사용한다.)

 

  • 열거형(ENUM) 장점
    • 타입 안정성 향상 : 사전에 정의된 상수들로만 구성되있기에 유효하지 않은 값이 입력될 수 없다.
    • 간결성 및 일관성 : 코드가 간결해지고 데이터 일관성이 보장된다.
    • 확장성: 새로운 것을 추가하고 싶을 때 ENUM에 새로운 상수를 추가하기만 하면 된다.

 

  • ENUM의 주요 메소드
    • values() : 모든 ENUM 상수를 포함하는 배열을 리턴
    • valueOf() : 주어진 이름과 일치하는 ENUM 상수 리턴
    • name() : ENUM 상수의 이름을 문자열로 리턴
    • ordinal() : ENUM 상수의 선언 순서를 리턴
      • ordinal()의 값은 사용하지 않는 것이 좋다.
        값을 사용하다가 중간에 상수를 선언하는 위치가 변경되면 전체 상수의 위치가 모두 변경되기 때문에
    • toString() : ENUM 상수의 이름을 문자열로 반환 (오버라이딩 할 수 있다.)

 

  • Arrays.toString()은 배열의 참조 값이 아닌 배열 내부 값을 출력할 때 사용한다.

출처: [인프런 김영한 실전 자바 - 중급편]

https://www.inflearn.com/course/%EA%B9%80%EC%98%81%ED%95%9C%EC%9D%98-%EC%8B%A4%EC%A0%84-%EC%9E%90%EB%B0%94-%EC%A4%91%EA%B8%89-1/dashboard

 

김영한의 실전 자바 - 중급 1편 강의 | 김영한 - 인프런

김영한 | 실무에 필요한 자바의 다양한 중급 기능을 예제 코드로 깊이있게 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바 문법을

www.inflearn.com