티스토리 뷰
자격증(정보처리기사)공부를 하거나, 학부때 그냥 외우기만📚 했었던,
OOP(객체지향프로그래밍)을 위한 5가지 설계원칙에 대해 알아보고자 합니다!
"A = B 다" 같은 느낌 보다는,
왜 A가 B가 되는건지에 대한 이해를 목표로 잡았어요⚾️
일단 쭉 읽어보고 넘어갑시다 🏇🏼
단일 책임 원칙 (SRP: Single-Responsibility Principle)
소프트웨어 요소(클래스, 모듈, 함수 등)는 되도록 응집도(?)있는 단 하나의 책임(?)을 가져야 합니다.
클래스의 변경이 일어나는 경우는 오직 응집도(?)때문이어야 합니다.개방-폐쇄 원칙 (OCP: Open-Close Principle)
소프트웨어 요소는 확장이 가능하도록 열려있고(?), 변경은 되지않도록 닫혀있어(?)야 합니다.
새 기능을 추가해야하는 경우, 기존 클래스를 변경하지말고 새 클래스나 함수를 만들어야 합니다.리스코프 치환 원칙 (LSP: Liskov Substitution Principle)
서브타입은 (상속받은)기본 타입으로 대체(?)가 가능해야 합니다.
자식 클래스는 부모 클래스의 동작(의미)를 바꾸면 안됩니다.의존 역전 원칙 (DIP: Dependency-Inversion Principle)
상위레벨 모듈은 하위레벨 모듈에 의존(?)하면 안되고, 둘 다 추상화된 인터페이스에 의존(?)해야 합니다.
추상화는 구체화에 의존(?)하면 안되고, 구체화는 추상화에 의존(?)하면 안됩니다.인터페이스 분리 원칙 (ISP: Interface-Segregation Principle)
클라이언트 객체는 사용하지 않는 메소드에 의존(?)하면 안됩니다.
특징적인 낱말에 하이라이트🖌를 칠했어요
하이라이트부분을 신경써서 한번 읽어보고 다음으로 넘어갑시다🏊🏻♂️
가치와 원칙
위키피디아에 "SOLID원칙"을 검색해보니,
"컴퓨터 프로그래밍에서 SOLID란 로버트 마틴이 2000년대 초반에 명명한 객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원칙을 마이클 페더스가 두문자어 기억술로 소개한 것"
이라고 나옵니다.
그리고, 구현패턴이라는 책에서 켄트 벡은,
"프로그래밍에서 가치는 원칙보다 높은 수준의 개념이며, 원칙을 가치를 지키기 위해서 존재해야 한다."
라는 말을 합니다.
그럼 SOLID원칙을 공부하기 전에 가치를 먼저 알아야겠죠?😲
소프트웨어에서 가치는 무엇을 뜻하는 것일까요?
위의 책에서는, 가치를 아래와 같이 3가지 우선순위로 정의합니다.
👀가독성, 💬커뮤니케이션
개발자는 코드를 통한 커뮤니케이션이 되어야 한다.
읽고 이해할 수 없는 코드일수록 가치가 없는 것이다.✨단순성
코드가 단순할 수록 커뮤니케이션에 도움이 된다. (가독성)
코드가 단순할 수록 버그가 생길 틈이 없어진다.
미래의 확장을 위한 복잡한 패턴은 오히려 경계의 대상이 된다.🌈유연성
유연할 수록, 기존코드의 수정시간이 더 짧아진다.
유연성과 단순성은 trade off
여기서, 유연성과 단순성에 대해 조금 더 깊이 들어가 볼까요?
유연성과 단순성
둘의 관계가 trade off라는 것으로 볼 때,
유연성은 언제 챙겨야, 언제부터 고민해야 할까요?
이에 켄트 벡은,
처음에는 단순⚡️하게 코드를 작성하고,
기획 또는 정책의 변경이 발생🚨할 때 유연성에 대해 고려해보는 것이 좋다고 합니다.
고려할 때는,
이 기획 또는 정책의 변경의 원인🧐은 무엇인지
그리고 이러한 변경은 계속 발생 가능한 것🤔인지
충분히 고민해본 후, 리팩토링을 통해 확장성을 고려하며 변경🃏해야 합니다
프로그래밍에서의 비용
⏰ == 💰
위의 원칙들과 가치들로 미루어 볼 때,
시간을 절약하는 코드가 높은 가치를 가진다고 볼 수 있어요!
No silver bullet🚫
모든 문제를 해결하는 절대적인 최고의 선택(답)은 존재하지 않습니다.
엔지니어는 현재의 상황에서 우선순위를 계산하고,
그에 맞는 최선의 선택만을 할 뿐이에요.
그래서, 최선의 선택을 위해서 우리는 기준을 세워야 하는거고
그래서!! SOLID원칙이 중요하다는 겁니다!!!와우! 고작 이 한마디를 하기위해 이 긴 글을 썼군요😡
이렇게, SOLID원칙에 대한 이해를 위해 가치와 원칙에 대해 정리해봤어요!
앞서 말했듯, 맨 위에 적었던 5개의 원칙을 저렇게 달달 암기하기 보다는,
왜 이런 5가지 원칙을 지켜야 하는지에 대해 이해하게되면
자연스럽게, 무의식적으로 프로그래밍 습관이 길들여지지 않을까요?😁
다음 글에서는 객체지향프로그래밍(OOP)에 대해 소개해보겠습니다!
이해가 안되는 부분이나, 틀린 부분이 있으면 코멘트를 남겨주세요!
피드백은 정말정말 환영입니다🎉🎉
Reference
Wikipedia
캔트 벡의 구현패턴
붱이의 멋진강의👍🏻
'Design Pattern' 카테고리의 다른 글
Delegation Pattern (0) | 2021.05.24 |
---|---|
[SOLID] 객체 지향 프로그래밍(OOP) (2) | 2021.03.26 |
MVVM (0) | 2021.01.07 |
MVC (0) | 2021.01.07 |