키보드워리어

[자바]객체지향 - 왜 상속을 사용해야 하는가? (Inheritance) 본문

JAVA/입문

[자바]객체지향 - 왜 상속을 사용해야 하는가? (Inheritance)

꽉 쥔 주먹속에 안경닦이 2023. 3. 5. 11:07
728x90

상속

객체지향프로그래밍에서 클래스는 코드를 재사용하고 중복을 방지하기 위한 도구입니다.

 

그러나 두 클래스 사이에 중복된 코드가 많을 때, 클래스를 복제하여 중복을 제거하는 것은 유지보수를 어렵게 만들 수 있습니다.

 

이때 상속(Inheritance)이라는 개념이 유용합니다.

상속은 이미 구현된 클래스(부모 클래스)를 이용해 새로운 클래스(자식 클래스)를 만들 수 있도록 해줍니다. 이를 통해 중복된 코드를 제거하고 객체의 관계를 더 명확하게 표현할 수 있습니다.

 

예를 들어, Person 클래스와 Student 클래스를 생각해 보겠습니다. 두 클래스는 많은 멤버 변수와 메서드를 공유하지만, 일부 멤버 변수(collegeName, year)만 Student 클래스에서 사용합니다. 이때 상속을 사용하면 Person 클래스에서 이미 구현된 코드를 Student 클래스에서 재사용할 수 있습니다.

 

Person클래스
Person클래스
Student 클래스
Student 클래스

Person에서 email이 바뀔경우 Student에서도 바꾸어야 하고 너무 복잡해지는걸 막기 위해서 상속을 이용합니다.

 

public class Person {
  private String name;
  private int age;
  private String email;

  // constructor, getter/setter methods
}

public class Student extends Person {
  private String collegeName;
  private int year;

  // constructor, getter/setter methods
}

 

위 코드에서 Student 클래스는 Person 클래스를 상속합니다.

 

이를 통해 Person 클래스에 있는 코드를 Student 클래스에서 재사용할 수 있습니다. 이제 Student 클래스에서는 collegeName과 year 멤버 변수만 추가하면 됩니다.

 

이러한 상속 관계를 통해 코드의 재사용성을 높일 수 있으며, 객체의 관계를 더 명확하게 표현할 수 있습니다. 하지만 상속은 항상 좋은 것만은 아닙니다. 상속은 is-a 관계를 나타내는 경우에만 사용해야 합니다. 즉, 자식 클래스가 부모 클래스의 특정 유형이 되어야 합니다.

상속의 좋은 예시

// 좋은 예시: Square는 Rectangle의 일종이다.
class Rectangle {
  protected int width;
  protected int height;

  public void setWidth(int width) {
    this.width = width;
  }

  public void setHeight(int height) {
    this.height = height;
  }

  public int getArea() {
    return width * height;
  }
}

class Square extends Rectangle {
  @Override
  public void setWidth(int width) {
    this.width = width;
    this.height = width;
  }

  @Override
  public void setHeight(int height) {
    this.width = height;
    this.height = height;
  }
}

 

상속의 안좋은 예시

// 좋지 않은 예시: Bird 클래스를 상속받아 Airplane 클래스를 만드는 경우
class Bird {
  protected int wings;
  protected String feather;

  public void fly() {
    System.out.println("I can fly");
  }
}

class Airplane extends Bird {
  private int engine;

  public void takeOff() {
    System.out.println("I can take off");
  }
}

만약 두 클래스 사이에 is-a 관계가 없다면 상속은 적절하지 않습니다.

 

예를 들어, Bird 클래스와 Airplane 클래스가 있다고 가정해 보겠습니다. Bird 클래스는 날개와 깃털을 가지고 있으며 날아다닐 수 있지만, Airplane 클래스는 날개가 없고 엔진으로 움직입니다.

 

이때 Bird 클래스를 상속받아 Airplane 클래스를 만든다면 코드의 재사용성을 높이지만, 이는 올바른 객체의 관계를 표현하지 않습니다. Bird 클래스와 Airplane 클래스는 is-a 관계가 아니기 때문입니다.

 

상속은 코드의 재사용성을 높이고 객체의 관계를 명확하게 표현할 수 있는 유용한 도구이지만, 항상 적절한 상황에서 사용해야 합니다. Is-a 관계가 아닌 경우에는 다른 방법을 고려해보아야 합니다.

 
728x90