클래스의 상속

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;
    }
}

age와 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’라는 키워드를 이용해서 Person 클래스를 상속받아 확장하여 Student 클래스를 정의했다. Student 클래스 정의에는 직접적으로 나와있지 않지만 부모 클래스인 Person 클래스의 메소드인 getAge()와 getName() 메소드를 호출 할 수 있다.

일반적으로 두 클래스 간의 관계가 ‘IS-A’ 관계이면 상속을 사용한다. Student is a person이므로 상속을 통해서 클래스를 정의하는게 자연스럽다.

클래스의 위임

상속과 다르게 위임은 다른 클래스의 객체를 멤버로 갖는 형태의 클래스 정의다.

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();
    }
}

이 경우 특정 메소드 호출을 멤버 클래스의 메소드에 포워드(Forward)하는 식으로 구현하게 된다.

Employee 클래스와 Department 클래스 사이의 관계를 살펴보면 ‘IS-A’ 관계는 아니다. (Employee is a Department는 어색하다.) 따라서 멤버 변수로 Department 클래스를 포함하는 Delegation 형태로 구현을 했다.

상속과 위임

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

Comment and share

implements와 extends의 차이

  • extends는 일반 클래스와 abstract 클래스 상속에 사용되고, implement는 interface 상속에 사용된다.
  • class가 class를 상속받을 땐 extends를 사용하고, interface가 interface를 상속 받을 땐 extends를 사용한다.
  • class가 interface를 사용할 땐 implements를 써야하고
    interface가 class를 사용할 땐 implements를 쓸수 없다.
  • extends는 클래스 한 개만 상속 받을 수 있다.
  • extends 자신 클래스는 부모 클래스의 기능을 사용한다.
  • implements는 여러개 사용 가능하다.
  • implements는 설계 목적으로 구현 가능하다.
  • implements한 클래스는 implements의 내용을 다 사용해야 한다.

Comment and share

  • page 1 of 1

Hyeon Soo Ahn

author.bio


author.job