지난번에 작성했던 [JAVA]추상클래스와 인터페이스 에 있는 예제를 보면서 객체지향의 설계 원칙을 알아보겠습니다.
객체지향의 설계원칙은 소프트웨어 개발에서 견고하고 유지보수가 쉬우며 확장 가능한 시스템을 구축하는 기반을 제공합니다. 이번 글에서는 인터페이스와 추상 클래스를 사용하여 SOLID 원칙을 어떻게 실현할 수 있는지 알아봅니다.

RemoteControl 인터페이스는 전자 기기를 제어하는 하나의 책임만을 가집니다. 이는 SRP 원칙을 잘 보여주는 예시입니다. 각 메소드(powerOn, powerOff, volumeUp, volumeDown)는 리모컨의 하나의 기능을 나타냅니다.
public interface RemoteControl {
void powerOn();
void powerOff();
void volumeUp();
void volumeDown();
}
Animal 추상 클래스는 eat 메소드를 통해 확장 가능한 구조를 제공합니다. Lion과 Elephant 클래스는 Animal을 상속받아 eat 메소드를 각자의 방식으로 구현함으로써 OCP 원칙을 따릅니다.
public abstract class Animal {
public abstract void eat();
public void sleep() {
System.out.println("This animal is sleeping.");
}
}
Television과 AirConditioner는 모두 RemoteControl 인터페이스를 구현합니다. 이는 RemoteControl 인터페이스 타입으로 Television 또는 AirConditioner 인스턴스를 사용할 수 있음을 의미하며, LSP 원칙을 만족시킵니다.
public class Television implements RemoteControl {
// 구현 코드...
}
public class AirConditioner implements RemoteControl {
// 구현 코드... }
RemoteControl 인터페이스는 사용하는 클라이언트에 필요한 메소드만을 정의하여 ISP 원칙을 따릅니다. 만약 특정 기기가 볼륨 조절 기능을 필요로 하지 않는다면, 해당 기능을 분리하여 별도의 인터페이스로 정의할 수 있습니다.
고수준 모듈(Television, AirConditioner)은 저수준 모듈(RemoteControl 인터페이스의 구현)에 직접 의존하지 않고, 모두 RemoteControl이라는 추상화에 의존함으로써 DIP 원칙을 준수합니다.
public class RemoteControlUser {
private RemoteControl remoteControl;
public RemoteControlUser(RemoteControl remoteControl){
this.remoteControl = remoteControl;
}
public void turnOn() {
remoteControl.powerOn();
}
}
이러한 방식으로 RemoteControl 인터페이스와 Animal 추상 클래스를 사용하면 SOLID 원칙을 준수하면서 유연하고 확장 가능한 코드를 작성할 수 있습니다
REF
[JAVA]추상클래스와 인터페이스
https://ko.wikipedia.org/wiki/SOLID_(%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%EC%84%A4%EA%B3%84)