242. 객체지향 설계 원칙 (SOLID) - 로버트 C. 마틴 유지보수성 확장성 클린 코드 소프트웨어 아키텍처 객체지향 프로그래밍

핵심 인사이트: (개발자들의 영원한 십계명) 1990년대, 객체지향(C++, Java) 언어가 세상을 지배했다. 근데 멍청한 개발자들이 자바를 가지고 옛날 C언어 찰흙 빚듯이 수만 줄짜리 스파게티 덩어리 클래스를 만들어냈다. 사장님이 "야 기능 하나 추가해 줘"라고 하면 코드 전체가 에러를 뿜으며 피를 토했다. 로버트 C. 마틴(Uncle Bob)이 빡쳐서 칠판을 때리며 외쳤다. "야 ㅆㅂ!! 객체지향 언어를 쓴다고 네 코드가 훌륭해지는 게 아니야!! 진정한 레고 블록(객체지향)의 유연성을 얻고 싶다면, 내가 지금부터 말하는 '5가지 절대 헌법(SOLID)'을 책상 앞에 붙여놓고 목숨 걸고 지켜라!! 하나의 클래스는 하나의 일만 하고(S), 확장은 자유롭되 기존 코드는 뜯어고치지 말고(O), 자식은 부모를 완벽히 대체하고(L), 필요 없는 기능은 강요하지 말고(I), 화살표(의존성)는 무조건 추상적인 것(인터페이스)을 향해 꽂아라(D)!! 이 5개만 지키면 네 코드는 우주 끝까지 에러 없이 무한 확장하는 클린 코드가 된다!!" 객체지향 소프트웨어 공학의 모든 철학을 응축한 절대 성전, SOLID다.

Ⅰ. 도구(Java)가 구조(설계)를 보장하지 않는다

  • 객체지향의 3대 특징(캡슐화, 상속, 다형성)은 그저 도구일 뿐입니다.
  • 이 도구를 칼처럼 휘둘러 강도질(스파게티 코드)을 할지, 메스처럼 휘둘러 수술(클린 아키텍처)을 할지 결정하는 것은 결국 개발자의 **'설계 철학(Principle)'**입니다.
  • 코드가 썩지 않게(유지보수성), 기능 추가가 쉽도록(확장성), 그리고 남이 봐도 이해하기 쉽게(가독성) 만들기 위해 전 세계 천재들이 5가지 룰을 집대성했습니다.

Ⅱ. SOLID 원칙의 개념과 5대 영웅 🌟 정보처리기사 고정 출제 🌟

로버트 C. 마틴(Robert C. Martin)이 정리한 5가지 원칙의 앞글자를 딴 마법의 단어입니다. (각 원칙의 딥한 해부는 243~247번 문서에서 1개씩 썰어 먹습니다.)

1. S (SRP, Single Responsibility Principle - 단일 책임 원칙)

  • "클래스를 뜯어고쳐야 할 이유는 **오직 단 하나(One Reason)**여야만 한다."
  • 만능 맥가이버 클래스는 사형입니다. 요리사 클래스는 요리만 하고, 서빙 클래스는 서빙만 하게 역할을 완벽히 1개씩으로 칼같이 찢어놔야 스파게티를 막을 수 있습니다.

2. O (OCP, Open-Closed Principle - 개방-폐쇄 원칙) 🌟 객체지향의 심장 🌟

  • "소프트웨어는 확장(기능 추가)에는 활짝 열려(Open) 있어야 하고, 변경(기존 코드 수정)에는 굳게 닫혀(Closed) 있어야 한다."
  • 새로운 결제 방식을 추가하고 싶을 때, 기존의 결제 코드를 단 1줄도 뜯어고치지(버그 유발 방지) 않고도 새로운 기능을 레고 블록 끼우듯 무한대로 확장할 수 있어야 한다는 궁극의 룰입니다. (다형성의 존재 이유)

3. L (LSP, Liskov Substitution Principle - 리스코프 치환 원칙)

  • "서브 타입(자식)은 언제나 자신의 기반 타입(부모)으로 100% 교체(Substitution)할 수 있어야 한다."
  • 아버지가 하던 역할을 아들이 이어받았으면, 아버지가 하던 행동 계약(룰)을 아들이 배신하고 뒤집어엎으면 안 됩니다. (상속의 올바른 사용법)

4. I (ISP, Interface Segregation Principle - 인터페이스 분리 원칙)

  • "클라이언트(사용자)는 자신이 사용하지 않는 메서드(기능)에 억지로 의존하도록 강요받으면 안 된다."
  • 만능 리모컨 하나 띡 주면서 안 쓰는 버튼까지 다 외우게 강요하지 말고, 'TV 리모컨', '에어컨 리모컨'으로 인터페이스(구멍)를 작고 날씬하게 쪼개서(분리) 제공하라는 룰입니다.

5. D (DIP, Dependency Inversion Principle - 의존 역전 원칙) 🌟 아키텍처의 왕 🌟

  • "고수준 모듈은 저수준 모듈에 의존해서는 안 되며, 둘 다 추상화(인터페이스)에 의존해야 한다."
  • 217번 클린 아키텍처와 216번 헥사고날의 뼈대를 이루는 마법입니다. 자동차(고수준)가 미쉐린 타이어(저수준 구체물)에 화살표를 꽂아 찰싹 달라붙으면, 타이어가 바뀔 때 자동차도 부서집니다. 대신 '동그란 바퀴 규격(추상화)'에 화살표를 꽂아 두어 타이어를 무한 교체할 수 있게 뒤집어버리는(역전) 기적의 원칙입니다.

Ⅲ. SOLID가 세상을 바꾼 이유 (디자인 패턴의 뼈대)

  • 다음다음 장(251번)부터 끝도 없이 배울 위대한 **'GoF의 23가지 디자인 패턴'**들은 우연히 뚝딱 나온 게 아닙니다.
  • **"어떻게 하면 저 더럽게 어려운 SOLID 5원칙을 지키면서 자바 코드를 짤 수 있을까?"**를 수십 년간 고민하던 천재들이 만들어낸 '실전 코딩 모범 답안지'가 바로 디자인 패턴입니다. 즉, SOLID는 무공의 근본 '내공'이고, 디자인 패턴은 그 내공을 쓰는 '초식(기술)'입니다.

📢 섹션 요약 비유: SOLID 설계 원칙은 무너지지 않는 성벽을 쌓기 위한 전설적인 석공들의 **'절대 5계명(건축법)'**입니다. 옛날 바보들은 그냥 진흙에 볏짚(절차지향 코드)을 섞어 무식하게 벽을 쌓았습니다. 폭우가 오면 몽땅 녹아내려 집이 무너졌습니다(유지보수 실패). 깨달음을 얻은 마스터 석공(로버트 마틴)이 돌벽돌(객체지향 클래스)을 가져와 5계명을 반포합니다. "1. S(단일 책임): 한 벽돌은 하나의 역할만 지탱하게 깎아라! 2. O(개방-폐쇄): 성벽을 넓힐(확장 Open) 때, 이미 쌓아둔 멀쩡한 벽돌을 빼서 뜯어고치지(수정 Closed 금지) 말고 그냥 새 벽돌을 이어 붙이게 설계해라! 3. L(리스코프 치환): 낡은 벽돌(부모)을 빼고 새 벽돌(자식)을 갈아 끼워도 성벽이 무너지지 않게 똑같은 강도의 규격을 지켜라! 4. I(인터페이스 분리): 쓸데없이 무겁고 거대한 만능 돌덩이를 찍어내어 인부들을 고생시키지 말고, 용도에 맞게 작게 쪼개라! 5. D(의존 역전): 벽돌을 진흙(구체적 하위 모듈)으로 붙이지 말고, 언제든 뺐다 낄 수 있는 표준화된 철제 레일 규격(추상화 인터페이스)에 맞춰서 끼워 넣어라!" 이 5가지 헌법을 지켜서 쌓은 성벽(소프트웨어 시스템)은 대포를 맞든 성벽을 10배로 늘리든 평생 무너지지 않는(유연성과 확장성) 영원불멸의 클린 아키텍처로 우뚝 서게 됩니다.