보통 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를 통해 하위 클래스에서 구현을 해줘야 한다!