- 상속 구조보다 위임을 활용한 개발을 제안하는 이유
1. 상속(Inheritance)이란?
부모 클래스의 특성(메서드와 속성)을 자식 클래스가 물려받는 기법이다. (클래스 사이의 관계)
자식 클래스는 부모 클래스의 멤버를 사용하거나 확장하여 새로운 기능을 추가할 수 있으며, 계층 구조를 형성하고 코드를 재사용할 수 있다. 다만, 상속 체인이 깊어지면 클래스 간의 관계가 복잡해지고 변경 사항이 전파될 가능성이 있다.
class Animal {
public void eat() {
System.out.println("밥먹기");
}
public void move() {
System.out.println("움직이기");
}
}
/* extends로 상속 */
class Dog extends Animal {}
// is a 관계. Animal 클래스의 속성들을 물려받음으로써 사용 가능
Dog dog = new Dog(); // Animal dog = new Dog();도 가능
dog.move();
dog.eat();
2. 위임(Delegation)이란?
객체가 다른 객체에게 특정 작업을 위임하는 기법이다. (인스턴스 사이의 관계)
객체 간의 협력을 강조하며, 한 객체가 자신의 기능을 다른 객체에게 전달하여 객체 간 결합도를 낮출 수 있으며, 코드 변경이 한 객체에 미치는 영향을 제어하기 쉽다. 다만, 위임을 구현하려면 중간 객체나 인터페이스 등으로 인해 코드에 더 많은 구조를 추가해야 할 수 있다.
public class MyController {
// has a 관계
MyRepository myRepository;
public void save() {
// myRepository에게 save 권한을 위임하여 처리
myRepository.save();
}
}
3. 위임을 활용한 개발을 제안하는 이유
1) 유연성과 확장성
위임은 더 유연한 구조를 제공하여 객체 간 결합도를 낮춘다. 이는 변경이나 확장에 대한 유연성을 높이고, 새로운 기능을 추가하거나 변경할 때 다른 클래스에 영향을 덜 주는 장점이 있으며, 이를 통해 코드의 변경이 특정 클래스에만 집중되므로 소프트웨어 유지보수가 더 쉬워진다.
2) 단일 책임 원칙(Single Responsibility Principle)
위임은 클래스가 한 가지 역할만 수행하도록 유도하며, 각 클래스는 명확하게 정의된 역할을 갖게 된다. 이는 코드의 가독성과 이해를 향상시키고, 클래스의 역할과 책임을 분명하게 구분하는 데 도움을 준다.
3) 코드 재사용과 모듈성
위임을 통해 코드를 재사용하면서도 클래스 간의 강한 결합을 피할 수 있다. 위임을 사용하면 필요한 기능을 제공하는 클래스를 쉽게 교체하거나 확장할 수 있고, 이는 모듈성을 높이고 더 작은 단위로 코드를 관리하면서 전체 시스템을 구축할 수 있다.
4) 코드 중복 방지
상속 구조에서는 부모 클래스의 변경이 모든 하위 클래스에 영향을 줄 수 있다. 반면에 위임을 사용하면 중복 코드를 줄이고, 변경이 필요한 경우 해당 클래스만 수정하면 된다.