안녕하세요, 여러분!
오늘은 객체 지향 언어를 배워보신 분이라면
한 번 쯤은 머리 싸매고 이해하려고 해봤을 <SOLID 원칙>
지금부터 가볍고 쉽게 살펴보겠습니다!
SOLID 원칙은 코드의 유지보수성과 확장성을 높이기 위해
고안된 다섯 가지 설계 원칙이에요.
객체 지향 프로그래밍에서 코드의 품질을
높이기 위해 꼭 알아두어야 하는 개념이죠.
SOLID 원칙을 잘 지키면 코드 재사용성도 높아지고,
새로운 기능 추가도 훨씬 수월해진다는 장점이 있습니다.
먼저, 단일책임 원칙입니다.
각 클래스가 하나의 역할에만 집중할 수 있도록 설계하는 것이 좋다는 건데요.
예를 들어, 그림 속 클래스 A, B, C, D처럼
다른 역할을 하는 클래스는 각각을 분리하는 게 좋습니다.
이렇게 하면 특정 기능이 변경되더라도
다른 기능에 영향을 주지 않아서 유지보수가 훨씬 쉬워져요.
다음은 개방-폐쇄 원칙입니다.
이 원칙은 새로운 기능을 추가할 때
기존 코드를 수정하지 않고도 확장할 수 있도록 설계하라는 뜻이에요.
예를 들어, 쇼핑몰의 사장이 되었다고 가정해볼게요.
처음에는 쇼핑몰의 결제 수단을 신용카드와 무통장입금으로 운영하다가,
어느 날 카카오페이를 추가하고 싶어진 거죠.
이때, 결제 수단을 새로 추가하는 과정에서
기존 코드에 손을 대지 않아도 되도록 설계하는 것이 바로 이 원칙입니다.
기존 코드를 그대로 두고 결제 수단을 추가(확장)할 수 있으면, 오류 발생 가능성이 줄어들테니까요!
다음 원칙은 상속 관계에서 자식 클래스가 부모 클래스를 완벽히 대체할 수 있어야 한다는 원칙이에요.
예를 들어, 새(Bird)라는 부모 클래스가 있는데,
모든 새가 날 수 있는 것은 아니죠?
펭귄처럼 날지 못하는 새는 Bird 클래스를 상속받기보다는
별도의 클래스로 만드는 게 좋아요.
이 원칙으로 상속 관계를 가지는 여러 클래스를 잘 유지할 수 있죠.
인터페이스 분리 원칙은 클라이언트가 자신이 사용하지 않는 메서드에 의존하지 않도록,
작고 구체적인 인터페이스를 여러 개 만들어야 한다는 뜻이에요.
예를 들어, 복사, 스캔, 공유 기능이 모두 포함된 프린터가 있고,
복사 기능만 있는 프린터도 있다고 해봅시다.
이때 프린터 인터페이스를 만들고자 하면,
복사 / 스캔 / 공유 기능을 모두 포함하는 것보다는
복사 기능만 있는 인터페이스가 더 유리하겠죠.
이렇게 하면 불필요한 기능에 의존하지 않고 필요한 기능만 사용할 수 있어요.
의존성 역전 원칙은 상위 모듈이 특정 하위 모듈에 의존하지 않도록
추상화된 인터페이스에 의존하라는 원칙이에요.
예를 들어, 서로 다른 전등에 각각의 스위치가 존재한다고 생각해볼게요.
그러면 A전등을 켤 수 있는 A스위치로는 B전등를 켤 수 없겠죠?
그런데 만약 모든 전등을 하나의 스위치로 켤 수 있다면요?
이처럼 각 전등이 스위치 종류에 의존하지 않도록 하는 게 의존성 역전 원칙입니다.
이렇게 하면 상위 모듈과 하위 모듈이 독립적이어서 유지보수와 확장이 쉬워져요!