CS 전공지식/디자인 패턴

프로그래밍 패러다임

eunjineee 2023. 7. 12. 19:24

프로그래밍 패러다임(programming paradigm)

프로그래머에게 프로그래밍의 관점을 갖게 해주는 역할을 하는 개발 방법론

특징

객체지향 프로그래밍은 프로그래머들이 프로그램을 상호 작용하는 객체들의 집합으로 볼 수 있게 하는 반면,

함수형 프로그래밍은 상태 값을 지니지 않는 함수 값들의 연속으로 생각할 수 있게 해 줌

                       프로그래밍 패러다임
                 /                           \
              선언형                         명령형
              /                            /       \
            함수형                   객체지향형    절차지향형

⭐디자인 패턴이란?

프로그램을 설계할 때 발생했던 문제점들을 객체 간의 상호 관계 등을 이용하여 해결할 수 있도록

하나의 '규약' 형태로 만들어 놓은 것을 의미

1. 선언형과 함수형이란?

선언형 프로그래밍(declarative programming)

무엇을’ 풀어내는가에 집중하는 패러다임

“프로그램은 함수로 이루어진 것이다.”라는 명제가 담겨 있음.

함수형 프로그래밍(functional programming)

선언형 패러다임의 일종

‘순수 함수’들을 블록처럼 쌓아 로직을 구현하고 ‘고차 함수’를 통해 재사용성을 높인 프로그래밍 패러다임

 

순수 함수

출력이 입력에만 의존하는 것을 의미

 

고차 함수

고차 함수란 함수가 함수를 값처럼 매개변수로 받아 로직을 생성할 수 있는 것

 

일급 객체

이때 고차 함수를 쓰기 위해서는 해당 언어가 일급 객체여야 함

• 변수나 메서드에 함수를 할당할 수 있습니다.

• 함수 안에 함수를 매개변수로 담을 수 있습니다.

• 함수가 함수를 반환할 수 있습니다.

2. 객체지향 프로그래밍이란?

객체지향 프로그래밍(OOP, Object-Oriented Programming)은 객체들의 집합으로 프로그램의 상호 작용을 표현하며 데이터를 객체로 취급하여 객체 내부에 선언된 메서드를 활용하는 방식

다른 프로그램 패러다임에 비해 상대적으로 처리 속도가 느리고, 설계 속도가 느림

객체지향 프로그래밍의 특징

추상화 (abstraction)

복잡한 시스템으로부터 핵심적인 개념 또는 기능을 간추려내는 것

 

캡슐화 (encapsulation)

객체의 속성과 메서드를 하나로 묶고 일부를 외부에 감추어 은닉하는 것

  • 서로 관련성이 많은 데이터와 이와 관련된 함수들을 한 묶음으로 처리하는 기법
  • 결합도가 낮아지고 재사용이 용이
  • 인터페이스가 단순화됨
  • 정보은닉과 관계가 깊음
  • 캡슐화된 객체의 세부 내용이 은폐되어 변경 발생 시 오류의 파급효과가 적음

상속성 (inheritance)

상위 클래스의 특성을 하위 클래스가 이어받아서 재사용하거나 추가, 확장하는 것

코드의 재사용 측면, 계층적인 관계 생성, 유지 보수성 측면에서 중요

  • 객체지향 프로그래밍에서 이미 정의된 상위 클래스(부모 클래스)의 모든 속성과 연산을 하위 클래스가 상속(물려) 받는 것
  • 하위 클래스는 상위 클래스로부터 받은 속성과 연산 외에도 새로운 것을 첨가 가능
  • 클래스의 재사용, 소프트웨어의 재사용을 높이는 중요한 개념
  • 속성과 연산 등을 물려주는 클래스를 상위 클래스 또는 슈퍼 클래스, 물려받는 클래스를 하위 클래스 또는 서브 클래스라고 한다.

 

다형성 (polymorphism)

하나의 메서드나 클래스가 다양한 방법으로 동작하는 것

  • 하나의 메시지에 대해 각 객체가 갖고 있는 고유한 방법대로 응답하는 것을 의미
  • 하나의 클래스나 메서드가 다양한 방식으로 동작이 가능한 것을 의미
  • 현재 코드를 변경하지 않고 새로운 클래스를 쉽게 추가할 수 있게 한다
  • 오버로딩과 오버라이딩이 존재

오버로딩

  • 한 클래스 내에서 메서드의 이름은 동일하지만, 매개변수의 수나 타입을 다르게 하여 재정의 하는 것

오버 라이딩

  • 상속관계에서만 발생.
  • 슈퍼클래스의 메서드를 서브 클래스에서도 동일한 매서드를 재정의하는 것
  • (상위 클래스에서 정의한 일반 메서드의 구현을 하위 클래스에서 무시하고 재정의할 수 있음)

객체지향 설계원칙

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

객체는 단 하나의 책임만 가져야 한다.

 

2. 개방-폐쇄의 원칙(OCP, Open Closed Principle)

기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계가 되어야 한다.

 

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

일반화 관계에 대한 이야기며, 자식 클래스는 최소한 자신의 부모 클래스에서 가능한 행위는 수행할 수 있어야 한다.

서브타입(상속받은 하위 클래스)은 어디에서나 자신의 기반타입(상위클래스)으로 교체할 수 있어야 함을 의미

 

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

인터페이스를 클라이언트에 특화되도록 분리시키라는 설계 원칙이다.

 

5. 의존 역전 원칙(DIP, Dependency Inversion Principle)

의존 관계를 맺을 때 변화하기 쉬운 것 또는 자주 변화하는 것보다는 변화하기 어려운 것, 거의 변화가 없는 것에 의존하라는 것.

3. 절차형 프로그래밍이란?

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

장점

코드의 가독성이 좋음

실행 속도가 빠름

ex ) 포트란(fortran)을 이용한 대기 과학 관련 연산작업, 머신 러닝의 배치 작업

단점

모듈화가 어려움

유지보수성이 떨어짐

 

4. 패러다임의 혼합

패러다임을 정할 때는, 비즈니스 로직이나 서비스의 특징을 고려

여러 가지 패러다임을 조합하여 상황과 맥락에 따라 패러다임 간 장점만 취해 개발하는 것이 좋음