Java Enum

2SEONGA·2025년 2월 7일
1

Java

목록 보기
10/13

(1) Enum 을 통한 메서드 파라미터 제약

메서드 수행 시 파라미터에 너무 많은 경우의 수가 발생하는것이 싫은 경우 파라미터를 한정적으로 정의하여 사용

  • 메서드 수행에 파라미터를 Integer, String 를 사용한다면 아래와 같이 경우의 수가 너무 많아진다.
    • 정말 온갖 메세지들을 모두 넣을 수 있다.
public static void createMessage(String message) {
		System.out.println("당신에게 메세지를 보냅니다. : " + message);
}
  • 위의 수많은 경우의 수 문제를 해결하기위해, 아래와 같이 파라미터에 대해 경우의 수를 줄일 수 있을까?
    • 사랑합니다. 혹은 감사합니다. 메세지만 넣을 수 있게 넣을 수 있는 파라미터가 2개로 줄어들었다.
public static void createMessage("사랑합니다." 혹은 "감사합니다." message) {
		System.out.println("당신에게 메세지를 보냅니다. : " + message);
}

Enum 을 사용한다면, 아래와 같이 값의 경우의 수를 줄일 수 있다 : 값의 제약 (파라미터)
값의 제약으로써 파라미터의 제약 혹은 반환값의 제약

public enum MessageType {
		LOVE("사랑합니다."),
		THANKS("감사합니다.");
	
		private final String message;

		MessageType(String message) {
				this.message = message;
		}
		
		public String getMessage() {
				return this.message;
		}
}
  • Lombok 을 사용하지 않은 Enum 정의
@Getter
@RequiredArgsConstructor
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
public enum MessageType {
    LOVE("사랑합니다."),
    THANKS("감사합니다.");

    String message;
}
  • Lombok 을 사용한 Enum 정의
이렇게 Enum 을 정의하면 아래와 같이 깔끔하게 파라미터를 2가지 종류로 제약할 수 있다!
public static void createMessage(MessageType type) {
		System.out.println("당신에게 메세지를 보냅니다. : " + type.getMessage());
}

(2) Enum 을 통한 메서드 내 로직/변수 제약

  • Enum 으로 메서드 파라미터 값에 대한 제약뿐만 아니라, 메서드 내 로직에서 활용할 값에 대한 제약도 가능
    • (1) 메세지 뿐만 아니라 (2) 메세지를 전송할 매체도 제약 가능
    • (1) “사랑합니다.” 라는 메세지를 보낼때는 (2) SMS 메세지로 전송
    • (1) “감사합니다.” 라는 메세지를 보낼때는 (2) 이메일로 전송
      • Enum 으로 (2) 메세지를 전송할 매체에 대해서도 제약을 걸어보자
@Getter
@RequiredArgsConstructor
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
public enum MessageType {
    LOVE("사랑합니다.", SendMediaType.SMS),
    THANKS("감사합니다.", SendMediaType.EMAIL);

    String message;
    SendMediaType media;
}
@Getter
@RequiredArgsConstructor
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
public enum SendMediaType {
    SMS("010-0000-0000"),
    EMAIL("aaron@example.com");

    String sender;
}
public static void createMessage(MessageType type) {
    System.out.println("당신에게 메세지를 보냅니다. : " + type.getMessage());
    System.out.println("다음으로부터 전송되었습니다. : " + type.getMedia().getSender());
}
당신에게 메세지를 보냅니다. : 사랑합니다.
다음으로부터 전송되었습니다. : 010-0000-0000
  • MessageType.LOVE + SendMediaType.SMS
당신에게 메세지를 보냅니다. : 감사합니다.
다음으로부터 전송되었습니다. : aaron@example.com
  • MessageType.THANKS + SendMediaType.EMAIL

(3) String 문자열을 기반으로 Enum 선택하여 사용하기

  • findByName 이라는 함수를 만들어서,
    LOVE 혹은 THANKS 문자열로 Enum 존재여부 확인 및 반환 사용
@Getter
@RequiredArgsConstructor
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
public enum MessageType {
    LOVE("사랑합니다.", SendMediaType.SMS),
    THANKS("감사합니다.", SendMediaType.EMAIL);

    String message;
    SendMediaType media;
		
    public static MessageType findByName(String name) {
//      for (Element : Collection) = Enhanced For Loop
        for (MessageType each : MessageType.values()) {
            if (each.name().equals(name)) {
                return each;
            }
        }
        throw new RuntimeException("ENUM 내 존재하지 않는 이름입니다 : " + name);
    }
}
  • 백엔드 서버에서 일반적으로 API 로부터 외부 유저로부터 문자열 기반의 타입을 받아와 사용할 시 매우 유용
    • API 를 통해 유저로부터 메세지 전송 요청을 받을때 Enum 으로 받는게아니라,
    • Enum 에 해당하는 문자열을 받는다. 예를 들면, LOVE 혹은 THANKS 처럼
public static void createMessage(String type/* LOVE 혹은 THANKS */) {
    MessageType messageType = MessageType.findByName(type);
    System.out.println("당신에게 메세지를 보냅니다. : " + messageType.getMessage());
    System.out.println("다음으로부터 전송되었습니다. : " + messageType.getType().getSender());
}
profile
(와.. 정말 Chill하다..)

0개의 댓글