티스토리 뷰

donaricano-btn
반응형

지난주 한 회사의 면접에서 다음과 같은 질문과 답변을 주고 받았습니다.

 

면접관 : 추상 클래스와 인터페이스의 차이에 대해서 설명해 보세요.

나 : 네, 추상 클래스는 추상 메소드를 가진 클래스이고 인터페이스는 추상 메소드로만 이루어져 있는 것입니다.

면접관 : 다른 차이점은 없나요?

나 : (당황) 어... 제가 실무에서는 거의 인터페이스만 사용해 봐서... 잘 모르겠습니다.

면접관 : (실망한 표정) 네, 알겠습니다.

 

집에 돌아오며 생각해 보니 제가 알고 있는 것만으로도 그 자리에서 몇가지 대답을 더 할 수 있었을텐데 당황하는 바람에 제대로 답변을 못 한 부분이 아쉬웠습니다. 만약 다른 면접장에서 비슷한 질문을 받게 된다면 더 잘 대답하기 위해 추상클래스와 인터페이스의 차이에 대해 기록해 두려고 합니다. 

 

위의 제 답변에서 처럼 추상클래스는 추상메소드를 포함하고 있는 클래스를 의미합니다. 추상메소드는 메소드의 내부가 구현되어 있지 않은 메소드 입니다. 클래스 내부에 이 추상 메소드가 하나라도 있다면 클래스 앞에 abstract 키워드를 붙여서 추상 클래스로 만들어 줘야 합니다. 추상 메소드는 상속받은 클래스에서 반드시 구현 되어야 하고 그렇기 때문에 추상 클래스에는 final 키워드를 붙일 수 없습니다.

 

그러나 추상클래스 내부에는 추상메소드 외에 일반 메소드나 변수가 존재할 수 있습니다. 이렇게 구현된 일반 메소드는 다른 클래스의 메소드와 똑같이 동작합니다.

 

추상클래스는 역시 다른 클래스나 인터페이스를 상속받을 수 있는데 추상클래스나 인터페이스를 상속받았을 때 상위 클래스의 추상메소드를 구현하지 않아도 괜찮습니다. 대신 이 추상클래스를 상속받는 하위 클래스는 이 추상클래스가 상속받은 상위 클래스의 추상메소드까지 모두 구현해야 합니다.

 

인터페이스는 모든 메소드가 추상 메소드로만 구성된 것을 의미하며 상속하는 클래스에서는 인터페이스에 존재하는 모든 추상메소드를 구현해야만 합니다. 반드시 상속이 되어야 하기 때문에 인터페이스 역시 final 키워드가 붙을 수 없습니다. 

 

인터페이스가 클래스와 다른 것은 다중 상속이 가능하다는 점 입니다. 이렇게 다중 상속을 받은 하위 클래스는 상속받은 모든 인터페이스를 구현해야 하고 모든 상위 인터페이스의 구현체로 사용할 수 있습니다.

 

추상클래스와 인터페이스는 하위 클래스에서 구현을 강제하는 추상 메소드를 포함한다는 공통점이 있습니다. 그런데 추상메소드가 필요한 것이라면 추상 클래스만 존재하면 될텐데 왜 인터페이스가 필요한 것일까요? 사실 이에 관한 이야기를 이미 제 블로그에서 했던 적이 있습니다. 상속과 관련된 포스트에서 였는데요. 정확하게 다시 한 번 설명해 보도록 하겠습니다.

 

 

결론부터 말씀드리면 자바는 클래스의 다중상속을 지원하지 않기 때문입니다. 위 그림에서 상위 클래스에 같은 이름의 메소드가 있다면 상속받은 하위클래스에서 그 메소드를 호출했을 때 어떤 메소드가 호출되어야 할지 알 수 없게 됩니다. 이를 흔히 죽음의 다이아몬드 문제라고 부르고 자바에서는 이런 상황을 방지하기 위해 처음부터 클래스의 다중상속을 금지하는 정책을 취합니다.

 

그러나 인터페이스는 어차피 모든 메소드가 추상메소드이기 때문에 같은 이름의 메소드가 존재한다고 하더라도 죽음의 다이아몬드 문제에서 자유롭습니다. 어차피 메소드는 하위클래스에서 오버라이드 되어야 하기 때문입니다.

 

그러나 다중상속이 인터페이스의 존재 이유는 아닙니다. 추상클래스와 인터페이스를 다시한 번 생각 해 봅시다. 인터페이스를 상속받은 클래스는 모든 메소드를 재정의 해야 합니다. 그리고 클래스의 인스턴스는 인터페이스를 통해 다형성을 가질 수 있습니다. 쉽게 말하면 인터페이스는 하위 클래스에게 일종의 설계도 역할을 합니다. 하위 클래스는 여러개의 설계도를 가질 수 있고 각각의 설계도에 맞는 구현체를 제공할 수 있는 것이죠.

 

그런데 추상 클래스의 경우는 조금 다릅니다. 일단 추상클래스는 다중상속을 할 수 없죠. 하위 클래스는 오로지 상속받은 추상 클래스의 기능을 이용하고 확장하는 역할을 하게 됩니다. 

 

결론적으로 '추상클래스는 상속받은 클래스의 기능을 이용하고 확장하는 것이고, 인터페이스는 하위 클래스에게 일종의 설계도를 제공한다.' 라는 것이 추상클래스와 인터페이스의 궁극적인 차이점이라고 할 수 있겠습니다.

 

 

반응형

'language > JAVA' 카테고리의 다른 글

전략 패턴(Strategy Pattern)  (0) 2020.02.11
String 문자열 객체간의 비교  (0) 2019.12.17
final 키워드  (0) 2019.10.12
String class methods  (0) 2019.07.04
BufferedInputStream과 BufferedOutputStream  (0) 2019.05.06
donaricano-btn
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함