본문 바로가기
Java

[Java] 상속

by foreverever 2019. 5. 5.
반응형

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