프로그래밍 패러다임

본 글은 로버트 C.마틴 저자(송준이 엮음)의 [클린 아키텍처: 소프트웨어 구조와 설계의 원칙] 도서를 참고하였습니다.


1. 패러다임이란

  • 프로그래밍을 사용하는 방법
  • 대체적으로 언어에 독립적
  • 어떤 프로그래밍 구조를 사용할지, 언제 이 구조를 사용해야 하는지 결정
  • 현재는 세 가지 종류(구조적 프로그래밍, 객체 지향 프로그래밍, 함수형 프로그래밍)만 존재함

2. 구조적 프로그래밍

  • 최초로 적용된 패러다임(최초로 만들어진 패러다임 X)
  • 1968년 에츠허르 비버 데이크스트라(Edsger Wybe Dijkstra)가 발견
    • 무분별한 점프(goto)문은 프로그램 구조에 해롭다는 사실을 제시
  • 점프문들을 if/then/else와 do/while/until과 같이 더 익숙한 구조로 대체함
  • 구조적 프로그래밍은 제어흐름의 직접적인 전환에 대해 규칙을 부과함

3. 객체 지향 프로그래밍

  • 1966년 욜레 요한 달(Ole Johan Dahl)과 크리스텐 니가드(Kristen Nygaard)에 의해 등장
    • ALGOL 언어의 함수 호출 스택 프레임(stack frame)을 힙(heap)으로 옮기면, 함수 호출이 반환된 이후에도 함수에서 선언된 지역 변수가 오랫동안 유지될 수 있음을 발견
  • 함수가 클래스의 생성자가 되었고, 지역 변수는 인스턴스 변수, 중첩 함수는 메서드가 되었음
  • 함수 포인터를 특정 규칙에 따라 사용하는 과정을 통해 필연적으로 다형성이 등장하게 되었음
  • 객체 지향 프로그래밍은 제어흐름의 간접적인 전환에 대해 규칙을 부과함

4. 함수형 프로그래밍

  • 가장 먼저 만들어졌으나, 최근에 들어서야 겨우 도입되기 시작함
  • 알론조 처치(Alonzo Church)는 어떠한 수학적 문제를 해결하는 과정에서 람다(lambda) 계산법을 발명
    • 이러한 연구결과에 직접적인 영향을 받아 만들어진 패러다임
  • 람다 계산법 : 1958년 존 매카시(John McCarthy)가 만든 LISP 언어의 근간이 되는 개념
    • 불변성(immutability) : 심볼(symbol)의 값이 변경되지 않는다는 개념
    • 대다수의 함수형 언어가 굉장히 까다로운 조건 아래서만 변수 값을 변경할 수 있음
  • 함수형 프로그래밍은 할당문에 대해 규칙을 부과함

5. 결론

5.1. 정리

  • 각 패러다임은 프로그래머에게서 권한을 박탈함
    • 어느 패러다임도 새로운 권한을 부여하지 않음
  • 각 패러다임은 부정적인 의도를 가지는 일종의 추가적인 규칙을 부과함
    • 패러다임은 무엇을 해야 할지를 말하기보다는 무엇을 해서는 안 되는지를 말해줌
      • 구조적 프로그래밍 : goto문
      • 객체 지향 프로그래밍 : 함수 포인터
      • 함수형 프로그래밍 : 할당문

5.2. 아키텍처와 프로그래밍 패러다임 간의 상관관계

  • 아키텍처 경계를 넘나들기 위한 메커니즘으로 다형성을 이용
  • 함수형 프로그래밍을 이용하여 데이터의 위치와 접근 방법에 대해 규칙을 부과
  • 모듈 기반 알고리즘으로 구조적 프로그래밍을 사용

Reference

  • 로버트 C.마틴, 2019, 클린 아키텍처: 소프트웨어 구조와 설계의 원칙