Summary | 디자인 패턴 & 프로그래밍 패러다임 | Design Pattern & Programming Paradigm

[ CS ] 디자인 패턴 & 프로그래밍 패러다임 개념 Summary

CS 개념 중 디자인 패턴 & 프로그래밍 패러다임을 공부하고 다음에 볼 수 있도록 한 페이지에 정리하고 있다. 참고한 도서나 페이지들은 밑에 첨부하였다. 더 자세한 내용을 공부하고 싶다면 아래 참고한 페이지를 보자!


1. 디자인 패턴 Design Pattern

디자인 패턴은 프로그램을 설계할 때 발생했던 문제를 객체 간의 상호 관계 등을 이용하여 해결할 수 있도록 하나의 ‘규약’ 형태로 만들어 놓은 것을 의미한다.


💡 디자인 패턴을 사용하는 이유

개발의 효율성, 유지보수성, 운용성이 높아지며 프로그램 최적화에 도움이 된다.


🔎 디자인 패턴 유형

디자인 패턴의 유형은 목적과 범위에 따라 나뉠 수 있다.

목적
  • 생성: 객체의 생성 방식 결정하는 패턴
  • 구조: 클래스나 객체를 조합해 더 큰 구조를 만드는 패턴
  • 행위: 클래스나 객체 사이의 알고리즘이나 책임 분배에 관련된 패턴
범위
  • 클래스: 클래스 간 관련성 (상속)
  • 객체: 객체 간 관련성



2. 디자인 패턴 종류

1️⃣ 생성 패턴

생성 패턴은 객체의 생성과 관련된 디자인 패턴으로, 객체의 생성과 조합을 캡슐화하여 특정 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 크게 받지 않도록 유연성을 제공한다.

  • 빌더 패턴
    • 복잡한 인스턴스를 조립하여 만드는 구조
    • 복합 객체를 생성할 때 객체를 생성하는 방법과 객체를 구현하는 방법을 분리함으로써 동일한 생성 절차에서 다양한 표현 결과를 만들 수 있는 디자인 패턴
  • 프로토타입 패턴
    • 생성할 객체의 종류를 명시하는 데 원형이 되는 예시물을 사용하고 새로운 객체를 이 원형들을 복사함으로써
    • 필요한 부분만 수정하여 사용하는 디자인 패턴
  • 싱글톤 패턴
    • 하나의 클래스를 기반으로 객체를 하나만 생성하도록 함.
    • 생성된 객체를 어디에서든지(전역) 참조할 수 있도록 하는 디자인 패턴
  • 추상팩토리 패턴
    • 구체적인 클래스를 지정하지 않고 관련성이 있거나 독립적인 객체들을 생성하기 위한 인터페이스를 제공하는 디자인 패턴
  • 팩토리 메서드 패턴
    • 상위 클래스에서 객체를 생성하는 인터페이스를 정의하고,
    • 하위 클래스에서 인스턴스를 생성하도록 하는 디자인 패턴



2️⃣ 구조 패턴

구조 패턴은 클래스나 객체를 조합해 더 큰 구조를 만드는 패턴이다. 서로 다른 인터페이스를 지닌 2개의 객체를 묶어 단일 인터페이스를 제공하거나 서로 다른 객체들을 묶어 새로운 기능을 제공할 수 있다.

  • 어댑터 패턴
    • 클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴
    • 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동할 수 있게 해줌
  • 데코레이터 패턴
    • 기존에 구현되어 있는 클래스에 필요한 기능을 추가해 나가는 설계 패턴
    • 기능 확장이 필요할 때 객체 간의 결합을 통해 기능을 동적으로 확장할 수 있게 해줌
    • 상속의 대안으로 사용되는 디자인 패턴
  • 프록시 패턴
    • 어떤 다른 객체로 접근하는 것을 통제하기 위해
    • 그 객체의 매니저를 제공
  • 브리지 패턴
    • 기능의 클래스 계층과 구현의 클래스 계층을 연결
    • 구현부에서 추상 계층을 분리하여 추상화된 부분과 실제 구현 부분 독립적으로 확장할 수 있는 디자인 패턴
  • 퍼사드 패턴
    • 복잡한 시스템에 대해 통합된 단순한 인터페이스를 제공함으로써
    • 사용자의 시스템 간 또는 여타 시스템과의 결합도를 낮추어 시스템 구조에 대한 파악을 쉽게 하는 디자인 패턴



3️⃣ 행위 패턴

행위 패턴은 클래스나 객체 사이의 알고리즘이나 책임 분배에 관련된 패턴이다. 한 객체가 혼자서 수행할 수 없는 작업을 여러 개의 객체로 어떻게 분배할지, 동시에 객체 사이의 결합도를 최소화하는 것에 중점을 두는 방식이다.

  • 옵저버 패턴
    • 객체들 사이에 1:N 의존관계를 정의하여 어떤 객체의 상태가 변할 때,
    • 의존 관계에 있는 모든 객체들에 연락이 가고 내용이 자동적으로 갱신될 수 있게 만드는 디자인 패턴
  • 이터레이터 패턴
    • 컬렉션 구현 방법을 노출시키지 않으면서도 그 집합체 안에 들어 있는 모든 항목에 접근할 방법을 제공하는 디자인 패턴
  • 상태 패턴
    • 객체의 내부 상태가 변경될 때 행위 내용이 변경되는 패턴
    • 객체는 자신의 클래스가 변경되는 것처럼 보임

3. 더 자세하게

이중 나는 간단하게 싱글톤, 프록시, MVC 패턴에 관해서 정리했다.



📌 싱글톤 패턴

싱글톤 패턴은 하나의 클래스에 하나의 인스턴스만 가진다.

싱글턴 패턴

하나의 클래스를 기반으로 여러 개의 개별적인 인스턴스를 만들 수 있지만, 그렇게 하지 않고 하나의 클래스를 기반으로 단 하나의 인스턴스를 만들어 이를 기반으로 로직을 만드는 데 쓰인다. 이 인스턴스에 대한 전역 접근​(액세스) 지점을 제공하는 생성 디자인 패턴이라고 할 수 있다.

  • 데이터베이스 연결 모듈에 많이 사용 (예: 몽고DB, MySQL)
  • 의존성 주입 -> 모듈 간 강한 결합 느슨하게 만들어줌

  • 😆 모듈을 쉽게 교체, 테스팅 쉬움
  • 😢 클래스 늘어나 복잡성 증가, 모듈들 더욱 분리



📌 MVC 패턴

MVC 패턴은 모델/뷰/컨트롤러로 이루어진 디자인 패턴이다.

  • [click] 애플리케이션의 구성 요소를 3가지 역할로 구분 모델 : 애플리케이션의 데이터인 데이터베이스, 상수, 변수
    : 사용자 인터페이스 요소, 모델을 기반으로 사용자가 볼 수 있는 화면, 변경 발생 시 컨트롤러에 전달
    컨트롤러 : 모델과 뷰를 잇는 다리 역할, 이벤트같은 메인 로직 담당, 모델과 뷰의 생명주기 관리, 모델이나 뷰의 변경 통지를 받으면 이를 해석하여 각각의 구성 요소에 해당 내용 알림
  • 옵저버 패턴 사용됨
  • 개발 프로세스에서 각각의 구성 요소만 집중해서 개발할 수 있음

  • 😆 재사용성 & 확장성 용이
  • 😢 복잡해질수록 모델-뷰 관계 복잡
  • 예) Spring



📌 프록시 패턴

프록시 패턴은 대상 객체로 접근하기 전에 그 흐름을 가로채는 계층이 있는 디자인 패턴이다.

  • 객체의 속성, 변환 등 보완
  • 데이터 검증, 캐싱, 로깅에 사용됨



➕ ) 프록시 서버

서버와 클라이언트 사이에서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴퓨터 시스템이나 응용 프로그램

  • 버퍼 오버플로우를 방지하거나
  • 웹 서버 앞단에서 디도스 공격 방어/HTTPS 구축에 쓰임




4. 프로그래밍 패러다임 Programming Paradigm

  • 선언형 : What을 풀어내는가
    • 함수형 프로그래밍
  • 명령형
    • 객체지향 프로그래밍
    • 절차지향형

객체지향 프로그래밍

객체들의 집합 -> 프로그램의 상호 작용 표현. 데이터를 객체로 취급하여 객체 내부에 선언된 메서드 활용

  • SOLID 원칙
    • S: 단일 책임, O: 개방-폐쇄, L: 리스코프 치환, I: 인터페이스 분리, D: 의존 역전
  • 😆 코드 재사용 용이, 유지보수 쉬움, 대형 프로젝트 적합
  • 😢 처리속도 상대적으로 느림, 용량 문제 발생 가능, 설계시 오래 걸림


절차형 프로그래밍

로직이 수행되어야 할 연속적인 계산 과정으로 이루어짐

  • 😆 코드의 가독성이 좋음. 실행 속도가 빠름 -> 계산 많은 작업에 쓰임
  • 😢 모듈화하기 어렵고 유지 보수성이 떨어짐


Reference

 

Related Posts



💙 You need to log in to GitHub to write comments. 💙
If you can't see comments, please refresh page(F5).