2024. 3. 27. 11:50ㆍ기타 개발
유튜브 [오늘코딩]님의 '예제로 살펴보는 솔리드 원칙' 영상을 보고 작성한 글입니다.
SOLID 원칙을 접하긴 했지만 제대로 이해되지 않아 지킬생각을 하지 않고 개발해왔는데 이제부턴 코드를 설계할 때 SOLID 원칙을 지키는 설계를 해볼 것입니다.
0. SOLID 원칙이란?
1. 단일 책임 원칙
2. 개방 폐쇄 원칙
3. 리스코프 치환 원칙
4. 인터페이스 분리 원칙
5. 의존성 역전 원칙
0. SOLID 원칙이란?
: 객체 지향 프로그래밍을 하면서 지켜야하는 원칙으로 시간이 지나도 변경이 용이하고, 유지보수와 확장이 쉽도록 개발하기 위함
- 단일 책임 원칙 (Single Responsibility Principle)
- 개방 폐쇄 원칙 (Open/Closed Principle)
- 리스코프 치환 원칙 (Liskov's Substitution Principle)
- 인터페이스 분리 원칙 (Interface Segregation Principle)
- 의존성 역전 원칙 (Dependency Inversion Principle)
1. 단일 책임 원칙
: 하나의 클래스는 하나의 책임만 갖는다.
- 플레이어 캐릭터를 예로 들면, 플레이어 캐릭터는 (1)입력을 인식하는 기능, (2)이동 관련 기능, (3)각종 사운드 관련 기능 등등
- Player라는 클래스에 한번에 구현할 수도 있지만 그럴경우 특정 기능만 수정하려해도 전체 코드를 수정해야하고 오류 발생확률이 높아짐
Solution
: (1)입력을 인식하는 기능, (2)이동 관련 기능, (3)각종 사운드 관련 기능 등의 기능을 별도의 클래스로 나눠서 만들고 별도의 컴포넌트로 오브젝트에 부착한다.
- 확장성이 좋아진다. (부담없이 상속받아 확장하기 좋음)
- 재사용성이 좋아진다. (모듈식으로 여러 오브젝트에서 재사용 할수 있다.)
2. 개방 폐쇄 원칙
: 클래스가 확장에는 개방되어있고 수정에는 닫혀있어야한다. / 원본 코드를 수정하지 않고 새로운 동작을 추가할 수 있어야한다.
- 기존의 클래스에 기능을 추가할 때마다 클래스를 수정해야한다면 오류가 발생할 확률이 높아지고 확장성이 떨어진다.
Solution
: 기존 클래스를 수정하지 않고도 계속 기능을 추가할 수 있도록 코드를 설계한다.
- 개별 함수를 작성하는 것이 아니라 공용으로 쓸 수 있도록 설계
- 모든 도형에 사용할 수 있는 부모 abstract 클래스와 넓이를 구하는 abstract 함수 제작
- 각 도형클래스는 Shape을 상속받는다.
- 도형별로 필요한 변수를 만든다(사각형은 너비(폭)와 높이, 원은 지름 등)
- override 함수는 각 도형클래스에서 도형별로 넓이를 구하는 공식 작성
- 마지막으로 Calculator 클래스를 제작하고 Shape를 받아 넓이를 구하는 함수 작성
- 도형이 더 추가되더라도 기존 코드가 전혀 수정되지 않는다.
3. 리스코프 치환 원칙
: 파생클래스가 기본클래스를 대체할 수 있어야한다. (상속을 할때 지켜야하는 원칙)
- 하위클래스(파생클래스)가 상위클래스(기본클래스)를 온전히 구현하지 못하는 경우 오류가 발생할 수 있다. → 대체불가
- 예시: 자동차를 상속받아 다양한 자동차를 만든다(가능) / 자동차를 상속받아 비행기를 만든다(불가능)
Solution
: 추상클래스를 조금 더 간단하게, 분류해서 만들고 상속보다는 인터페이스를 생성해서 여러 인터페이스를 조합한다.
4. 인터페이스 분리 원칙
: 인터페이스를 사용할 때 한번에 크게 사용하지 말고 작은 단위로 나눠서 사용한다.
Solution
: 인터페이스 하나에 모든 기능을 넣지 말고 기능별로 최대한 나눈다.
- 어떤 인터페이스를 받고 받지 않느냐에 따라 오브젝트의 표현 방식이 달라진다.
- 코드간의 결합도가 낮아지고 수정이 용이하다.
5. 의존성 역전 원칙
: 고수준 모듈이 저수준 모듈에서 직접 가져오면 안된다?
Solution
: 특정 모듈만의 기능이 아니라 인터페이스를 사용해 어떤 모듈이든 사용할 수 있는 기능으로 설계한다.
- 1번 사진과 같이 코드를 작성하면 Switch 클래스는 Door만 열고 닫을 수 있다.
- Switch 클래스의 기능을 확장성있게 사용하기 위해선 스위치 기능을 인터페이스로 만들고 Door클래스에 상속한다.
- Door만 열고 닫을수 있음 → 스위치 인터페이스를 가진 모든 객체를 활성/비활성화 할 수 있음
- 결론적으로 특정 클래스에 직접적으로 의존하는게 아니라 인터페이스를 거쳐 사용하기 때문에 느슨한 결합이 이루어짐.
'기타 개발' 카테고리의 다른 글
Multi Display (0) | 2024.07.01 |
---|---|
UI 영역에 서명 받기 (0) | 2024.03.14 |
Web 개발 : Daily Meal (0) | 2022.05.05 |