본문 바로가기
Old Posts/Java

[Java] 자바 상속(Inheritance)과 위임(Delegation) 차이점

by A6K 2021. 7. 20.

자바를 이용해서 클래스를 구현할 때 '상속(Inheritance)'과 '위임(Delegation)'을 이용해서 두 클래스를 연관시킨다. 클래스의 상속과 위임 방식에 대해서 설명을 하고 어떤 상황에서 어떤 것을 선택해야하는지 알아보자.

클래스의 상속(Inheritance)

객체지향 프로그래밍 언어에서 다른 클래스를 상속해서 새로운 클래스를 정의할 수 있다. 예를 들어 Person 클래스를 생각해보자.

class Person {

    protected int age;

    protected String name;

    public Persion(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public int getAge() {
        return this.age;
    }

    public String getName() {
        return this.name;
    }
}

사람의 이름과 나이를 저장하는 필드를 가지고 있는 Person 클래스가 있다. 이를 상속해서 Student 클래스를 정의해보자.

class Student extends Person {

    protected String studentNumber;

    public Student(int age, String name, String studentNumber) {

        super(age, name);
        this.studentNumber = studentNumber;
    }

    public String getStudentNumber() {

        return this.studentNumber;
    }
}

자바는 'extends' 키워드를 이용해서 클래스를 상속해 새로운 클래스를 정의할 수 있다. Student 클래스는 Person 클래스를 상속받아 새로운 멤버 변수인 studentNumber를 추가했다. Student 클래스의 정의에는 나와있지 않지만 부모 클래스인 Person 클래스의 메소드인 getAge()와 getName() 메소드를 호출할 수 있다.

상속은 두 클래스 사이의 관계가 'IS-A' 관계일 때 사용한다. 'Student' is a 'Person'이므로 상속을 통해서 클래스를 정의하는게 자연스럽다.

클래스의 위임(Delegation)

상속과 다르게 위임은 다른 클래스를 멤버로 포함하는 형태로 정의하는 방법이다.

class Employee {

    private Department department;

    private String name;

    publiv Employee(String name, Department department) {

        this.name = name;
        this.department = department;
    }

    public String getDepartmentName() {

        return this.department.getName();
    }
}

Employee의 멤버로 Department 클래스를 포함했다. 'Employee' is a 'Department'가 아니기 때문에 상속을 통해 구현하기는 바람직하지 않다. 이런 경우에는 Department 클래스를 멤버로 포함하는 위임(Delegation) 방식이 옳다.

언제 무엇을 사용하나?

사실 둘 중에 어느쪽을 사용하는지는 프로그래머의 선택에 달렸다. 상황에 따라서 적당한 방법으로 두 클래스를 연관시켜야 한다. 일반적으로는 다음과 같은 판단기준을 사용한다.

  • 두 클래스의 관계가 'IS-A' 관계이면 상속(Inheritance)을 써야한다.
  • 기존에 존재하는 API에 넘겨줘야 하는 경우 상속(Inheritance)을 써야한다.
  • final 클래스를 확장하고 싶은 경우 위임(Delegation)을 써야한다.

개발자 중에 코드를 재사용하겠다고 상속을 남발하는 경우가 있다. 당장 작성해야하는 코드는 줄어들어서 효율적인 것처럼 보인다.

하지만 상속을 사용해서 클래스를 정의한 경우, 부모 클래스와 자식 클래스 사이에는 강한 연관관계가 생기게 된다. (Tightly-Coupled 된다.) 이 경우 부모 클래스의 동작이 변경되면 자식 클래스들의 동작도 모두 영향을 받게 된다.

두 클래스의 관계가 'IS-A' 관계인 경우 이런 변경은 자연스럽다. 하지만 일반적인 경우 두 클래스 사이에 불필요한 종속성(Dependencies)이 생기는 것을 옳지 못하다. 따라서 무분별하게 상속을 남발하는 경우는 피해야한다.

클래스의 상속과 위임을 잘 알고 사용하자.

댓글