비교 중에서 abstract class가 interface보다 빠르다!라고 하는 부분이 있다.
왜 빠른지, 이유가 확실하게 나온 것 같지는 않아서 찾아보던 중에 스택오버플로우를 찾았다!
class에는 재정의가 가능한 method table이 존재한다.
이 테이블은 상속이 가능하며, 새 메서드를 추가하거나 재정의한 메서드에 대해서 테이블 항목을 대체할 수 있다.
그래서 abstract class같은 경우는 그냥 재정의된 메서드를 테이블에서 찾기만하면 되니까 빠르다할 수 있다.
반면에, interface는 상속관계가 없는 다른 인터페이스에서도 구현할 수 있기 때문에, 구현 메서드는 해당하는 클래스에 속해있는 테이블까지 찾아가야한다. 이를 해결하는 방법이 ‘double-dispatch’라는 방법인데, 인터페이스의 테이블에서 실제 클래스의 테이블로 매핑을 하는 방법이다! 이 double-dispatch를 진행함으로써 interface의 속도는 일반 클래스보다는 느릴 수 있다.
하지만 java에서도 HotSpot JVM과 같은 JVM은 double-dispatch를 사용하지 않습니다. 다른 virtual method invocation과 마찬가지로 실제 수신기 클래스에 대해서 인터페이스 메서드 호출을 해결합니다. 이렇게 사용하면, 동일한 클래스 계층이라면 추가 단계가 필요 없습니다!
라고 되어 있다. 밑에 더 설명하는 내용을 보면, interface가 일반 클래스보다 느려지는 시나리오가 있지만, 추상 클래스로 이러한 시나리오를 만들 수 없기 때문에, interface와 abstrac class간 속도의 차이를 이야기하는건 의미가 없다고 한다.(적어도 자바에서는! 다른 언어에서는 어떻게 변할지는 모른다.)