'is a kind of ~ 추상클래스', 'be able to ~ 인터페이스'
추상클래스
public abstract class 추상클래스 {
private String name; // Field
public 추상클래스(String name) { // Constructor
this.name = name;
}
public void 메서드() {}; // Method
public abstract void 추상메서드(); // Abstract Method
}
class 앞에 'abstract' 키워드를 사용하여 정의하며, 하나 이상의 추상 메서드를 가지는 클래스를 말한다.
추상 메서드를 선언하여 상속을 통해 하위 클래스에서 반드시 구현하도록 강제하는 클래스이다.
(추상 메서드를 포함하지 않는 클래스도 abstract 키워드를 붙여 추상 클래스를 만들 수 있으나, 추상 메서드가 하나라도 존재한다면 무조건 추상 클래스여야 한다.)
추상 클래스는 상속을 위한 클래스이기 때문에 new 키워드를 통해 직접 객체를 생성할 수 없다는 특징이 있다.
java는 다중 상속을 지원하지 않기 때문에 여러 개의 추상 클래스를 상속할 수 없다.
인터페이스
interface 인터페이스 {
public abstract void 메서드1(); // abstract method
public default void 메서드2() {}; // default method -> 공통 기능을 내부에 작성함으로써 구현체에서 반복되는 코드의 작성 감소
}
'interface' 키워드를 사용하여 선언하는 인터페이스는 상수와 추상 메서드의 집합이다.
인터페이스는 추상 클래스보다 추상화 정도가 높으며 추상 클래스와는 다르게 구현부가 있는 일반 메서드, 일반 멤버 변수를 가질 수 없다.
모든 멤버 변수를 'public static final'로 선언해야 하는 이유는, 인스턴스가 존재할 수 없기 때문에 상속받은 구현 객체에서 같은 상태를 보장하기 위해서 선언해야 한다.
공통점과 차이점
공통점
- 메서드의 선언만 있고, 구현 내용이 없다. (추상 메서드)
- new 키워드를 통해 객체를 생성할 수 없다.
- 상속받은 클래스가 반드시 선언된 추상 메서드를 구현하도록 한다.
차이점
- 추상 클래스는 extends, 인터페이스는 implements 키워드를 사용한다.
- 인터페이스는 다중 상속이 가능하다.
- 추상 클래스는 일반 변수, 생성자, 일반 메서드, 추상 메서드 등 모두 가질 수 있지만 인터페이스는 상수와 추상메서드만 가질 수 있다.
- 상속관계를 타고 올라갔을 때, 추상 클래스는 같은 부모 클래스를 상속하며, 부모 클래스가 가진 기능들을 구현해야 하는 경우에 사용하지만 인터페이스는 다른 부모 클래스를 상속하더라도 같은 기능이 필요한 경우에 사용
추상 클래스는 extends(기능 확장) : 자신의 기능들을 하위로 확장시키는 것
인터페이스는 implements(실행하는 기능 구현) : 인터페이스에 정의된 메서드를 각 클래스의 목적에 맞게 동일한 기능으로 구현하는 것
구분 | 추상 클래스 | 인터페이스 | |
공통점 | 객체 생성 | 객체를 생성할 수 없다 (인스턴스화 불가능) | |
추상 메서드 | 추상 메서드를 포함할 수 있다. | ||
기능적 목적 | 상속받은 클래스에서는 추상 메서드를 반드시 재정의하여 구현해야 한다. | ||
차이점 | 개념적 목적 | 기능을 확장 시키는 것이 목적 | 구현 객체의 동일한 실행 기능을 보장하기 위한 목적 |
일반 메서드 | 정의 가능 | 정의 불가능 (Java8 이후 static, default 메서드 정의 가능) |
|
멤버 변수 | 클래스와 동일하게 변수 선언 및 사용 가능 | 상수만 사용 가능 | |
상속 키워드 | extends | implements | |
다중 상속 | 불가능 | 가능 |
실전
Q. 추상클래스와 인터페이스의 차이에 대해 설명해 주세요.
A. 둘 다 상속받은 클래스 혹은 구현하는 인터페이스 안에 있는 추상 메서드를 구현하도록 강제하는 설계도라고 볼 수 있습니다. 다만 추상 클래스는 아직 구현해야 될 것이 남아있는 미완성 설계도이고, 인터페이스는 구현된 것이 없고 밑그림만 그려진 기본 설계도의 차이가 있습니다.
추상 클래스는 extends 키워드를 사용하고 상속받은 클래스가 기능을 확장시킬 수 있도록 하는 것이 목적입니다. 일반 메서드를 정의할 수 있고 일반 클래스와 동일하게 멤버 변수를 선언하고 사용이 가능합니다. 하지만 다중 상속은 불가능합니다.
인터페이스는 implements 키워드를 사용하고 구현하는 클래스들의 동일한 실행 기능을 보장하기 위한 것이 목적입니다. 일반 메서드는 static, default 메서드만 정의 가능하고, 멤버 변수는 상수만 사용이 가능합니다. 하지만 인터페이스는 하나의 클래스가 여러 개의 인터페이스를 구현할 수 있다는 특징이 있습니다.
참고
'멋진 개발자 > Java & Spring' 카테고리의 다른 글
개발자 성장 기록 42 - Java 직렬화 (Serialization) (0) | 2024.04.06 |
---|---|
개발자 취준 기록 39 - Java 버전 별 차이 (0) | 2024.04.04 |
개발자 취준 기록 34 - Hash(Table·Map·Set) (0) | 2024.03.28 |
개발자 취준 기록 33 - Java 제네릭 (Generic) (0) | 2024.03.27 |
[항해 취업코스] 개발자 취준 기록 19 - Filter, Interceptor, AOP (0) | 2024.03.13 |