Rootable의 개발일기
추상 클래스와 인터페이스 본문
📌 추상 클래스란
추상 클래스는 클래스 내 추상 메서드가 하나 이상 포함되거나 abstract로 선언된 클래스를 말한다. 추상 메서드는 자손 클래스에서 완성해야 하는 메서드로 확장, 이용의 개념으로 볼 수 있다. 그래서 추상 클래스는 미완성 설계도라고도 표현한다.
상속을 위한 클래스이므로, 객체를 생성할 수 없다.
추상 클래스는 자손 클래스에서의 확장을 전제로 한 미완성 설계도
📌 인터페이스란
추상 메서드 또는 상수만으로 구성된 클래스(Java 8부터는 static 메서드와 default 메서드도 포함)로, 마찬가지로 추상 메서드는 자손(구현) 클래스에서 완성해야 하는 메서드다. 그래서 인터페이스는 기본 설계도라고 할 수 있으며, 중요 특징으로 다중 상속(구현)이 가능하다.
인터페이스는 다중 상속이 가능한 기본 설계도
📌 차이점
🔎 구성 요소
무엇보다 외적으로 차이가 있다. 추상 클래스는 'abstract class 클래스이름' 식으로 선언한다. 반면 인터페이스는 'interface 인터페이스이름' 식으로 선언한다.
구성 내용도 다르다. 추상 클래스는 인스턴스나 클래스 변수, 추상 메서드 등 자유롭게 포함하지만 인터페이스는 앞서 언급한 것처럼 포함될 수 있는 대상이 한정되어 있다.
🔎 개념
추상 클래스는 IS-A, 인터페이스는 HAS-A
추상 클래스는 IS-A의 개념으로 볼 수 있다. 즉 "~이다"의 개념이다. 그 이유는 상속을 전제로 생성된 클래스이기 때문이다.
예를 들어 추상 클래스가 "vehicle(탈 것)"이고, 자손 클래스로 car, bicycle, boat 등이 있다면 다음과 같이 말할 수 있다.
A car/bicycle/boat is vehicle
이처럼 추상 클래스는 해당 클래스가 어떤 종류의 또는 성격의 클래스인지 그 정체가 된다.
인터페이스는 HAS-A의 개념으로 볼 수 있다. 즉 "~를 할 수 있는" 또는 "~을 가지는"의 개념이다.
예를 들어 일반 클래스인 robot이 있을 때, 인터페이스로 movable, rechargeable 이 있다고 하자. 여기서 robot이 두 인터페이스를 구현한다면 이렇게 된다.
A robot has movable/rechargeable (function)
이처럼 robot은 움직일 수 있고, 충전할 수 있는 기능이 추가, 탑재된 것이다.
🔎 상속
추상 클래스나 인터페이스 모두 추상 메서드의 구현을 강제하는 것은 동일하다.
추상 클래스는 상속을 강제하기 때문에 상속이 가진 이점을 그대로 누린다. 여러 클래스가 공통적인 필드와 메서드들을 그대로 사용할 수 있는 것이다. 애플리케이션은 객체들간의 관계를 잘 파악할 수 있어야 가독성이 좋기 때문에 이러한 구조는 도움이 된다. 즉, 공통 필드와 메서드를 여러 클래스에서 쓰고 싶을 때 사용하면 좋을 것이다.
인터페이스와 추상 클래스의 가장 큰 차이는 상속이라고 생각한다. 상속 구조가 아닌 인터페이스는 클래스 간의 종속성이 약하고, 구조가 더 단순하다. 그리고 인터페이스를 사용하면 런타임 때 관계가 결정되므로 더욱 동적인 코드를 작성할 수 있다. 이처럼 상속을 사용하지 않으면서 누리는 장점과 다형성을 활용하고 싶을 때 인터페이스를 사용하면 좋을 것 같다.
References:
https://myjamong.tistory.com/150
[JAVA] 추상클래스 VS 인터페이스 왜 사용할까? 차이점, 예제로 확인 :: 마이자몽
추상클래스 인터페이스 왜... 사용할까? 우리는 추상클래스와 인터페이스에 대해서 알고 있냐고 누가 물어본다면 알고 있다고 대답을 하고있습니다. 그런데 이론적인 내용 말고 정작 "왜 사용하
myjamong.tistory.com
자바의 추상 클래스와 인터페이스
추상 클래스와 인터페이스의 차이 | 추상 클래스(Abstract class)와 인터페이스(Interface)의 차이 및 존재 이유를 설명해주세요. 클래스는 크게 일반 클래스와 추상 클래스로 나뉘는데 추상 클래스는
brunch.co.kr
'Java' 카테고리의 다른 글
Java의 I/O (0) | 2023.09.15 |
---|---|
래퍼 클래스(Wrapper Class) (0) | 2023.09.13 |
final 키워드 (0) | 2023.09.13 |
try-with-resources (0) | 2023.09.13 |
자바 리플렉션 API (0) | 2023.09.12 |