상속 vs 구성

Heidi·2023년 6월 14일
0

구성 및 상속은 모두 클래스를 연결하여 코드 재사용성을 제공한다.

상속은 한 클래스를 다른 클래스에서 파생시키는 반면, 구성은 하나의 클래스를 다른 클래스의 합으로 정의한다. 상속 관계에서 부모 클래스를 변경하면 코드가 손상될 위험이 있다. 구성을 통해 생성된 클래스와 객체는 느슨하게 결합되어 코드를 손상시키지 않고 요소를 쉽게 변경할 수 있고, 더 만많은 유연성을 제공한다.

is-a 관계

is-a 관계는 "A는 B의 일종이다." 라고 말하는 것과 같고 단방향이다.
EX 사과는 과일의 일종, 강아지는 동물의 일종.

is-a 관계가 있으면 상속을 사용한다.

강아지는 동물의 일종이다. 따라서 동물을 나타내는 클래스와 강아지를 나타내는 클래스를 상속 관계로 연결하는 것이 합리적이다.

상속을 사용하면 부모 클래스와 자식 클래스의 강한 연관 관계가 생기게 된다. 이 경우 부모 클래스가 변경되면 자식 클래스도 모두 영향을 받게 된다. 따라서 is-a 관계인지 아닌지 잘 구분해서 상속을 사용해야 함.

has-a 관계

만약 "~은 ~을 가지고 있다" 와 같은 has-a (포함) 관계가 성립되면 이 관계는 상속을 사용하면 안되고, 구성을 사용하여야 한다. 하나의 클래스 안에 다른 클래스의 객체를 포함시키면 된다. 구성에서는 하나의 객체가 다른 객체의 부품(part-of)이 된다.

EX 자동차는 엔진을 가지고 있다. 도서관은 책을 가지고 있다. 집은 욕실을 가지고 있다.

class Vehicle {}
class Engine {}
class Brake {}

public class Car extends Vehicle {
	private Engine e;
    private Brake b;
    public car() {
    	this.e = new Engine();
        this.b = new Brake();
    }
}
  1. Vehicle 과 Car 은 is-a 관계니까 상속(extends)로 연결함.

  2. Car과 Engine은 has-a 관계. has-a 관계에서는 하나의 클래스(Car) 안에 다른 클래스(Engine)를 가리키는 참조 변수(e)가 포함되고, 여기에 실제 객체가 생성(new Engine();)되어서 대입된다.

  3. 이 경우 우리는 자동차에 엔진과 브레이크가 있다는 것을 알고 있으므로, Car의 구성에서 Engine과 Break의 객체를 사용할 수 있다.

class Date {
    private int year, month, date;

    public Date(int year, int month, int date) {
        this.year = year;
        this.month = month;
        this.date = date;
    }
    
    public String toString() {
        return "Date [year=" + year + ",month=" + month + ",date=" + date + "]";
    }
    
}

    class Employee {
        private String name;
        private Date birthDate;

        public Employee(String name, Date birthDate) {
            this.name = name;
            this.birthDate = birthDate;
        }
        
        public String toString() {
            return "Employee [name=" + name + ",birthDate=" + birthDate + "]";
        }
        
    }
public class EmployeeTest {
    public static void main(String[] args) {
        Date birth = new Date(1990, 1, 1);
        Employee employee = new Employee("홍길동", birth);
        System.out.println(employee);
    }
}

Date 클래스 - Employee 클래스 이렇게 있음.
Employee 클래스의 필드 birthDate는 Date 클래스의 참조변수임(private Date birthDate;)
따라서 Employee 클래스는 Date 클래스를 가지고 있다고 할 수 있음.

상속이랑 다른 점: 상속은 아예 클래스를 통째로 가져온 다음에 추가하고, 부모 클래스가 자식 클래스에 통째로 들어감. 구성은 Employee 클래스가 Date 클래스를 필요로 해서 자신의 일부로 가져오는 것.

한 클래스가 다른 클래스에 통째로 들어가는 건 똑같은데, 그 관계랑 영향 받는 정도가 다름

0개의 댓글

관련 채용 정보