abstract class와 inteface

노지환·2022년 2월 10일
0

abstract class(is-a)

  • 앞으로 구현될 클래스(상속받을)들의 방향성을 제시하는 역할
  • 직접 객체를 만들 수 없습니다!
  • 이 클래스는 무조건 하나의 abstarct method가 있어야합니다.
  • 클래스 계층구조를 만들기 위해서 base class를 define할 때 주로 사용합니다!
  • 뼈대

Interface(has-a)

  • interface에 정의된 메소드를 각 클래스 목적에 맞게 구현하는 것
  • methods, properties, events, indexers(특정 클래스나 구조체의 인스턴스가 배열과 같이 인덱싱되게 해주는 것)들을 가질 수 있습니다.
  • interface는 선언만할 수 있습니다!!!!
  • 그렇다면 interface 멤버들의 구현은?
    • implicitly, explicitly(암시적, 또는 명시적으로) interface를 구현하는 클래스에서 제공해야합니다!
  • 기능

abstract class와 interface의 차이

비교 중에서 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간 속도의 차이를 이야기하는건 의미가 없다고 한다.(적어도 자바에서는! 다른 언어에서는 어떻게 변할지는 모른다.)

profile
기초가 단단한 프로그래머 -ing

0개의 댓글