본문 바로가기
👨‍💻 프로그래밍/Java, Kotlin, Spring

자바 21 - 자바 상속(Inheritance)

by 개발자 진개미 2021. 5. 21.
반응형

객체지향 프로그래밍에서 상당히 중요한 개념 중에 하나가 바로 상속이다. 상속은 우리가 일상생활에서도 흔히 쓰는 단어 중 하나인데, 객체지향에서의 상속도 이 일상생활에서의 의미와 상당히 비슷하다. 상속을 사용하는 이유는, 상속을 쓰는게 더 쉽게 코드를 짤 수 있기 때문이다. 상속에 대해 더 자세히 알아보자.

 


상속이란?

객체지향에서 상속은 현실에서의 상속과 마찬가지로 프로퍼티(Prperty)와 매소드(Method)를 물려 받는 것이다. 프로퍼티는 쉽게 말해 클래스 안에 있는 변수이고, 매소드는 쉽게 말해 클래스 안에 있는 함수이다. 현실에서의 상속과 마찬가지로, 모든 프로퍼티와 매소드를 물려 받는 것이 아니라, 접근 제어자가 private인 프로퍼티나 매소드는 상속할 수 없다.

 

상속에서 상속을 해주는 클래스를 부모 클래스(Parent Class)나 상위 클래스, 혹은 슈퍼 클래스(Super Class)라고 하고, 상속을 받는 클래스를 자식 클래스(Child Class)나 하위 클래스, 혹은 서브 클래스(Sub Class)라고 한다.


상속을 하면 뭐가 좋을까?

상속을 하면 코드가 더 깔끔해 진다. 왜냐하면 상속을 한다는거 자체가 두 클래스 간에 공통점이 많다는 것이고, 그렇기 때문에 중복된 코드를 줄일 수 있다. 중복된 코드가 줄면 당연히 유지보수도 더 편하고, 가독성도 올라간다.

 

무리하게 상속을 쓸 필요는 없겠지만, 가능하다면 상속을 쓰는 것이 쓰지 않는것 보다는 코드가 더 깔끔해 질 것이다.


상속은 어떨때 해야 할까?

상속은 크게 2가지 경우에서 하는게 좋다.

 

  1. 두 클래스 간에 기능이 중복되는 프로퍼티나 매소드가 많은 경우
  2. 두 클래스 간에 명백한 상하관계가 있을 경우

첫 번째 예시에서는 당연히 상속을 하는게 직관적으로 좋을 것이다. 그렇다면 상하관계가 확실하다는 것은 어떤 것을 말하는 것일까?

 

여기서 말하는 상하관계는 흔히 종류라고 생각해 볼 수 있다.

 

예를 들어, 강아지라는 클래스를 만든다면 다음과 같은 변수와 함수가 있을 것이다.

 

class Dog {
    public double weight;
    public double height;
    public double type;
    
    public String bark(){}
    public void eat(){}
    public void sleep(){}
}

 

강아지 클래스의 변수에는 크게 몸무게, 신장, 견종이 있고, 함수에는 짓기, 먹기, 잠자기가 있다. 위와 같은 변수나 함수는 어떤 견종인지에 상관없이 모두 가지고 있다. 그렇기 때문에 예를 들어 다양한 견종들의 클래스를 만들때, 강아지 클래스를 상속받아 만들면 공통된 특징을 구현하는 수고를 덜 수 있다.

 

 

강아지의 예시는 프로그램에서 강아지를 구현하는 일은 없기 때문에 와닿지 않을 수도 있다. 그래서 체스를 예로 들면, 체스 프로그램을 구현할때 체스 말이라는 클래스를 만들고, 체스 말이 공통적으로 가지는 특징을 모두 구현한 다음에, 각각의 체스말은 그 특징을 상속받아 사용하면 당연히 코드가 훨씬 간결해 질 것이다.


상속하는 방법, 문법

그렇다면 상속이 뭔지는 알았는데, 상속은 자바에서 실제로 어떻게 할까? 자바에서는 상속을 자식 클래스 뒤에 extends와 부모 클래스를 적어서 한다.

 

class childClass extends parentClass {}

 

주의할 점은, 자식 클래스는 여러 부모 클래스로부터 상속을 받을 수 없다는 점이다. 예를 들어, 아래와 같은 코드는 성립할 수 없다.

 

class childClass extends parentClass1, parentClass2 {} //절대 안 됨!

상속을 실제로 사용한다면?

여태까지 상속에 대해서 알아봤지만, 실제로 상속이 어떤지는 아직 와닿지 않을 수 있다. 상속을 실제로 사용해보자.

 

아래의 코드는 포유류라는 부모 클래스를 고양이 클래스에 상속하고, 그 고양이 클래스를 다시 페르시안 고양이 클래스에 상속하는 코드이다. 

 

public class Mammal {
    boolean hasFur = true; 
    public void makeSound(){}
}

public class Cat extends Mammal {
    boolean hasClaws; 
    String furColor;
    public void makeSound() {
        System.out.println(“Meow!”);
    }
}

public class Persian extends Cat {
    String furColor = “White”;
    public void makeSound() {
       System.out.println("Hiss!”); }
}

 

먼저, 부모 클래스인 포유류에 털이 있는지의 변수가 있고, 이는 true로 되어 있다. 모든 포유류는 털이 있기 때문에 상속 받은 클래스들은 이 변수를 변경하지 않았다. 울음 소리를 내는 함수는 구현이 되지 않았기 때문에, 자식 클래스들이 각자 구현을 했고, 그 외에도 부모 클래스에는 없는 변수나 함수들을 필요에 따라 추가하기도 했다.


 

반응형