상속(Inheritance)이란?
상속에 대해서 다루기 전에 우선, OOP(Object-Oriented Programming, 객체지향프로그래밍)가 무엇인지에 대해 알고 있어야한다.
OOP는 다음과 같은 특징을 가지고 있다.
- 상속과 인터페이스(계층성)
- 다형성, 사용편의성(모듈화)
- 캡슐화, 정보은닉
- 자료 추상화(모델링)
동적 바인딩
아래 그림은 상속에 대한 이해를 돕기 위한 그림이다.
상자 하나하나는 모두 객체(Object)이고, 자바 용어로는 Class이다.
이러한 계층을 표현하기 위해 만들어진 것이 바로 상속이다.
상속 시, 하위 객체(자식)는 상위 객체(부모)의 특징(메소드, 변수 등)을 물려받게 된다.
이 때, 상위 객체(부모)의 특징(메소드, 변수 등)을 '새롭게 구현'하는가, '그대로 사용'하는가에 따라서 상속의 형태가 갈리게 된다.
extends
부모에서 선언/정의를 모두하며, 자식은 오버라이딩 할 필요 없이 부모의 메소드/변수를 그대로 사용할 수 있다.
(→ 부모의 특징을 연장해서 사용한다.)
implements(interface 구현)
부모 객체는 선언만 하며, 정의는 반드시 자식이 오버라이딩해서 사용한다.
(→ 부모의 특징을 도구로 사용해 새로운 특징을 만들어 사용한다.)
abstract
extends와 interface의 혼합이다.
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는 여러 개의 interface를 상속 받을 수 있으며, 자식 클래스는 부모의 기능을 다시 정의해서 사용해야한다.
'Language > Java' 카테고리의 다른 글
araFarm (0) | 2022.08.11 |
---|---|
[Java] 메소드 오버로딩 (Method Overloading) (0) | 2022.08.11 |
[Java] 다차원 배열 (multi-dimensional array) (0) | 2022.08.11 |
[Java] 해시테이블 (Hashtable) (0) | 2022.08.11 |
[Java] 해시맵 (HashMap) (0) | 2022.08.10 |