개발/자바

Java Enum에서 인터페이스 구현하기

피터JK 2025. 2. 20. 09:42
728x90

Java Enum에서 인터페이스(interface) 구현하기

Java의 enum은 단순한 상수 집합이 아니라, 클래스처럼 동작할 수 있으며 인터페이스도 구현 가능합니다.
이를 활용하면 Enum이 특정 동작(행위)을 포함하도록 만들 수 있습니다.


1️⃣ Enum에서 인터페이스 구현하기

Java의 enum은 클래스의 특별한 형태이므로 인터페이스를 구현(implements) 할 수 있습니다.

기본 예제

// 인터페이스 정의
interface Operation {
    int apply(int a, int b);
}

// Enum에서 인터페이스 구현
enum Calculator implements Operation {
    ADD {
        @Override
        public int apply(int a, int b) {
            return a + b;
        }
    },
    SUBTRACT {
        @Override
        public int apply(int a, int b) {
            return a - b;
        }
    },
    MULTIPLY {
        @Override
        public int apply(int a, int b) {
            return a * b;
        }
    },
    DIVIDE {
        @Override
        public int apply(int a, int b) {
            return (b != 0) ? a / b : 0; // 0으로 나누는 경우 예외 처리
        }
    };
}

// 실행 테스트
public class Main {
    public static void main(String[] args) {
        int num1 = 10, num2 = 5;

        System.out.println("Addition: " + Calculator.ADD.apply(num1, num2));
        System.out.println("Subtraction: " + Calculator.SUBTRACT.apply(num1, num2));
        System.out.println("Multiplication: " + Calculator.MULTIPLY.apply(num1, num2));
        System.out.println("Division: " + Calculator.DIVIDE.apply(num1, num2));
    }
}

📌 실행 결과

Addition: 15
Subtraction: 5
Multiplication: 50
Division: 2

2️⃣ Enum의 공통 인터페이스 구현

인터페이스를 enum이 구현하면, 각 상수에서 해당 메서드를 다르게 오버라이딩할 수 있습니다.

예제: 메시지 타입에 따른 동작 정의

// 인터페이스 정의
interface Message {
    String getMessage();
}

// Enum에서 인터페이스 구현
enum MessageType implements Message {
    INFO {
        @Override
        public String getMessage() {
            return "This is an informational message.";
        }
    },
    WARNING {
        @Override
        public String getMessage() {
            return "This is a warning message!";
        }
    },
    ERROR {
        @Override
        public String getMessage() {
            return "This is an error message!";
        }
    };
}

// 실행 테스트
public class Main {
    public static void main(String[] args) {
        for (MessageType type : MessageType.values()) {
            System.out.println(type + ": " + type.getMessage());
        }
    }
}

📌 실행 결과

INFO: This is an informational message.
WARNING: This is a warning message!
ERROR: This is an error message!

3️⃣ Enum에서 공통된 메서드 구현 후 오버라이딩

각 enum 상수에서 공통적으로 사용할 기본 구현을 default로 제공한 후, 필요한 경우 오버라이딩할 수도 있습니다.

예제: 기본 동작 + 오버라이딩

// 인터페이스 정의
interface Payment {
    default void process() {
        System.out.println("Processing payment...");
    }
}

// Enum에서 인터페이스 구현
enum PaymentMethod implements Payment {
    CREDIT_CARD {
        @Override
        public void process() {
            System.out.println("Processing credit card payment...");
        }
    },
    PAYPAL {
        @Override
        public void process() {
            System.out.println("Processing PayPal payment...");
        }
    },
    CASH; // 기본 동작 유지
}

// 실행 테스트
public class Main {
    public static void main(String[] args) {
        for (PaymentMethod method : PaymentMethod.values()) {
            System.out.print(method + ": ");
            method.process();
        }
    }
}

📌 실행 결과

CREDIT_CARD: Processing credit card payment...
PAYPAL: Processing PayPal payment...
CASH: Processing payment...

🔹 CASH의 경우 process()를 오버라이딩하지 않았으므로 기본 동작을 사용합니다.


4️⃣ Enum에서 인터페이스 다중 구현

Java에서는 다중 상속이 불가능하지만, 인터페이스는 다중 구현이 가능합니다.
Enum에서도 여러 개의 인터페이스를 동시에 구현할 수 있습니다.

예제: 다중 인터페이스 구현

// 첫 번째 인터페이스
interface Movable {
    void move();
}

// 두 번째 인터페이스
interface Attackable {
    void attack();
}

// Enum에서 두 개의 인터페이스 구현
enum CharacterType implements Movable, Attackable {
    WARRIOR {
        @Override
        public void move() {
            System.out.println("Warrior moves forward!");
        }

        @Override
        public void attack() {
            System.out.println("Warrior swings a sword!");
        }
    },
    ARCHER {
        @Override
        public void move() {
            System.out.println("Archer moves swiftly!");
        }

        @Override
        public void attack() {
            System.out.println("Archer shoots an arrow!");
        }
    };
}

// 실행 테스트
public class Main {
    public static void main(String[] args) {
        for (CharacterType character : CharacterType.values()) {
            System.out.println(character + " Actions:");
            character.move();
            character.attack();
            System.out.println();
        }
    }
}

📌 실행 결과

WARRIOR Actions:
Warrior moves forward!
Warrior swings a sword!

ARCHER Actions:
Archer moves swiftly!
Archer shoots an arrow!

🔹 CharacterType이 Movable과 Attackable을 동시에 구현하여 두 가지 동작을 수행할 수 있습니다.


🔥 정리

특징  enum interface enum + interface
역할 상수 집합 동작(행위) 정의 Enum이 특정 동작을 포함하도록 만들기
메서드 구현 가능 불가능 (default 메서드는 가능) Enum에서 오버라이딩 가능
다중 구현 ❌ (불가능) ✅ (가능) ✅ (여러 인터페이스 구현 가능)
예제 enum Color { RED, GREEN } interface Flyable { void fly(); } enum Bird implements Flyable { SPARROW, EAGLE }

Enum은 인터페이스를 구현할 수 있으며, 각 Enum 상수에서 다르게 동작하도록 메서드를 오버라이딩할 수 있음
인터페이스를 활용하면 Enum의 기능을 확장할 수 있어 더욱 유연한 설계가 가능
Enum + 인터페이스 조합을 활용하면 유지보수성이 높고 가독성이 좋은 코드를 작성할 수 있음 

728x90