Chef.Yeon
Code Cook
Chef.Yeon
전체 방문자
오늘
어제
  • 분류 전체보기 (230)
    • 게임 개발 (1)
      • Unity (1)
    • Android (27)
      • Kotlin (19)
      • 우아한테크코스 5기 (4)
    • Language (11)
      • 파이썬 (3)
      • Java (7)
    • DB (2)
      • SQL (16)
    • Spring (25)
    • 코딩테스트 (56)
    • Git (1)
    • TIL (85)
    • DevOps (6)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Android
  • 문자열
  • ec2
  • 다이나믹 프로그래밍
  • 코딩테스트
  • 코틀린 인 액션
  • 파이썬
  • spring
  • webflux
  • 코틀린
  • til
  • java
  • SQL
  • grafana
  • 백준
  • 프로그래머스
  • 내림차순
  • MariaDB
  • kibana
  • 에라토스테네스의 체
  • enum
  • Wil
  • kotlin
  • 레포지토리
  • Docker
  • 프리코스
  • rsocket
  • 우아한테크코스
  • elasticsearch
  • 안드로이드

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Chef.Yeon

Code Cook

[TIL - 20231228] Interface의 default 메서드를 활용한 Enum 확장
TIL

[TIL - 20231228] Interface의 default 메서드를 활용한 Enum 확장

2023. 12. 28. 20:35

 

💻문제점

Enum 값에 숫자 값을 넣어주기 위해 다음과 같이 setCalorie()를 선언했다.

문제는, OVER_INTAKE 밖에 사용되지 않는 메서드이기 때문에, 그 외에는 Enum의 message만 반환하는 점이 어색함이 많았다.

 

NotificationMessage.java

@Getter
public enum NotificationMessage {
    // sse
    SSE_CONNECTION("SSE 연결이 완료되었습니다."),

    // intake
    OVER_INTAKE("오늘의 칼로리 섭취량이 %dKcal 초과되었습니다.");

    private final String message;

    NotificationMessage(String message) {
        this.message = message;
    }

    public String setCalorie(int calorie) {
        if (this == OVER_INTAKE) {
            return String.format(this.message, calorie);
        }
        return this.message;
    }

📃시도

처음에는 인터페이스를 사용해서 오버라이딩을 하려고 했었다.

 

MessageFormatter.java

public interface MessageFormatter {
    String getMessage(int data);
}

 

 

NotificationMessage.java

@Getter
public enum NotificationMessage implements MessageFormatter {
    // sse
    SSE_CONNECTION("SSE 연결이 완료되었습니다.") {
        @Override
        public String getMessage(int data) {
            return null;
        }
    },
    // intake
    OVER_INTAKE("오늘의 칼로리 섭취량이 %dKcal 초과되었습니다.") {
        @Override
        public String getMessage(int calorie) {
            return String.format(this.getMessage(), calorie);
        }
    };

    private final String message;

    NotificationMessage(String message) {
        this.message = message;
    }
}

 

이 경우에는 OVER_INTAKE를 getMessage(int ..)로 가져올 때 값을 설정해줄 수 있지만, SSE_CONNECTION이 불필요한 메서드의 오버라이딩을 하게된다는 문제점이 있다.


🔍해결

인터페이스는 default 키워드를 사용해 메서드를 정의할 수 있다.

이 경우에는 인터페이스에서 구현 내용도 함께 작성할 수 있다.

 

MessageFormatter.java

public interface MessageFormatter {
    default String getMessage() {
        return "";
    }

    default String getMessage(int data) {
        return getMessage();
    }
}

 

 

NotificationMessage.java

public enum NotificationMessage implements MessageFormatter {
    // sse
    SSE_CONNECTION("SSE 연결이 완료되었습니다."),
    // intake
    OVER_INTAKE("오늘의 칼로리 섭취량이 %dKcal 초과되었습니다.") {
        @Override
        public String getMessage(int calorie) {
            return String.format(this.getMessage(), calorie);
        }
    };

    private final String message;

    NotificationMessage(String message) {
        this.message = message;
    }

    @Override
    public String getMessage() {
        return this.message;
    }
}

 

NotificationMessage에서는 @Getter를 제거하고, 인터페이스의 getMessage()를 오버라이딩하도록 변경했다.

default로 getMessage(int data)를 선언했기 때문에, SSE_CONNECTION에서 해당 메서드를 오버라이딩할 필요가 없다.

 

인터페이스를 사용하여 확장성 있는 Enum 클래스를 정의할 수 있었다!

728x90

'TIL' 카테고리의 다른 글

[TIL - 20240110] 컨트롤러 나누기?!  (0) 2024.01.10
[TIL - 20240103] Spring Data JPA @Modifying 문제  (0) 2024.01.03
[TIL - 20231226] jacoco 패키지, 클래스 Report에서 제외  (0) 2023.12.26
[TIL - 20231222] AuthenticationEntryPoint를 사용한 JWT 예외 핸들링  (1) 2023.12.22
[TIL - 20231222] searchWeeklyIntakeCalories 로직 개선  (0) 2023.12.22
    'TIL' 카테고리의 다른 글
    • [TIL - 20240110] 컨트롤러 나누기?!
    • [TIL - 20240103] Spring Data JPA @Modifying 문제
    • [TIL - 20231226] jacoco 패키지, 클래스 Report에서 제외
    • [TIL - 20231222] AuthenticationEntryPoint를 사용한 JWT 예외 핸들링
    Chef.Yeon
    Chef.Yeon
    보기 좋고 깔끔한 코드를 요리하기 위해 노력하고 있습니다.

    티스토리툴바