객체 지향 설계에는 5가지 중요한 원칙이 있습니다. 이를 SOLID 원칙이라고도 부릅니다.
단일 책임 원칙은 하나의 클래스는 하나의 책임만 가져야한다는 원칙입니다. 책임의 범위와 정의는 경우에 따라 다르지만, 일반적으로 변경이 있을 때 파급 효과가 적은 경우에는 단일 책임 원칙을 잘 따르고 있다고 볼 수 있습니다.
개방-폐쇄 원칙은 "소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다"는 원칙입니다. 이는 다형성을 활용해서 구현될 수 있습니다. 즉, 인터페이스를 구현한 새로운 클래스를 만들어서 새로운 기능을 추가하면 확장이 가능하지만 기존 코드의 변경은 없습니다.
public class MemberService {
private MemberRepository memberRepository = new MemoryMemberRepository();
}
public class MemberService {
private MemberRepository memberRepository = new MemoryMemberRepository();
private MemberRepository memberRepository = new JdbcRepository();
}
하지만 이 원칙에도 문제점이 존재합니다. 구현 객체를 변경하려면 클라이언트의 코드를 변경해야 하는데, 이는 원칙을 위배하는 것입니다. 따라서 객체를 생성하고 연관 관계를 맺어주는 별도의 조립, 설정자가 필요합니다.
리스코프 치환 원칙은 "하위 타입은 언제나 상위 타입으로 교체될 수 있어야 한다"는 원칙입니다. 즉, 어떤 클래스가 다른 클래스로부터 파생되었다면, 그 서브 클래스는 부모 클래스로도 간주될 수 있어야 합니다. 이 원칙을 지키지 않으면 예상치 못한 부작용이 발생할 수 있습니다.
분리하면, 인터페이스가 명확해지고 다른 인터페이스로 대체하기가 쉬워집니다. 예를 들어, 운전 인터페이스와 정비 인터페이스로 분리되어 있다면 각각에 맞는 운전자 클라이언트와 정비사 클라이언트로 분리될 수 있습니다. 이 원칙은 적절한 크기로 인터페이스를 쪼개는 것의 중요성을 강조합니다.
의존관계 역전 원칙은 "추상화에 의존해야지, 구체화에 의존하면 안된다"는 원칙입니다. 즉, 클라이언트 코드는 구현 클래스를 바라보는 대신 인터페이스를 바라봐야 합니다. 이 원칙은 "역할에 의존해야 한다"는 것과 같습니다. 특정 구현체가 누가 하든 간에 언제든지 쉽게 교체할 수 있는 시스템을 구축하는 것이 중요합니다.