본문 바로가기
Development/JAVA

[자바]extends와 implements의 차이점

by True Life 2015. 12. 21.


자바 프로그래밍 - extends, implements 차이점


자, 자바에서 헷갈릴 수 있는 개념 중 하나임과 동시에 자바 프로그래밍, 아니 객체지향프로그래밍(Object oriented programming)에서 매우 중요한 내용 중 하나입니다.


시작합니다!


1. 상속이란(Inheritance)


객체지향 프로그래밍이란 단순하게 보면 Object들이 서로서로 짜임새 있게 논다. 라고 단순히 표현할 수 있습니다만 어렵게 보면 6대 특징이니 5대 원칙이니를 들먹이면서 멋진척을 할 수 있습니다.


여기서 OOP(객체지향프로그래밍)의 특징은 무엇이냐 (6대냐 5대냐 4대냐 그런거 따지고 싶지 않습니다. 사람마다 다르고 자료마다 다릅니다. 중요한 포인트 기준으로 이해만 하시기 바랍니다..)


1. 상속과 인터페이스 (계층성)

2. 다형성, 사용편의성 (모듈화)

3. 캡슐화, 정보은닉

4. 자료 추상화 (모델링)

5. 동적바인딩


참 이상한게 많죠, 배울것도 많을 것 같은데 사실 한두가지 알게 되면 나머지는 그냥 이해하시면 됩니다.

가장 중요한건 제 생각에 위에 3가지, 상속/다형성/캡슐화라고 봅니다. 자료 추상화는 "클래스, 객체, 메소드, 메시지"를 뜻하는 것이라서 사실상 OOP의 정의라고 볼수도 있구요~


자 여기서 상속에 대해서 조금 알아봅시다. 상속을 설명할때 정말 항~상 등장하는 그림!


(사실 이런거 만드는게 더 힘들어요 ㅠ)


상속이 무엇인지 예상 되시나요? 빨간색 상자들 하나하나는 전부 객체(Object)입니다. 자바 용어(키워드)로는 Class!

자, 이러한 계층을 표현(구현)하기 위해 만들어진 것이 바로 상속입니다.

하위 객체는 상위 객체(부모)의 특징을 물려받습니다. 예를들어 동물의 특징 '움직이다'를 공룡/파충류/포유류는 그대로 물려받죠, 이를 표현하면 move() 메소드를 공룡/파충류/포유류 모두 사용할 수 있다는 뜻입니다.

또다른 예로 나이(age)변수 또한 동물 객체에 선언되어 있다면 물려받게 됩니다.

이 메소드 또는 변수를 '구현'하는가 그대로 '사용'하는가에 따라서 상속의 형태가 갈리게 됩니다.


1. extends : 부모에서 선언/정의를 모두 하며 자식은 메소드/변수를 그대로 사용할 수 있음

2. implements (interface 구현) : 부모 객체는 선언만 하며 정의(내용)은 자식에서 오버라이딩 해야 함

3. abstract : extends와 interface 혼합. extends하되 몇 개는 추상 메소드로 구현되있음


2. extends (상속)


사실 extends가 상속의 대표적인 형태입니다. 부모의 메소드를 그대로 사용할 수 있으며 오버라이딩 할 필요 없이 부모에 구현되있는 것을 직접 사용 가능합니다.





자, 항상 예제 소스코드는 한번 보고 예상을 하면서라도 파악을 할 줄 아는 연습이 필요합니다.

Car라는 클래스는 Vehicle을 상속 받았습니다. 그리고 getSpeed() 메소드로 speed를 불러올 수 있습니다. 그런데 여기서 printspd() 메소드에서는 speed를 직접 바로 사용 했습니다. extends를 했으니 메소드 뿐만 아니라 변수까지 사용이 가능해 지는 것입니다. 여기서 접근지정자의 역할이 있는데..


 public: 다 된다. A클래스를 B클래스에서 생성하고 a.var; 이게 된다. (다른패키지에서도O)

 protected : 상속시:자식 클래스→부모 클래스 호출 가능(다른패키지O) 동일패키지라면 비상속시 O

                 == 상속 || 동일패키지

 default : 상속 && 동일패키지

 private : 클래스 내부에서만 사용 가능


이해가 되시나요,


 public

protected

default 

private 

 All

 상속 || 동일패키지

 상속 && 동일패키지

클래스 내부 


나름 깔끔하게 정리한다고 정리 해보았습니다. 그래도 이해가 안되시는 분들을 위하여 각 예제를 통해 정리하겠습니다.

 [자바-Java] 접근지정자, public, protected, default, private(Access Modifiers)


여기서 하나만 더 짚고 가면..


자바는.. "다중상속"을 지원하지 않는다! 


자바가 다중상속을 지원하지 않는다? 맨위의 그림을 보면, 분명 동물-공룡-둘리의 형태로 두번 상속 되었습니다. 그렇다면 이게 불가능하단 걸까요?



위 예제는 완벽하게 동작합니다. 다중상속이란 할아버지-아버지-아들.. 이런 뜻이 아닙니다. 위에서 말한 다중상속이란 부모노드에서 부모가 두명 있는 것입니다. 예를들면 저는 아버지와 어머니가 계십니다(예가 조금 이상하게 느껴진다면 ㅈㅅ;)

그렇다고 해서


 public class Son extends Father, Mother { 


이렇게 사용할 수 있을까요? 이게 지원되지 않는다는 겁니다..!

자, C++의 경우에는 다중상속을 지원합니다(이 경우 Virtual 키워드 필요)

자바는 다중상속을 지원하지 않습니다. 대신 implements (인터페이스)가 나타났습니다^^;

왜 자바는 다중상속을 지원하지 않고, C++도 지원하기 위해 virtual을 사용 해야할까요? 그건 다음 포스팅에서..!


[자바-Java]다중상속 지원 문제


3. implements (상속)



이렇게 인터페이스는 부모의 메소드를 반드시 재정의해야합니다.

한가지 유용한 예로 Runnable과 Thread가 있습니다.


또한 이 implements는 다중상속을 대신해줍니다.


 public class Son implements Father, Mother { 


이러한 형태로 말이죠..


근데 잠깐, "이러한 구현은 메소드를 어차피 재정의해야되니 '상속'의 의미가 아니지 않습니까!" 이런 의문이 들 수 있습니다. 사실 저도 이걸 진정한 상속 이라고 생각하지는 않습니다만 자바가 그렇다는데 어쩌겠습니까..


단, 어느정도 이해하시는데 도움을 드리자면, Java와 C#의 인터페이스 상속은 계약 및 분류의 의미가 강합니다.

언어별 차이에 따른 정확한 내용은 다음 포스팅에서 하겠습니다.


[C++, JAVA, C#]상속, 다중상속 및 추상클래스에 따른 고찰