반응형

Java 프로젝트를 진행해보신 분들은 객체지향적으로 프로그램을 디자인 하면서 추상화에 대한 고민을 해보셨을 겁니니다.

추상 클래스(Abstract Class)와 인터페이스(Interface)는 어떤 공통점이 있고, 어떤 차이점이 있을까요? 단순히 취향 차이일까요?

지금부터 함께 살펴보겠습니다!

 

공통점

  1. 추상화에 사용됩니다.
    추상 클래스를 상속하거나 인터페이스를 구현한 객체는 각각의 상위 타입에 호환됩니다.
  2. Java 8 버전 이후부터 인터페이스에도 default 메소드가 있기 때문에 추상클래스와 인터페이스 모두 구현 객체에 독립적인 메소드 제공이 가능합니다.

 

차이점

  1. abstract 키워드는 추상 클래스를 만드는 데에도 사용되지만, 메소드 수준에서 추상 메소드를 선언하는 데에도 사용됩니다. 반면 interface 키워드는 인터페이스를 생성할 때만 사용되고, 메소드 수준에서는 사용할 수 없습니다.
  2. 추상 클래스를 상속(extend)한 자식 클래스도 추상 클래스가 될 수 있기 때문에 추상 클래스에서 정의한 추상 메소드를 반드시 모두 구현할 필요 없습니다. 반면 implements 키워드로 인터페이스를 구현한 서브클래스는 인터페이스에서 정의한 모든 메소드를 구현해야 합니다.
  3. 추상 클래스는 생성자(Constructor)를 가질 수 있고, 인터페이스는 가질 수 없습니다.
    그렇다고 해서 추상 클래스의 생성자로 자신의 인스턴스를 생성해 초기화 할 수 있는 건 아닙니다.
  4. 추상 클래스는 스스로 초기화 할 수 없다는 것을 제외하고선 일반적인 자바 클래스와 모든 특징을 공유하지만, 인터페이스는 멤버 변수를 가질 수 없고, 상수만을 가질 수 있으며 접근 지정자가 제한적인 것 등 제약사항이 꽤 있습니다.
  5. 추상 클래스의 메소드는 public, protected, private 등 접근 지정자를 자유롭게 사용할 수 있는 반면, 인터페이스의 메노드는 public 밖에 사용할 수 없습니다.
  6. 서브 클래스는 단 하나의 추상 클래스만 extends 할 수 있지만, 인터페이스는 여러 개도 implements 가능합니다.
  7. 추상 클래스는 다른 클래스를 extends하거나 여러 인터페이스를 implements 할 수 있지만, 인터페이스는 오직 다른 인터페이스만을 implements 할 수 있습니다.

 

언제, 무엇을 사용하는 게 좋을까?

자바에서는 서브 클래스가 여러 개의 부모 클래스를 상속하는 것을 허용하지 않기 때문에 대다수의 경우 인터페이스를 구현하는 것이 더 좋습니다. 그래서 웬만하면 인터페이스로 프로젝트를 디자인 하면 됩니다.

그럼 언제 추상 클래스가 더 좋을까요?

만약 여러 개의 서브 클래스가 같은 로직의 메소드를 공통으로 가져야할 때(특히 그 공통의 메소드에서 멤버 변수를 사용할 때) 인터페이스보다 추상 클래스로 구현하는 것이 더 좋습니다. 추상 클래스로 구현할 경우 배포한 이후에 갑자기 공통 메소드를 추가해야 할 때 서브 클래스의 수정 없이 추상 클래스에서만 메소드를 정의해주면 되는 장점도 있습니다.

자바8 버전 이후부터는 인터페이스도 default와 static 메소드를 지원하면서 이러한 차이점을 거의 해소했습니다만, 여전히 인터페이스에는 변수가 없기 때문에.. 관건은 변수와 접근 지정자라고 보시면 되겠습니다.

반응형
반응형