2 분 소요

본론으로 들어가기에 앞서 추상클래스와 인터페이스의 차이에 대해 간략히 알아보고 가자.

기능 추상 클래스 인터페이스
일반 메서드 일반 메서드 정의가 가능 일반 메서드 정의 가능
Java 8 이후 static, default 가능
멤버 변수 클래스와 동일하게 변수 선언 및 사용 가능 상수만 사용 가능
상속 키워드 extends implements
다중 상속 불가능 가능
목적 상속하여 공통된 기능을 만들고, 확장 구현하는 객체들이 같은 동작을 보장

추상 클래스 (Abstract Class)

클래스를 설계도에 비유한다면, 추상클래스는 미완성 설계도에 비유할 수 있다. 즉, 완성되지 못한 채로 남겨진 설계도 이다.

미완성된 설계도로 제품을 만들 수 없듯이, 추상클래스만으로는 인스턴스를 생성할 수 없다. 추상클래스는 상속을 통해 자손클래스에 의해서만 완성될 수 가 있다.

추상클래스 자체로는 클래스로서의 역할을 다 못하지만 새로운 클래스를 작성하는 데 있어 바탕이 되는 조상 클래스로써 중요한 의미를 갖는다.

예를 들어 샤프를 만든다고 할 때 0.5, 0.7, 0.9 샤프를 만든다고 하자. 샤프심의 직경을 제외한 나머지는 비슷한 역할을 것이다. 이러한 경우 설계도를 다 따로 그리는 것 보다 공통 부분만 따로 떼어 놓은 미완성 설계도를 만들어 놓고, 각자 다른 부분에 대해서만 설계도를 완성하는 것이 효율적일 것이다.

추상클래스의 경우 키워드 abstract만 붙여주면 된다.

public abstract Pencil{
  ... 
}

추상 클래스는 추상 메서드를 포함하고 있다는 것을 제외하고는 일반 클래스와 다르지 않다.

추상클래스에도 생성자가 있고, 멤버변수와 메서드도 가질 수 있다.

  • 추상 클래스는 인스턴스, 즉 객체를 만들 수 없는 클래스이다.
  • 추상 클래스는 상속 키워드로 extends 를 사용한다.
  • 추상메서드는 하위 클래스에 서 메서드의 구현을 강제해야한다.
  • 추상메서드를 포함하는 클래스는 반드시 추상클래스여야 한다.
  • 다중 상속이 불가능

인터페이스(Interface)

인터페이스는 일종의 추상 클래스 이다.

추상클래스는 부분적으로만 완성된 미완성 설계도라고 한다면, 인터페이스는 구현된 것은 아무것도 없고 밑그림만 그려져 있는 기본 설계도라고 할 수 있다.

인터페이스도 추상클래스처럼 완성되지 않은 것이기 때문에, 그 자체만으로 사용되기 보다는 다른 클래스를 작성하는데 도움을 줄 목적으로 작성된다.

인터페이스의 경우 interface를 사용해 생성 가능하다

public inteface Animal{
  
}
  • 인터페이스의 모든 멤버 변수는 public static final 이어야 하며, 생략 가능하다.
  • 인터페이스의 모든 메서드는 public abstract 이어야 하며, 생략 가능하다.
  • Java 8 이후 부터는 default, static 메서드 사용기 가능하다.
  • 인터페이스는 상송 키워드로 implements를 사용한다,
  • 다중 상속이 가능하다.

다중 상속

앞서 살펴본 추상클래스와 인터페이스에서 다중상속에 대해 차이점이 존재한다.

추상클래스 인터페이스
다중 상속 불가능 다중 상속 가능

모호성 때문에 두가지의 다중 상속 여부가 갈린다.

[추상 클래스]

라디오와 핸드폰이라는 추상 클래스가 있다고 가정해보자.

public abstract class Radio{
  void sound(){
    ... 
  };
  abstract void exterior();
  ...
}

public abstract class CellPhone{
  void sound(){
   	... 
  };
  abstract void 3G();
  ...
}

추상클래스의 경우 abstract 메서드를 가지지만 구현된 메서드들도 존재한다.

만약 Radio와 CellPhone을 상속한다면 sound() 메서드에 대해 어떠한 것을 상속해야 할 지 모호해진다.

그러므로 추상 클래스의 경우 다중 상속이 불가능 하다.

[인터페이스]

A와 B가 있다고 가정하자.

public interface A{
  void print();
  ...
}

public interface B{
  void print();
  ...
}

인터페이스의 경우 모든 메서드들이 abstract 메서드이다.

그렇기 때문에 A와 B를 두가지 다 상속한다 하더라도 상속한 클래스에서 print() 라는 추상 메서드를 구현해야 한다.

A 기능을 써야하는지 B 기능을 써야하는 지 모호하지 않으므로 다중 상속이 가능하다.

카테고리:

업데이트:

댓글남기기