258. 구조 패턴 (Structural Patterns) - 클래스 객체 조합 거대 구조 조립 인터페이스 설계 GoF 디자인 패턴
핵심 인사이트: (GoF 3대 분류 중 두 번째) 252번에서 객체를 잘 찍어내는 방법(생성 패턴)을 5가지나 배웠다. 빵(객체)을 1만 개 기가 막히게 찍어냈다 치자. "야! 빵 1만 개만 바구니에 담아놓으면 뭐해! 그 빵을 가지고 '거대한 5단 햄버거 성(거대 시스템 구조)'을 조립해 내야 할 거 아니야!! 내가 만들어둔 작은 클래스 조각조각들을, 서로 어떻게 딱지치기하듯 결합하고 엮어서 '더 거대하고 튼튼한 복합 구조물(Architecture 뼈대)'로 조립해 낼 것인가?! 인터페이스가 안 맞는 놈들끼리 억지로 어떻게 찰칵 끼워 맞추고(어댑터), 본체는 그대로 두고 겉껍질에만 계속 새로운 무기를 덕지덕지 붙이면서(데코레이터) 덩치를 100배로 불려 나갈 것인가?! 레고 블록 1개를 넘어서 거대한 성벽을 설계하는 합체 로봇의 진수, 구조 패턴(Structural Patterns)이다!"
Ⅰ. 단일 클래스(레고 블록 1개)의 한계
- 1만 줄짜리 뚱뚱한 클래스 1개(God Class)를 짜면 시스템이 망한다는 것은 243번(SRP)에서 뼈저리게 배웠습니다.
- 그래서 우리는 시스템을 작고 귀여운 100개의 미니 클래스(레고 블록)들로 다 찢어놨습니다.
- 새로운 문제의 봉착: 이 작게 찢어놓은 100개의 조각들을 다시 묶어서 "주문 결제 처리"라는 거대한 실무 기능을 수행하게끔 '거미줄(관계)'로 잘 엮어내야 하는데, 어떻게 엮어야 버그가 안 나고 확장이 잘 될까요?
Ⅱ. 구조 패턴 (Structural Patterns)의 개념 🌟
- 개념: GoF의 23가지 패턴 중 두 번째 대분류입니다. 작게 쪼개진 클래스나 객체들을 조합하고 융합하여, 더 거대하고 강력한 기능(복합 객체)을 가진 구조물로 유연하게 조립하는 방법(레고 조립 설명서)을 제공하는 7가지 패턴의 묶음입니다.
- 주요 무기: 이 놈들은 244번의 **다형성(인터페이스)**과 합성/위임(Composition/Delegation, 껍데기 안에 객체 품기) 기술을 밥 먹듯이 사용하여 뼈대를 미치도록 유연하게 늘려 나갑니다.
Ⅲ. 구조 패턴의 7형제 (간략 스포일러) 🌟 무조건 암기 🌟
정보처리기사 시험에서 "다음 중 구조 패턴이 아닌 것은?"으로 객관식 1번 문제로 나옵니다. "어데프 퍼컴브플" 처럼 앞글자를 따서라도 달달 외워야 합니다. (각 패턴의 디테일은 259~265번에서 폭격합니다.)
- 어댑터 (Adapter): "야! 삼성 돼지코랑 미국 콘센트 구멍 모양이 안 맞아! 중간에 변환기(돼지코) 꽂아서 호환되게 억지로 엮어버려!"
- 브리지 (Bridge): "기능이랑 껍데기를 하나로 합치면 커질 때 100개로 쪼개져! 뼈대와 속살을 다리로 이어서(분리) 각자 자유롭게 뚱뚱해지게 놔둬!"
- 컴포지트 (Composite): "폴더 안에 폴더, 그 안에 파일... 그릇이랑 내용물을 똑같은 놈(단일 인터페이스)으로 취급해서 폴더 트리를 무한대로 박아버려!"
- 데코레이터 (Decorator): "무기 하나 추가할 때마다 클래스 새로 짜? 미쳤어? 그냥 기본 로봇 껍데기 위에 포장지 씌우듯 동적으로 기능을 덕지덕지 덧씌워서 덩치를 불려!"
- 퍼사드 (Facade): "클래스 10개가 거미줄처럼 얽혀서 너무 복잡해! 사용자 눈앞에 거대한 정문(단순한 입구) 1개만 딱 세워놓고, 뒤에 복잡한 건 지가 알아서 통제하게 가려버려!"
- 프록시 (Proxy): "DB 접근권한이나 속도 때문에 아무나 못 들여보내! **가짜 대리인(비서)**을 앞에 세워놓고 비서가 대신 통제하고 심부름하게 시켜!"
- 플라이웨이트 (Flyweight): "똑같이 생긴 총알 10만 개 쏘는데 메모리가 모자라! 껍데기 1개만 만들어놓고 참조값만 돌려쓰며 메모리 극한 다이어트 해!"
Ⅳ. 공통된 철학: 상속(Inheritance)보다 합성(Composition) 🌟
- 구조 패턴 7개가 목숨 걸고 외치는 객체지향 최고의 명언입니다.
- 기능 덩치를 불리려고
extends(상속)를 떡칠하면 부모가 바뀔 때 자식이 다 터집니다(강한 결합). 구조 패턴들은 상속을 버리고, 내 뱃속에 다른 객체를 변수로 몰래 품어서 대신 일하게 시키는 **'합성(Composition)'**을 통해 시스템의 관절을 고무줄처럼 유연하게 조립합니다.
📢 섹션 요약 비유: **구조 패턴(Structural Patterns)**은 레고 조각들을 모아 **'거대한 트랜스포머 합체 로봇을 조립하는 7가지 비법서'**입니다. 252번의 생성 패턴이 예쁘고 튼튼한 레고 블록 1개(팔, 다리)를 공장에서 어떻게 잘 찍어낼지 고민하는 기술이었다면, 구조 패턴은 찍어져 나온 그 수백 개의 팔, 다리, 머리 블록들을 어떻게 맞물려 끼워야 거대한 합체 로봇(아키텍처)이 튼튼하게 서 있을 수 있는지 가르쳐줍니다. 만약 팔 블록과 몸통 블록의 튀어나온 돌기 모양이 달라 끼워지지 않으면 중간에 특수 연결 블록(1. 어댑터)을 끼워서 억지로 호환시켜 버립니다. 로봇 겉면에 미사일을 달고 싶은데 몸통을 다시 뜯어내기 귀찮으면, 그냥 기존 로봇 껍데기 위에 자석처럼 장갑을 덧대어(4. 데코레이터) 덩치와 기능을 불려 나갑니다. 조종사가 로봇의 복잡한 100개의 전선을 일일이 조작하다 감전될까 봐, 조종석 앞에 큼직한 '합체 전원 버튼' 딱 1개(5. 퍼사드)만 만들어 뒤의 복잡함을 싹 가려줍니다. 단일 부품의 한계를 뛰어넘어, 수십 개의 객체를 엮어 위대한 성벽을 쌓아 올리는 아키텍트들의 필수 조립 공학입니다.