"인터페이스(Interface)와 추상 클래스(Abstract class)의 차이 및 존재 이유에 대해 설명해주세요"
추상클래스는 없거나 하나 이상의 추상메소드를 가지고 있는 클래스로, 추상메소드는 내용이 구현되지 않은 abstract로 정의된 메소드를 의미합니다. 클래스 안에 메소드가 단 한개라도 존재한다면 그 클래스는 반드시 abstract로 정의되어야 합니다. 어떤 클래스가 추상 클래스를 상속받을 때는 extends를 씁니다.
인터페이스는 모든 메소드를 추상 메소드의 형태로 작성하는 것으로, 이를 상속하는 클래스는 해당 인터페이스의 모든 메소드를 반드시 구현해야 합니다. (자바 8에서는 default 키워드를 이용해서 일반 메소드의 구현도 가능합니다.) 또한 인터페이스 내 모든 변수들은 static이어야만 하는데, 이는 곧 일반 변수를 가질 수 없다는 것입니다.
그러면 추상 클래스 하나에 추상 메소드를 여러 개 두둔다면 인터페이스는 필요 없는 것 아닌가 하는 의문이 듭니다.
결과적인 차이는 인터페이스와 추상 클래스 각각의 존재 목적이 다르다는 점에 있습니다.
추상 클래스는 그 추상 클래스를 상속 받아 기능을 이용하고 확장하는 데 목적을 둔 반면, 인터페이스는 함수의 껍데기만 두어 함수의 구현을 강제하여 구현 객체의 같은 동작을 보장하는 데 초점을 둡니다.
이렇듯 분명 다른 존재 이유를 갖고 있지만, 서로 상호 보완적인 듯 한데, 이는 자바가 다중 상속을 지원하지 않기 때문입니다. (다중 상속은 여러 개의 슈퍼 클래스를 두는 것을 의미합니다.)
class MyVehicle extends car, plane {
@Override
public void goTo() {
super.drive();
}
}
위 코드의 car, plane 클래스에서 모두 drive() 메소드를 가지고 있다면, 어떤 메소드가 실행될지 애매한데, 이것이 다중 상속의 모호성입니다. 이 때문에 자바는 아예 다중 상속이 불가능하도록 만들었습니다.
하지만 인터페이스는 아래처럼 여러 인터페이스를 구현할 수 있습니다.
class car implements vehicle, engine {
@Override
public void drive() {
@doSomething
}
}
위 내용들을 표로 정리하면 다음과 같습니다.
추상 클래스 | 인터페이스 | |
키워드 | abstract | interface |
사용 가능 변수 | 제한 없음 | static final (상수) |
사용 가능 접근 제어자 | 제한 없음 | public |
사용 가능 메소드 | 제한 없음 | - abstract method - default method - static method - private method |
상속 키워드 | extends | implements |
다중 상속 가능 여부 | 불가능 | 가능 - 클래스에 다중 구현 - 인터페이스 간 다중 상속 |
공통점 | 1. 추상 메소드를 가진다. 2. 인스턴스화가 불가능하다 (new 생성자 사용 X) 3. 인터페이스 혹은 추상 클래스를 상속받아 구현한 구현체의 인스턴스를 사용해야 한다. 4. 인터페이스와 추상클래스를 구현, 상속한 클래스는 추상 메소드를 반드시 구현해야 한다. |
Q1. 추상 클래스와 인터페이스의 차이와 존재 이유에 대해 설명해주세요.
추상 클래스는 하나 이상의 추상 메서드를 포함할 수 있으며, 단일 상속만을 지원합니다. 반면, 인터페이스는 모든 메서드가 추상 메서드로 상수와 default 메서드를 포함하고, 다중 상속을 지원합니다.
추상 클래스는 공통된 메서드를 포함하는 데 유용하며, 이를 상속받아 구체적인 동작을 하는데 활용됩니다.
인터페이스는 클래스 간 결합도를 낮추고, 코드의 유연성을 높이는 데 활용하며, 다중 상속을 지원함으로써 다양한 타입을 지원할 수 있습니다.
Q2. 추상 클래스와 인터페이스 각각 어떤 상황에서 사용하는지 설명해주세요.
추상 클래스는 "is-a" 관계, 즉 상속 관계에서 기본적인 구현을 제공하고, 이를 상속받아 확장하고자 할 때 사용합니다. 예를 들어, 여러 하위 클래스가 공통적으로 가져야 하는 메서드가 있는 경우, 해당 메서드의 뼈대(구현)를 추상 클래스에 작성하고, 하위 클래스에서 이를 구체화할 수 있습니다.
인터페이스는 "has-a" 관계, 즉 구현체가 특정 동작을 보장하기 위해 사용됩니다. 서로 관련이 없는 클래스들에게 특정 동작을 보장하고자 할 때, 해당 동작을 정의한 인터페이스를 구현함으로써 일관된 동작을 보장할 수 있습니다.
참고 출처
- "강이"의 JAVA 강좌: 자바의 추상클래스(abstract class)와 인터페이스(interface)
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] CheckedExceptin과 UncheckedException (0) | 2024.02.05 |
---|---|
[Java] 클래스, 객체, 인스턴스의 차이 (0) | 2024.01.29 |
[Java] OOP의 5가지 원칙 (SOLID) (0) | 2024.01.25 |
[Java] OOP의 4가지 특징 (0) | 2024.01.23 |
[Java] 자바 접근 제어자의 유형과 특징 (0) | 2024.01.22 |