programming paradigm

7 분 소요

Introduction

프로그래밍 패러다임은 프로그래밍을 어떤 원칙으로 할지 정하고, 이 원칙에 따른 설계 관점을 프로그래머가 갖출 수 있도록 하는 개발 방법론이다.

패러다임의 종류

아래와 같이 나뉘나, 이들을 결합한 멀티 패러다임도 있다.

  • 선언형
    • 함수형
  • 명령형
    • 객체지향형
    • 절차지향형

선언형 프로그래밍은 무엇을(What) 할 것인지에 집중한 패러다임이다.
반면에 명령형 프로그래밍은 어떻게(HOW) 할 것인지 집중한 패러다임이다.

명령형 - 알고리즘은 명시하고 목표는 명시하지 않는다.

  1. 횡단보도까지 약 99m 이동(성남대로331번길),
  2. 횡단보도를 이용하여 경기성남분당경찰서 방면으로 횡단,
  3. 횡단보도까지 1개의 횡단보도를 지나 약 612m 이동,
  4. 횡단보도를 이용하여 메르세데스… 방면으로 횡단,
  5. 네이버까지 약 50m 이동(불정로).

선언형 - 목표를 명시하고 알고리즘을 명시하지 않는다
출발 : 경기도 성남시 분당구 성남대로 333,
도착 : 네이버 주소는 경기도 성남시 분당구 불정로 6.

함수형 패러다임

선언형 프로그래밍의 일종으로, 프로그래밍이 함수의 중첩으로 이루어져 있다. 아래는 함수형 패러다임에 맞춰 최대값을 찾기 위한 예시 코드이다.

const ret = [1, 2, 3, 4, 5, 11, 12]
.reduce((max, num) => num > max ? num : max, 0)
console.log(ret) // 12 

곧, 작은 순수함수들을 블록처럼 쌓아 로직을 구현한다.

순수 함수

출력이 입력에만 의존하는 함수를 의미한다.
함수형 패러다임에서는 static 변수나 객체 어트리뷰트 등에 의한 상태값이 존재해서는 안되며, 입력과 출력이 1:1 대응되어야 하기 때문에 순수 함수는 이 패러다임을 만족하기 위한 기본 조건이 된다.

const pure = (a,b) => {
     return a + b
}

고차 함수

함수가 함수를 매개변수로 받아 로직을 생성할 수 있는 것을 말한다. 고차함수를 통해 함수를 중첩해 하나의 프로그램으로 설계할 수 있게 된다.

일급객체 (first class)

고차 함수를 쓰기 위해서는 프로그래밍 언어에서 아래 조건을 만족해야 하며, 이를 일급 객체 특징을 가진다고 한다.

  • 변수나 메서드에 함수를 할당할 수 있다.
  • 함수 안에 함수를 매개 변수로 담을 수 있다.
  • 함수가 함수를 반환할 수 있다.

따라서 파이썬은 일급객체 특징을 가진다.

객체지향형 패러다임

객체의 집합으로 프로그램의 상호작용을 표현하는 패러다임이다.
아래는 객체지향 패러다임으로 최대값을 구하는 예시코드이다.

const ret = [1, 2, 3, 4, 5, 11, 12]
class List {
    constructor(list) {
        this.list = list
        this.mx = list.reduce((max, num) => num > max ? num : max, 0)
    }
    getMax() {
        return this.mx
    }
}
const a = new List(ret)
console.log(a.getMax()) // 12

객체 지향 특징

추상화

복잡한 시스템에서 공통으로 필요로 하는 핵심적인 기능과 개념을 간추려 표현하는 것이다. 이를 통해 설계의 유연함을 갖출 수 있다. 예를 들어 세부적인 기능 구현은 건너 뛰고 공통적으로 적용되는 뻐대만을 우선 구현할 수도 있다.

자료 추상화

불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단히 만드는 것이다. 자료 추상화를 통해 정의된 자료형을 추상 자료형이라고 한다.
추상 자료형은 자료형의 자료 표현과 자료형의 연산을 캡슐화한 것으로 접근 제어를 통해서 자료형의 정보를 은닉할 수 있다.
객체 지향 프로그래밍에서 일반적으로 추상 자료형을 클래스, 추상 자료형의 인스턴스를 객체, 추상 자료형에서 정의된 연산을 메소드(함수), 메소드의 호출을 생성자라고 한다.

캡슐화

객체의 속성과 메서드를 하나로 묶고 외부에서 접근하지 못하도록 은닉하는 것을 말한다.

상속성

상위 클래스의 특성을 하위 클래스가 이어받아 재사용할 수 있도록 하는 것을 말한다. 이를 통해 계층적인 관계 생성이 가능하며, 유지 보수가 쉬워진다.
예를 들어 사람이라는 상위 클래스를 만든 후, A라는 사람을 객체로 만들 때, 사람으로서 공통적인 특징은 그대로 상속받고, 고유한 A만의 특성을 따로 정의하여 재사용하는 것이다.

다형성

하나의 메서드나 클래스를 다양한 방법으로 동작하도록 하는 것이다.

오버로딩

같은 이름을 가진 메서드를 매개 변수의 유형/개수/타입이 다르게 하여 여러 개 가질 수 있는 것을 말한다.

오버라이딩

상위 클래스에서 상속받은 메서드를 하위 클래스에서 재정의 하는 것을 말한다.

객체 지향 설계 원칙

SOLID 원칙이라고 한다.

단일 책임 원칙 (S)

모든 클래스는 각각 하나의 책임만을 가진다.

개방-폐쇄 원칙 (O)

유지 보수 사항이 생길 경우, 쉽게 확장할 수 있도록 개방하되, 수정 시에는 닫혀야 한다. 기존 코드를 변경하지 않으면서 수정과 확장이 용이해야 한다고도 표현할 수 있다.

리스코프 치환 원칙 (L)

프로그램의 정확성을 깨트리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다. 부모의 객체에 자식 객체를 넣어도 시스템이 문제 없이 돌아가야 한다.

인터페이스 분리 원칙 (I)

하나의 인터페이스보다 구체적으로 여러 개 인터페이스를 만들어야 한다.

의존 역전 원칙 (D)

상위 계층은 하위 계층위 변화에 대한 구현으로 부터 독립되어야 한다.

절차형 패러다임

일이 진행되는 방식으로 코드를 구현하는 것이다. 아래는 절차형 패러다임으로 최대값을 찾는 예시이다.

const ret = [1, 2, 3, 4, 5, 11, 12]
let a = 0
for(let i = 0; i < ret.length; i++){
    a = Math.max(ret[i], a)
} 
console.log(a) // 12 

예상 질문

  • 함수형, 객체지향형, 절차형 프로그래밍의 특징과 장단점을 말해라.
  • 프로그램의 복잡도가 증가할수록, 일반적으로 절차형 프로그래밍이 객체지향형 프로그래밍보다 유지보수가 어려운 이유를 말해라.
  • 파이썬은 대표적인 멀티 패러다임 언어이다. 왜 멀티 패러다임 언어라고 할 수 있는지 각 패러다임 들의 특징을 고려해 예시를 들어라. 언어 자체의 특징 뿐 아니라, 자신이 주로 사용하는 라이브러리 or 오픈소스를 예시로 들어도 좋다.

Summary

Reference

면접을 위한 CS 전공지식 노트 - 주홍철 지음
선언형과 명령형
객체 지향 프로그래밍 - 위키백과 예제코드