Java - Abstract Class vs. Interface

1 분 소요

Java - Abstract Class vs. Interface

  • Abstract Class와 Interface는 “아직 구현되지 않은, 추상화된 클래스”를 의미합니다. 직접 Object로 구현되어질 수는 없고, 이후 얘네를 다른 Class가 상속받아서 virtual method들을 새롭게 정의해줘야 하죠. 이렇게 쓰고 보면 이 둘이 매우 비슷해 보이죠.
  • 그렇다면, 이 둘의 차이점은 무엇일까요?(물론 Java의 버전이 업데이트 됨에 따라서 조금씩 달라지기는 합니다만).
    • Abstract Class의 경우는 abstract method와 non-abstract method를 모두 가질 수 있습니다. 즉, 몇몇 method들은 abstract class에서 정의되어서 사용할 수 있다는 이야기죠.
    • Abstract Class는 다른 Abstract Class는 물론 regular class를 extend할 수 있습니다. 하지만, 오직 한 개의 class만을 extend할 수 있습니다. 두 개의 class를 동시에 extend하는 것은 불가능하죠. 또한, final, non-final, non-static variable을 모두 field로 가질 수 있죠.
    • Interface는 오직 Interface만을 extend할 수 있습니다. 여러 Interface를 동시에 extend할 수 있죠. 그리고 단지 static, final variable만을 가질 수 있습니다.
    • Abstract Class는 Constructor를 가지고 있지만, interface는 Constructor를 가지고 있지 않죠.
    • interface는 보통 class의 interface 부분과 구현된 부분을 분리(Decouple)하기 위한 목적으로 사용되는 반면, abstract class는 subclass들로부터 공유되는 공통 field들을 뽑아내는 목적으로 사용됩니다.
  • 사실 결론부터 말하면 형식적인 것보다는 “목적”이 가장 다릅니다. 마지막에 한 말, interface는 “기능에 대한 선언부와 구현 부분을 분리하기 위한 목적”으로 사용되는 반면, abstract class는 많은 subclass들이 공통으로 가지고 있는 field를 뽑아내서 중복을 줄이기 위해 사용되죠. 이 목적을 분명하게 알고 있으며, 오히려 덜 헷갈립니다.
  • 따라서, interface > abstract base class > class 의 순으로 상속받는다, 처럼 생각하면 더 편하죠.

Simple class by ABC and Interface

  • Interface와 Abstract Class를 사용해서 간단한 클래스를 만들면 다음과 같습니다.
interface ObjectBehaviour {
    // 공통이 되는 행동부를 선언
    void walk();
    void run();
}

abstract class ObjectClass implements ObjectBehaviour{
    // 모든 subClass들의 field를 뽑아냄
    protected double walkSpeed;
    protected double runSpeed;
}

class OurObject extends ObjectClass {
    public OurObject(double walkSpeed, double runSpeed) {
        this.walkSpeed = walkSpeed;
        this.runSpeed = runSpeed;
    }
    public void walk(){
        System.out.println("Walk");
    }
    public void run(){
        System.out.println("Run");
    }
}

댓글남기기