Java enums

김정훈·2024년 4월 25일

Java

목록 보기
27/48

열거형(enums)


상수만을 위한 클래스

1. 열거형 정의와 사용

enum 클래스명{
	상수, 상수, 상수 
}

상수간의 비교 ==

2. java.lang.Enum

모든 열거형의 상위 클래스

enum Transport{
	BUS,
    SUBWAY,
    TAXI,
}
  • 컴파일러가 Enum에서 상수를 정의할때 자동으로 생성을 해주기 때문에 따로 생성자로 객체를 생성하지않아도된다.
  • 모든 Enum클래스는 java.lang.Enum의 하위클래스이다.
  • 외부에서 객체에서 생성을 못하도록 기본생성자가 private이다.(상수의 특성 값이 하나여야만 한다는것을 지키기위해서)
  • enum클래스는 추상클래스이기 떄문에 정의를 하면서 추상 생성자메서드를 정의할수도있다.
    abstract class Transportaiton extends java.lang.Enum{
    	public static final BUS = new Transportaiton(){};
       public static final SUBWAY = new Transportaiton(){};
       public static final TAXI = new Transportaiton(){};
       
       private Transporation(){}
    }

1) Enum 클래스에 정의된 메서드

  • String name() : Enum 상수이름을 문자열로 변환
    (String toString()동일)

  • int ordianl() : 상수의 위치번호

    package exam01;
    
    public class Ex04 {
       public static void main(String[] args) {
           Transportation trans = Transportation.BUS;
           String str = trans.name(); //trans.toString()
           System.out.println(str); //> BUS
    
           int ordianl = trans.ordinal();
           System.out.println(ordianl); //> 0번째 출력
       }
    }
  • valeOf(String str) : 호출 객체가 Enum상수이므로 Class 객치는 X
    (문자열 → 상수, 상수 → 문자열)
    데이터베이스는 자바객체를 인식하지 못하기 때문에 상수를 문자열로 변환한다.

  • values() : 정의된 상수 목록을 배열로 변환

2) 컴파일러가 자동으로 추가해주는 메서드

클래스 클래스를 사용안해도된다.

  • valeOf(String str)
    public class Ex05 {
       public static void main(String[] args) {
           String trans1 = "BUS";
           Transportation BUS = Transportation.valueOf(trans1);
       }
    }
  • values()
    public class Ex06 {
       public static void main(String[] args) {
           Transportation[] trans = Transportation.values();
           System.out.println(Arrays.toString(trans)); //>[BUS, SUBWAY, TAXI]
       }
    }

4. 열거형에 멤버 추가하기

public enum Transportation {
    BUS(1400),
    SUBWAY(1300),
    TAXI(4500);

    private final int fare;

    Transportation(int fare){
        this.fare = fare;
    }

    public int getFare(){
        return fare;
    }

    public abstract int getTotal(int person);
}

5. 열거형에 추상메서드 추가하기

열거형에 추상 메서드를 선언하면 각 열거형 상수가 이 추상 메서드를 반드시 구현해야 한다.
추상클래스나 인터페이스를 가지고 추상 메서드를 구현함으로써 익명 클래스를 작성하는 것과 유사하다

public enum Transportation {
    BUS(1400){},
    SUBWAY(1300){},
    TAXI(4500){};

    private final int fare;

    Transportation(int fare){
        this.fare = fare;
    }

    public int getFare(){
        return fare;
    }

}

애너테이션(annotation)


정보 전달을 위한 목적이 정해진 클래스의 일종

@interface 애노테이션 명{

}

컴파일러가 자동 변환

interface 애노테이션명 extends java.lang.annotation.Annotation{
}

1. 표준 애너테이션

JDK에 이미 정의된 애노테이션

  • @Override : 재정의된 메서드임을 알려주는 목적
  • @Deprecated : 향 후 제거될 가능성이 있는 메서드 임을 알려주는 목적

2. 메타 애너테이션

애너테이션을 정의할때 필요한 애너테이션

  • @Target : 애너테이션 적용 범위
    • ElementType : 적용범위 enum 상수
      • METHOD : 메서드 위에 적용
      • FIELD : 멤버 변수
      • CONSTRUCTOR : 생성자
      • PARAMETER : 매개 변수
      • LOCAL_VARIABLE : 지역변수
      • TYPE_PARAMETER : 참조변수
      • TYPE_USE : 참조자료형
  • @Retention : 정보 전달 시점
    • RetentionPloicy
      • SOURCE
        java 파일 상에 유지, 컴파일러 완료 후(class파일)에는 제거
        컴파일러가 필요한 정보를 제공
        컴파일러가 필요한 정보
      • CLASS(기본값)
        애너테이션이 자바 파일상의 유지가 되고 컴파일 완료 후 유지
        정보전달 x
        기본값임에도 사용 X
      • RUNTIME
        애너테이션이 java 파일 상에 유지, 컴파일 완료 후 (class 파일) 유지
        정보전달이 실행 중에 제공

마커 애너테이션

단순 정보 전달 목록(설정 X) (@Override)

 package exam03;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnno {
}
 package exam03;

@MyAnno
public class Ex01 {
    @MyAnno
    private String str;
    @MyAnno
    public void method(){

    }
}

애너테이션에서 추가 정보 전달 - 추상 메서드 정의

profile
안녕하세요!

0개의 댓글