enum 에서 abstract

niz w·2025년 3월 11일

Spring

목록 보기
17/17

보통 abstract 메소드를 생성한 클래스를 extends 해서 필수로 override로 사용한다고 알고 있었는데...


업무를 하면 이것저것 적용한 결과 enum 클래스에서는 바로 abstract 메소드를 만들어서 사용했다!

🤔 가능한 이유!

enum 클래스에서는 내부적으로 익명 클래스를 생성하기 때문!!


public enum Calculation {
	
    ADD {
        	@Override
        public int apply(int a, int b) {
        	return a+b;
        }
    },
    
    MINUS {
        	@Override
        public int apply(int a, int b) {
        	return a-b;
        }
    },
    
    MULTIPLY {
        	@Override
        public int apply(int a, int b) {
        	return a*b;
        }
    };
    
    
    public abstract int apply(int a, int b);
}

계산 결과나 파라미터에 의해 발생하는 예외를 배제하고 위와 같은 enum이 있다고 하자!

여기서 실제로 자바 컴파일러는

public abstract class Calculation {
	public abstract int apply (int a, int b);
}

final class ADD extends Calculation {
	@Override
    public int apply(int a, int b) {
    	return a+b;
    }
}

final class MINUS extends Calculation {
	@Override
    public int apply(int a, int b) {
    	return a-b;
    }
}

final class MULTIPLY extends Calculation {
	@Override
    public int apply(int a, int b) {
    	return a*b;
    }
}

이렇게 동작한다고 한다!



하지만 일반 클래스에서는 익명 클래스 변환이 이루어지지 않기 때문에...

추상 클래스는 직접 인스턴화 (new 객체)가 안되므로
extends를 통해 하위 클래스에서 구현을 해줘야 한다!

0개의 댓글