바야흐로 올해 상반기 보았던 모 대기업 면접에서 질문으로 나왔던 내용이다.
"상속과 합성에 대해 설명해주세요."
당시 나는 합성이라는 개념을 처음 들어봤었기 때문에 당연히 대답하지 못했었다 😂
아무튼 덕분에 새로운 개념을 공부하게 되었다 !!
public class Car {
public void go() {
System.out.println("go!");
}
}
public class SportCar extends Car {
public void boost() {
System.out.println("boost on!");
}
}
public class Main {
public static void main(String[] args) {
SportCar sportCar = new SportCar();
sportCar.go();
sportCar.boost();
// 실행 결과
// go!
// boost on!
}
}
public class Car {
private Engine engine;
public Car(Engine engine) {
this.engine = engine;
}
public void go() {
engine.startEngine();
System.out.println("go!");
}
}
public class Engine {
private String engineType;
public Engine(String engineType) {
this.engineType = engineType;
}
public void startEngine() {
System.out.println("start engine!");
}
}
public class Main {
public static void main(String[] args) {
Car car = new Car(new Engine("gasolineEngine"));
car.go();
// 실행 결과
// start engine!
// go!
}
}
public class Car {
private Engine engine;
public Car(Engine engine) {
this.engine = engine;
}
public void go() {
engine.startEngine();
System.out.println("go!");
}
}
public class SportCar extends Car {
public SportCar(Engine engine) {
super(engine);
}
public void boost() {
System.out.println("boost on!");
}
}
public class Engine {
private String engineType;
public Engine(String engineType) {
this.engineType = engineType;
}
public void startEngine() {
System.out.println("start engine!");
}
}
public class Main {
public static void main(String[] args) {
Car car = new Car(new Engine("gasolineEngine"));
car.go();
SportCar sportCar = new SportCar(new Engine("gasolineEngine"));
sportCar.go();
sportCar.boost();
// 실행 결과
// start engine!
// go!
// start engine!
// go!
// boost on!
}
}
위 코드를 보면, Car 클래스를 상속받은 SportCar 클래스는 Car 클래스의 go 메서드를 활용하며, 자신만의 boost 메서드를 추가하여 기능을 확장한다. 이는 SportCar 가 기본적인 Car 의 기능을 유지하면서도 SportCar 에 특화된 기능을 갖춘하는 것을 의미.
Car 클래스는 Engine 클래스와 합성되어 go 메서드가 실행되며 Engine 클래스의startEngine 메서드를 호출한다. 이를 통해 Car 클래스는 Engine 클래스의 기능을 유연하게 활용하며 재사용한다.
상속의 주요 목적 : 다형성
그러나 단순히 코드 재사용을 위해 상속을 사용하는 것은 권장되지 않음. 이 경우 합성이 더 적합.
그렇다면 코드 재사용을 위한 상속이란 ?
인터페이스 상속과 합성을 함께 사용하면, 상속의 본래 목적인 다형성을 활용하고 느슨한 결합을 달성할 수 있음.
결론 : 재사용을 위한 상속보다는 합성을 사용하라.