SOLID원칙에 대해 알아보자.
SOLID원칙은 좋은 객체 지향 설계를 위한 5가지 원칙이라고 흔히 말한다.
그럼 좋은 객체 지향 설계는 왜 필요할까?
OOP(Object-Oriented Programming, 객체지향 프로그래밍)를 공부하려고 구글링을 하면,
OOP의 요소(캡슐화, 추상화, 상속, 다형성), SOLID 5원칙 등에 대한 얘기가 많이 나온다.
그러나 정확하게 OOP가 무엇인지는 설명하는 자료는 없었다.
(물론 설명이 없는건 아니지만, 그래서 왜 OOP를 해야하지 라는 느낌은 오지 않았다.)
SOLID 원칙을 정리하려고 찾아보던 중
무엇이 OOP인지 대략적인 느낌을 알려준(?) 블로그가 하나 있었다. *출처링크
OOP
는 프로그램을 어떻게 설계
해야 하는지에 대한 개념
이자 방법론
이다.
프로그램을 단순히 데이터와 처리 방법으로 나누는 것이 아니라,
프로그램을 수많은 '객체'
라는 기본 단위로 나누고, 객체 간 상호작용
으로 서술한다.
객체는 단순히 데이터의 묶음
으로 착각 하기 쉬운데,
그보다는 하나의 '역할'
을 하는 메소드
와 데이터의 묶음
으로 봐야한다.
프로그래밍 방식은 절차적 -> 구조적 -> 객체지향 방식으로 발전해왔다.
절차적 프로그래밍
은 Input에서 Output의 흐름 관점에서 프로그래밍하는 것이다.
구조적 프로그래밍
은 프로그램을 함수 단위로 나누고,
그 함수 간 호출을 하면서 구동되도록 프로그래밍하는 방법이다.
Top-Down 방식
이라고도 한다.객체지향 프로그맹
은 먼저 작은 문제들을 해결할 수 있는 객체들을 만든 뒤,
이 객체들을 조합해서 큰 문제를 해결하는 방식이다.
Bottom-up 방식
이라고도 한다.
'객체'
를'지향'
하는'프로그래밍'
방식을 적용하면,
코드의 재사용, 유지보수의 용이성 등의 장점으로 인해개발 기간, 비용이 대폭 줄어들 수 있다.
(개발 기간과 비용!!, 이게 핵심인 것 같다.)
시작이 길어졌다.
SOLID 원칙은 Robert C. Martin이 고안한 방법이다.
(martin이 Uncle Bob으로 유명하다던데...왜일까?ㅎㅎ)
항상 코드
는 유연
하고, 확장
할 수 있고, 유지보수
가 용이하고, 재사용
할 수 있어야한다.
(why? 안 그럼 반복되는 코드도 계속 따로 따로 써야되고...
코드 하나 고칠려면 수천, 수만줄의 코드를 전부 봐야될 수도 있고...
그럼 개발이 어려워지고... 그럼 개발 기간이 길어지고... 시간과 돈이 든다!)
이러한 코드를 구현하고 적용하기 위해 OOP
라는 방법론(패러다임)
이 제안되었고,
OOP 방식을 잘 준수하기 위한 원칙으로 SOLID원칙
이 제안되었다.
따라서 SOLID 원칙이 무엇인지 이해하고 코드를 작성하는 것이 중요하다고 생각한다.
(물론 잘 안되겠지?ㅎㅎㅎ)
얼마전 과제를 수행할 때, 입력된 값이 모두 숫자, 갯수는 5~10개 등 몇가지 검증이 필요했는데,
처음 코드를 짤때는 하나의 함수에서 모든걸 검증하는 방식으로 만들었다.
근데 만약 그 함수에서 에러가 나면 숫자를 검증하는 부분이 잘못된건지,
아니면 입력된 숫자의 갯수를 검증하는 부분이 잘못된건지 하나하나 다 봐야했다...
동물 class에서 사람 class, 치타 class를 만든다고 하자.
사람은 직립보행을 하고, 치타는 4족보행을 한다.
따라서 동물 class에 '움직임'의 '기능'만 담긴 method만 만들고,
'움직임'에 대한 '방식'은 하위 class인 사람, 치타 class에서 수정하면 된다.
사람과 치타의 '움직임'을 표현하기 위해 동물 class를 수정할 필요는 없다
도형 class가 있다고 가정하자.
➲ "<도형>은 둘레를 가지고, 넓이를 가지고, 각을 가진다."
<도형>의 단어를 교체해 보자. (도형의 class로 사각형 class를 만들었다.)
➲ <사각형>은 둘레를 가지고, 넓이를 가지고, 각을 가진다."
다시한번 <도형>의 단어를 교체해 보자. (도형의 class로 원 class를 만들었다.)
➲"<원>은 둘레를 가지고, 넓이를 가지고, 각을 가진다."
여기서 "각을 가진다" 라는 부분은 어색하다.
따라서 도형 class는 LSP 원칙을 만족하지 않은 설계이다.
ISP와 SRP는 비슷하게 느껴질 수 있다. 아래의 예시를 보자. #출처링크
➲ '게시판' 인터페이스는 '게시판'관련 기능을 수행하고 있어 SRP만족한다.
➲ 일반 사용자 클라이언트(=class)는 인터페이스의 '삭제'를 사용하지 못하므로,
ISP는 만족하지 못한다.
부모 classs는 자식 class에 의존해서는 안된다는 원칙이라는데,
당연한 얘기를 하고 있는 것 같아 사례를 찾아보았다.. 출처링크
(검색해보면 아이와 장난감, 자동차와 타이어 얘기가 많이 보인다.)
➲ 자동차는 스노우타이어, 일반타이어, 광폭타이어와 같은 디테일한 개념보다,
타이어라는 추상화된 개념에 의존하도록 설계되어야 한다.*
SOLID Principle in Programming: Understand With Real Life Examples
객체지향 디자인의 5원칙(SOLID 원칙)
잘 보고 갑니다!