개발 언어/Java

Java] 추상클래스와 인터페이스

추상클래스와 인터페이스

이 두가지를 함께 물어본다면, 상속과 다형성에 대해서 묻는 것이다.
(다형성이라 함은 간단하게 말한다면, 상속을 통해 기능을 확장하거나 변경하는 것을 의미. 즉, 하나의 메서드가 다양한 방법으로 동작하는 것)

클래스는 일반클래스와 추상클래스로 나뉘는데, 추상클래스는 추상매서드가 하나 이상 포함되거나 abstract로 정의된 클래스를 말한다.
인터페이스는 모든 메서드가 추상메서드로 이루어져 있다.
(단, Java 8이후에는 default 키워드로 일반 메서드의 구현도 가능하게 됐다.)

추상클래스를 상속받는 클래스 또는, 인터페이스를 구현하는 클래스는 그 안에 있는 '추상메서드'를 구현하도록 강제한다.
어떻게 보면 의미가 비슷하다고 느낄 수 있으나, 추상클래스와 인터페이스는 존재 목적이 다르다.


추상클래스는 추상클래스를 상속받아 기능을 이용하거나 확장시키는데 의미가 있다.
인터페이스는 추상메소드 형태, 즉 함수의 껍데기만 있는데 그 이후는 함수의 구현을 강제하기 위해서 이다.
구현을 강제함으로써 구현 객체의 같은 동작을 보장한다.

추상클래스와 인터페이스 추상메서드를 가지고 있고, 추상클래스는 다중상속이 제한된 반면에 인터페이스는 다중 구현이 가능하다.
하지만, Java에서 다중상속을 제한한 것을 인터페이스가 해결하기 위해 존재한다는 것은 틀린 것이다.
위에서 말했다시피, 추상클래스와 인터페이스는 존재 목적이 다르기 때문이다.


추상클래스는 수퍼클래스의 기능을 사용하거나 확장하기 위해 사용되고,
다중 상속을 허용할 경우 모호성 때문에 논란이 될 수 있으므로 Java에서는 아예 제한시킨 것이다.

인터페이스는 해당 인터페이스를 구현한 객체 들에 대하여 동일한 동작 을 약속하기 위해 존재한다.


  • 추상화 정도는 인터페이스가 추상클래스보다 더 높다.

인터페이스(명세서) / 추상클래스(미완성 설계도)

  • 인터페이스는 구현의 목적, 추상클래스는 기능의 확장이 목적.
  • 인터페이스와 추상클래스 모두 공통적으로 객체를 생성할 수 없다.
  • 추상클래스는 다중 상속이 불가능하다.