[Java] 추상클래스와 인터페이스의 차이점
본론으로 들어가기에 앞서 추상클래스와 인터페이스의 차이에 대해 간략히 알아보고 가자.
기능 | 추상 클래스 | 인터페이스 |
---|---|---|
일반 메서드 | 일반 메서드 정의가 가능 | 일반 메서드 정의 가능 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 기능을 써야하는 지 모호하지 않으므로 다중 상속이 가능하다.
댓글남기기