본문 바로가기
카테고리 없음

인터페이스로 확장하는 Java Enum - enum class implements Interface

by Rena B 2024. 1. 28.

Java에서 enum을 사용할 때, 부모-자식 클래스의 관계 처럼 연관관계를 만들 수 있을까?

enum은 암묵적으로 java.lang.Enum을 상속받기 때문에, 다중상속은 불가능하므로 다른 클래스를 상속받을 수는 없다.

 

하지만 인터페이스를 implements 한다면 가능하다.

 

프로젝트에 적용한 예시를 살펴보자.

멀티모듈 프로젝트에서 각 모듈별로 사용하는 에러코드를 공유하기 위해 BaseErrorCode라는 인터페이스를 만들고,

각 모듈별 에러코드 enum이 BaseErrorCode를 implements하여 모듈간 에러코드를 공유할 수 있도록 작성하였다.

 

이러한 접근 방식의 장점은 각 모듈이 독립적으로 에러코드를 관리할 수 있으면서도, 공통된 인터페이스를 통해 일관성을 유지할 수 있다는 점이다.

 

 

BaseErrorCode.java

public interface BaseErrorCode {
	ErrorResponse getErrorResponse();

	String getMessage();

	HttpStatus getStatus();
}

 

MemberErrorCode.java

@Getter
public enum MemberErrorCode implements BaseErrorCode {
   // ADMIN
	ADMIN_NOT_FOUND("NOT FOUND", HttpStatus.NOT_FOUND, "존재하지 않는 관리자입니다."),
  ...

	private final String errorCode;
	private final HttpStatus status;
	private final String message;

	MemberErrorCode(String errorCode, HttpStatus status, String message) {
		this.errorCode = errorCode;
		this.status = status;
		this.message = message;
	}
    
	@Override
	public ErrorResponse getErrorResponse() {
	   return new ErrorResponse(errorCode, message);
	}
}

BaseErrorCode를 변수로 가지는 커스텀 Exception 클래스를 만들면 BaseErrorCode의 enum구현체를 프로젝트 전반에 걸쳐 공유하여 사용할 수 있다.

@Getter
public class MemberCustomException extends RuntimeException {

	private final BaseErrorCode errorCode;

	public MemberCustomException(BaseErrorCode errorCode) {
		super(errorCode.getMessage());
		this.errorCode = errorCode;
	}
}