[Java] 객체지향 4대 특성 - 상속(확장)
- 2 mins상속이란?
상속의 목적은 분류에 있다. 이를 통해 재사용성과 확장성을 얻는다.
- 잘못된 상식
// 딸을 낳으니 아버지 역할을 한다? (x)
Father dauther = new Dauther();
// 팽귄을 낳으니 새의 역할을 한다? (o)
Bird penguin = new Penguin();
객체지향에서 상속은 계층이 아닌 확장.
보통 상속이 계층적
이라 착각한다. 그래서 Father
의 자식(하위)클래스가 Dauther
라 생각한다. 하지만 딸이 아버지의 역할을 할 순 없다.
반대로 Bird의 한 종류인 Penguin은 Bird의 역할을 할 수 있다.
// 자식의 한 종류인 딸이 자식의 역할을 한다.
Child dauther = new Dauther();
- 상위클래스로 갈 수록 더 추상화되고 일반화 된다.
- 하위클래스로 갈 수록 더 구체화되고 특수화 된다.
- 하위클래스는 상위클래스로 쓰일 수 있다.
하위클래스
is kind of 상위클래스
=> 객체지향 5원칙 중 LICOV 치환 원칙
키워드도 inheritance (상속)이 아닌 extends (확장)이다.
고래는 포유류를 상속 받는다? (x)
고래는 포유류를 확장한 것이다.(o)
penguin
객체의 T 메모리 매핑과정
JVM의 메모리를 추상화한 T 메모리란 용어에 대해 알고 싶으면 이 글을 읽어볼 것
- Animal
class Animal { String name; public void showName() { System.out.println(this.name); } }
- Penguin
class Penguin extends Animal { String habitat; public void showHabitat() { System.out.println(this.habitat); } }
- Driver
public class Driver { public static void main(String[] args) { Penguin pororo new Penguin(); pororo.name = "뽀로로"; pororo.habitat = "남극"; pororo.showName(); pororo.showHabitat(); } }
Penguin
class로 객체를 생성하면 heap 영역
에 Penguin
객체 뿐만아니라. 상위클래스인 Animal
객체도 생성이 된다.
- 만약 Animal pororo = new Penguin(); 이렇게 pororo를 생성한다면 pororo는
heap
영역의 Penguin 객체가 아닌 Animal 객체를 참조하게 된다.