[Java] 추상클래스와 인터페이스의 차이
들어가며
오늘은 자바 추상클래스와 인터페이스의 차이에 대해서 정리해보고자 한다.
추상클래스(abstract class)
클래스를 설계도에 비유한다면 추상클래스는 미완성 설계도에 비유할 수 있다.
public abstract class animal {}
class 앞에 'abstract' 키워드를 붙여 사용하며, 일반적으로 하나 이상의 추상 메서드를 가진 클래스를 말한다. 추상 메서드를 선언함으로써 상속을 통해 하위 클래스에서 이를 구현하도록 강제하는 클래스이다.
(추상 메서드를 포함하지 않는 클래스에도 'abstract'를 붙여 추상 클래스로 지정 가능하지만, 반대로 추상 메스드를 포함하는 클래스는 반드시 추상 클래스여야 한다.)
abstract로 선언된 추상 클래스는 상속을 위한 클래스이기에 new 키워드를 통해 직접 객체를 생성할 수 없다.
또, java에서는 다중상속을 지원하지 않기 때문에 여러 개의 추상 클래스를 상속하는 것은 불가능한다.
추상메서드
public class animal {
abstract void cry();
}
public class cat extends animal {
void cry() {
System.out.println("냥냥!");
}
}
public class dog extends animal {
void cry() {
System.out.println("멍멍!");
}
}
추상메서드는 선언부만 작성하고 구현부는 작성하지 않은 채 남겨둔 메서드이며, 상속받는 클래스에 따라 구현되는 내용을 달리할 수 있다.
인터페이스(interface)
인터페이스는 구현된 것은 아무 것도 없이 밑그림만 그려져 있는 기본 설계도라 표현할 수 있다.
'interface' 키워드를 사용하여 선언하는 인터페이스는 상수(static final)와 추상메서드(abstract method)의 집합이다.
인터페이스의 모든 메서드는 'public abstract'로 선언해야 하지만, 이는 생략 가능하다.
또, 모든 멤버 변수는 'public static final'로 선언해야하지만, 이 또한 생략 가능하다.
(생략 가능한 이유는 컴파일 시 자동생성되기 때문이다.)
인터페이스는 추상 클래스와 달리 다중상속이 가능하다는 특징이 있다.
추상클래스와 인터페이스 비교
공통점
추상클래스와 인터페이스 모두 메서드의 선언만 존재하며 구현 내용은 없다는 특징을 지녔다.(추상 메서드)
또, new 키워드를 통해 객체 생성이 불가능하며, 상속받은 클래스가 반드시 선언된 추상 메서드로 구현하도록 강제한다.
차이점
추상클래스는 extends 키워드를 통해 상속하며, 다중 상속은 불가능하다.
인터페이스는 implements 키워드를 사용하여 상속하며, 다중 상속이 가능하다.
간단하게 위와 같이 추상클래스와 인터페이스에 대해 정리할 수 있겠지만 이것만으로 이 둘을 완벽히 구분하여 이해하는 것은 어려워 보인다. 이 둘의 차이를 이해함에 있어서는 왜 서로 다른 키워드를 통해 상속하는지에 대해 집중해 볼 필요가 있다.
상속 - 확장(extends)
자바에서 상속 관계를 나타낼 때는 추상 클래스를 상속할 때와 같이 extends 키워드를 사용한다.
상속은 재사용 + 확장의 개념을 지닌다. 이를 다르게 표현하면 상속은 is kind of 관계로 나타낼 수 있다.
이를 생명체의 개념에 대입해보자면
- Turtle is kind of Animal
→ 거북이는 동물의 한 분류이다.
- Animal is kind of Creture
→ 동물은 생명체의 한 분류이다.
와 같이 표현할 수 있다.
즉, 추상클래스는 이렇게 위에서 말한 상속의 개념과 같이 상위 클래스가 하위 클래스에게 특성을 상속해 준다는 것을 적용하고 있다는 특징을 지니고 있다.
상속 - 구현(implements)
하지만 인터페이스는 구현 클래스 is able to 인터페이스라고 해석할 수 있다. 즉, '무엇을 할 수 있는'이라는 표현이다.
Java에 구현된 인터페이스 예시
- Serializable : 직렬화할 수 있는
- Closeable : 스트림을 닫고 시스템 리소스를 해제할 수 있는
- Appendable : char 시퀀스 및 값을 추가할 수 있는
인터페이스는 '클래스가 무엇을 할 수 있다'라고 하는 기능을 구현하도록 강제하는 특징을 가지고 있다. 그래서 인터페이스의 경우 extends 키워드가 아니라 implements 키워드를 사용하는 것을 볼 수 있다.
정리하자면
자바의 특성상 한 개의 클래스만 상속 가능하기에 해당 클래스의 구분을 추상 클래스 상속을 통해 해결하고, 할 수 있는 공통의 기능들은 인터페이스의 다중 상속을 통해 구현한다.
또, 상위 클래스는 다중 상속이 불가능하기 때문에 하나의 클래스에서 하위 클래스에 물려줄 특성이 풍부할수록 좋으며, 인터페이스는 다중 상속이 가능하기 때문에 각각의 인터페이스는 목적에 맞는 최소한의 메서드(구현을 강제할)를 선언하는 것이 좋다.
Reference
wildeveloperetrain - 자바 추상 클래스와 인터페이스의 차이점 이해하기
Gyun's 개발일지 - [Java] 인터페이스와 추상 클래스 차이는 무엇일까?
'🖥CS' 카테고리의 다른 글
[Java] String, StringBuffer, StringBuilder의 차이점 (0) | 2023.03.09 |
---|---|
스택(Stack)과 큐(Queue) (0) | 2023.01.19 |
네이버를 검색하고 화면에 출력되기까지 (0) | 2022.09.28 |
TCP/UDP (0) | 2022.09.27 |
1일 1로그 100일 완성 IT지식 - 통신 75~77 (0) | 2022.08.21 |