우노
[Java] extends, implements의 차이 본문
상속(Inheritance)이란?
상속에 대해서 다루기 전에 우선, OOP(Object-Oriented Programming, 객체지향프로그래밍)가 무엇인지에 대해 알고 있어야한다.
- OOP는 다음과 같은 특징을 가지고 있다.
- 상속과 인터페이스 (계층성)
- 다형성, 사용편의성 (모듈화)
- 캡슐화, 정보은닉
- 자료 추상화 (모델링)
- 동적 바인딩
- OOP는 다음과 같은 특징을 가지고 있다.
아래 그림을 통해, 상속에 대해 이해해보자.
상자 하나하나는 모두 객체(Object)이고, 자바 용어로는 Class이다.
이러한 계층을 표현하기 위해 만들어진 것이 바로 상속이다.
상속 시, 하위 객체(자식)는 상위 객체(부모)의 특징(메소드, 변수 등)을 물려받게 된다.
이 때, 상위 객체(부모)의 특징(메소드, 변수 등)을 '새롭게 구현'하는가, '그대로 사용'하는가에 따라서 상속의 형태가 갈리게 된다.
- extends
- 부모에서 선언/정의를 모두하며, 자식은 오버라이딩 할 필요 없이 부모의 메소드/변수를 그대로 사용할 수 있다.
- "부모의 특징을 연장해서 사용한다."라고 기억하면 될 듯!
- implements (interface 구현)
- 부모 객체는 선언만 하며, 정의는 반드시 자식이 오버라이딩해서 사용한다.
- "부모의 특징을 도구로 사용해 새로운 특징을 만들어 사용한다."라고 기억하면 될 듯!
- abstract
- extends와 interface의 혼합이다.
- extends를 사용하지만, 몇 개는 추상 메소드로 구현되어 있다.
- extends
extends
사실 extends가 상속의 대표적인 형태이다.
모든 선언/정의를 부모가 하며, 자식은 오버라이딩 할 필요 없이 부모의 메소드/변수를 그대로 사용할 수 있다.
물론, 필요에 따라 오버라이딩 해도 상관 없다.
예제 코드
class Vehicle { protected int speed = 3; public int getSpeed(){ return speed; } public void setSpeed(int speed){ this.speed = speed; } } class Car extends Vehicle{ public void printspd(){ System.out.println(speed); } } public class ExtendsSample { public static main (String[] args){ Car A = new Car(); System.out.println(A.getSpeed()); A.printspd(); } }
Car 클래스는 Vehicle 클래스의 변수와 메소드를 상속 받았다.
따라서, Car 클래스는 Vehicle 클래스의 speed, getSpeed(), setSpeed()를 사용할 수 있다.
하지만, Java는 "다중상속"을 지원하지 않는다.
즉, 부모 클래스가 두 개 이상 존재할 수 없다는 것이다.
- ex) public class Son extends Father, Mother {...}
하지만, Java는 implements를 사용해 여러 interface를 상속 받을 수 있다.
implements
부모는 선언만 하며, 반드시 자식이 정의를 오버라이딩해서 사용한다.
예제 코드
interface TestInterface{ public static int num = 8; public void fun1(); public void fun2(); } class InterfaceExam implements TestInterface{ @Override public void fun1(){ System.out.println(num); } @Override public void fun2() { } } public class InterfaceSample{ public static void main(String args[]){ InterfaceExam exam = new InterfaceExam(); exam.fun1(); } }
사실, "이러한 구현은 부모의 메소드를 어차피 재정의해야하니 '상속'의 의미가 없지 않나?"라고 할 수 있지만,
Java와 c#의 인터페이스 상속은, 계약 및 분류의 의미가 강하다고 한다.
정리
- extends는 클래스 한 개만 상속 받을 수 있으며, 자식 클래스는 부모 클래스의 기능을 사용할 수 있다.
- implements는 여러 개의 interfaces를 상속 받을 수 있으며, 자식 클래스는 부모의 기능을 다시 정의해서 사용해야한다.
참고
'Language > Java' 카테고리의 다른 글
[Java] 객체 지향 프로그래밍(Object-Oriented Programming, OOP)이란? (0) | 2021.03.12 |
---|---|
[Java] 오버로딩(Overloading)과 오버라이딩(Overridding)의 차이 (0) | 2021.03.12 |
[Java] Superinterface란? (0) | 2021.03.12 |
[Java] 컴파일과 빌드의 차이점 (0) | 2020.07.17 |
[Java] JAR 란? (0) | 2020.07.17 |