* 해당 내용은 자바의 정석_남궁성著를 공부하면서 배운 내용을 정리한 글로, 배움이 얕아 틀린 내용이 있을수 있습니다. 틀린 내용은 감사히 지적받겠습니다.
추상 클래스(abstract class)란?
흔히들 추상클래스 라고하면 '미완성 설계도'라고 한다.
클래스이긴 하지만, 완성되지못한채 틀만 가지고 있는 설계도로 추상 클래스는 인스턴스를 생성할수 없다.
이를 내 나름대로 비유하여 이해해 본다면,
나는 한식,중식,일식 코스요리 전문 레스토랑을 오픈하기위해 준비하고있다.
한식,중식,일식 각각의 코스에 맞는 메뉴를 개발해야하는데, 나는 사장이라 요리를 잘 몰라서 세부 메뉴들은 각각의 주방장이 도맡아서 개발하기로했다. 그래서 주방장에게
"모든 코스요리는 애피타이저,메인요리,후식으로 구성되어있으니 한식,중식,일식 각 주방장들은 알아서 메뉴를 만들어보세요" 라고 전달하는것이다.
해당 내용을 코드로 구현해본다면,
abstract class Resturant {
String Name = "DDuk's Resturant";
void Order() {
System.out.print("주문되었습니다.");
}
// 메인메뉴전에 입맛을 돋굴수있는 전채요리를 준비해주세요.
abstract void appetizer();
// 본 메뉴이니 최대한 신경써주세요.
abstract void Main();
// 달콤한 디저트로 준비해주세요.
abstract void dessert();
}
class Korea extends Resturant {
void appetizer() {}
void Main() {}
void dessert() {}
}
'레스토랑' 이라는 추상클래스는 애피타이저,메인요리,후식으로 구성되어있고,
'한식' 주방장은 '레스토랑'이라는 추상클래스를 통해 한식에 어울리는 애피타이저,메인요리,후식 요리를 개발할 것이다.
'일식' 주방장과 '중식'주방장들도 '레스토랑'이라는 추상클래스를 통해 각자 알아서 큰 틀에 맞는 작업들을
사장의 요구사항대로 수행할수있어 사장인 나는 훨씬 효율적으로 요리를 개발할수있을것이다.
이처럼, 추상클래스는 어떤 기능을 수행할지 아직 작성되지않은 추상 메소드를 가지고있다는 점을 제외하면
일반 클래스와 전혀 다르지않다. (= 라는말은 생성자도 있고, 멤버변수와 메서드도 가질수 있다는 말이다.)
인터페이스(interface)란?
인터페이스란 추상클래스보다 추상화 정도가 높은 일종의 추상클래스이다.
특징을 요약한다면,
- 인터페이스는 추상클래스와는 다르게 일반 메소드와 멤버변수를 가질수 없고, 오직 추상메소드와 상수(final)만을 가질수있다.
- 인터페이스로부터만 상속 받을수 있으며, 클래스와 달리 다중상속이 가능하다.
그래서, 추상클래스와 인터페이스는 도대체 뭐가 다른것일까?
추상클래스와 인터페이스는 하는 역할은 비슷해보이는데 굳이, 왜 귀찮게 나누었을까?
인터넷을 뒤져 여기저기에서 추상클래스와 인터페이스의 차이점을 찾아보았지만 막연하게 느껴지고 와닿지않아 그 본질에 대해 깊히 이해하는데 어려움이 있었다. 그래서 우선, 추상클래스와 인터페이스의 차이점에 집중해보았다.
인터페이스는 클래스와 달리 다중상속이 가능하다.
이 차이점을 통해 추론해보자면,
미완성된 설계도를 통해 어떠한 작업을 수행하고자 할때,
추상클래스는 상속받을 조상 추상클래스의 구성요소들 모두를 좋든 싫든 상속 받아야한다. ( = 확장의 개념)
그러나, 인터페이스는 다중상속이 가능하기때문에 여러 클래스들이 가진 구성요소들을 내 입맛대로 뽑아서 사용할수 있다 (= 구현의 개념)
이는 아마도 자바가 가지고있는 단일상속의 한계점을 극복하고, 다형성이라는 개념에 조금더 집중할수있도록
추상클래스와 인터페이스를 나누어 놓지 않았을까? 라는 생각이다.
이 말고도 다른 차이점이 있겠지만, 아직 명확하게 개념이 자리잡히지않아 만족할만큼 이해가 되지않는것같다.꾸준한 공부를 통해 실제로 사용해보면서 차이점을 어렴풋이나마 체감할수있도록 해야겠다.
'Category > JAVA' 카테고리의 다른 글
[JAVA] 객체지향 프로그래밍_ 1. 클래스와 인스턴스 (1) | 2023.10.18 |
---|---|
[SpringBoot] GetMapping과 PostMapping (0) | 2023.10.13 |
[JAVA] Static 이란? (1) | 2023.10.10 |
[자바] 배열을 활용하여 로또번호 만들기 (0) | 2023.10.09 |
그래들(Gradle)이란? (0) | 2023.10.04 |