1. 상속 (extends)
-
분류(클래스)에 대한 확장, 재사용
-
재사용이라 함은 코드의 중복을 제거하기 위함
-
상위 클래스는 더 추상화 된 클래스
-
하위 클래스는 더 구체화 된 클래스
-
분류구조를 가짐
-
하위클래스는 상위클래스이다. (하위클래스 is a kind of 상위클래스 -> LSP 원칙)
-
모든 클래스는 'Object' 클래스를 상속 받는다.
2. 분류도 예시

-
음식이라는 분류를 한식, 양식으로 구체화 했다.
(= 한식, 양식이라는 분류는 음식으로 추상화 된다.) -
한식이라는 분류를 비빔밥, 찌개로 구체화 했다.
(= 비빔밥, 찌개라는 분류는 한식으로 추상화 된다.) -
양식이라는 분류를 피자, 파스타로 구체화 했다.
(= 피자, 파스타라는 분류는 양식으로 추상화 된다.)
3. 음식을 통해 상속을 사용해 보자
-
Food
public class Food { private String name; public Food(String name) { this.name = name; } public void showName() { System.out.println(name); } }
음식은 이름을 가지고 있으며, 이름을 출력할 수 있다.
-
WesternFood
public class WesternFood extends Food { private String nation; public WesternFood(String name, String nation) { super(name); this.nation =nation; } public void showNation() { System.out.println(nation); } }
양식은 국가(원산지?)를 가지고 있으며, 국가를 출력할 수 있다. Food 클래스로부터 상속 받는다.
-
Pizza
public class Pizza extends WesternFood { private int price; public Pizza(String name, String nation, int price) { super(name, nation); this.price = price; } public void showPrice() { System.out.println(price); } }
피자는 가격을 가지고 있으며, 가격을 출력할 수 있다. WesternFood 클래스로부터 상속 받는다.
-
Pasta
public class Pasta extends WesternFood { private int price; public Pasta(String name, String nation, int price) { super(name, nation); this.price = price; } public void showPrice() { System.out.println(price); } }
파스타는 가격을 가지고 있으며, 가격을 출력할 수 있다. WesternFood 클래스로부터 상속 받는다.
-
Driver
public class Driver { public static void main(String[] args) { Pizza cheesePizza = new Pizza("치즈피자", "미국", 10000); cheesePizza.showName(); //치즈피자 cheesePizza.showNation(); //미국 cheesePizza.showPrice(); //10000 Pasta creamPasta = new Pasta("크림파스타", "이탈리아", 12000); creamPasta.showName(); //크림파스타 creamPasta.showNation(); //이탈리아 creamPasta.showPrice(); //12000 } }
이렇듯, Pizza와 Pasta가 양식이라는 공통적 특성을 가지고 있기 때문에 WesternFood라는 상위클래스를 만들고, 상속 받게끔 하여 중복을 제거하였다.
그런데, 코드를 보다보면 거슬리는게 보이지 않는가?
각 Pizza, Pasta의 속성을 보면 가격이라는 중복된 코드가 보일 것이다.
가격이라는 속성도 결국 음식이 가지는 공통된 특성이기 때문에 Food 클래스가 가지도록 구현하면, 좀 더 상속을 통한 코드의 중복을 제거할 수 있겠다.
4. 상속의 메모리 상태
- Pizza 클래스로 객체를 생성하면, heap영역에 Pizza객체 뿐만 아니라, 상위클래스인 WesterFood, Food 객체도 생성된다.
5. 느낀점
객체지향 언어가 왜 인간지향 언어인지 다시 한번 생각해보게 된다.
주변 사물에 대한 관찰과 이해가 필요한 학문인 것 같다.
'Java' 카테고리의 다른 글
[디자인 패턴] 싱글톤 패턴 (0) | 2021.09.19 |
---|---|
[Java] String = "" / String = new String("") 비교 (0) | 2020.02.15 |
[Java] 추상화 (1) | 2019.05.02 |
[Java] JVM(Java Virtual Machine) (0) | 2019.04.28 |
[Java] 자바 프로그램 구동 및 실행 과정 (1) | 2019.04.27 |