본문 바로가기

Study/Computer Science

프로그래밍 패러다임

프로그래밍 패러다임이란 프로그램을 구성하는 코드 작성, 즉 구현에 있어서의 추상적 체계를 말한다.


비구조적 프로그래밍(unstructured programming)이란 프로그램의 실행 순서가 전부이던 시기의 프로그램 작성 패러다임이다. 'A가 끝났으니 B로 가시오.' 비구조적 프로그래밍에서 규칙은 단 하나다. 올바른 순서에 따라 올바른 출력을 뽑아내는 것. 코드의 작성은 '틀리지 않게' 이루어졌고, 코드의 유지보수는 지극히 코드 중심적으로 이루어졌을 것이다. 프로그래머는 지시에 따라 다음에 실행될 코드를 찾아가야만 했다.


프로그램에게 기대하는 바가 커지면서 프로그램 또한 거대해진다. 코드를 작성하는 과정은 물론 해석하는 과정 또한 간결해져야 했다. 산발적으로 반복되는 부분을 수렴적인 형태로 응축하고, 코드를 '어디로 가는 것'이 아니라 '어딘가에 있는 기능을 호출하는 것'에 가깝게 디자인하는 것이 구조적 프로그래밍(structured programming)이다.


이후의 프로그래밍 패러다임은 모두 구조적이다. 절차적 프로그래밍(procedural programming)도 예외는 아니다. 여기서 말하는 '절차'는 procedure의 번역어로써 '순서'라기보다는 추상적인 의미에서의 모듈, 즉 '특정한 기능을 수행하는 호출 가능한 단위'를 말한다. 절차적 프로그래밍에서는 반복적으로 인용되는 일련의 데이터 처리 절차에 이름을 붙여 그것을 적절히 호출하도록 했다.

수많은 데이터 사이에서 추상적인 "거리(distance)"를 논할 수 있다. '누군가의 정보인가?'라는 측면에서 'A의 나이'와 'A의 몸무게' 사이의 거리는 'A의 나이'와 'B의 몸무게' 사이의 거리보다 짧을 것이다. 하지만 '어떤 종류의 정보인가?'라는 측면으로 바라보면 결과는 달라진다. 즉 거리가 가깝다는 것은 특정한 층위에서 같은 라벨로 분류될 수 있다는 뜻이다. 프로그램의 목적에 따라 데이터 간의 거리는 다르게 정의되고, 목적과 효용에 따라 데이터는 하나의 단위로 묶이기 시작했다. 이를 구조체(struct)라 부른다. 더 나아가서, 이러한 추상적 거리는 데이터와 프로시저 사이에서도 논할 수 있다. 그러한 데이터와 프로시저, 즉 상태와 행위를 한데 묶은 단위를 객체(object)라고 부른다. 객체 지향 프로그래밍(object-oriented programming)의 등장이다.

협업과 생산성을 목표로 객체 지향 프로그래밍은 고도화되기 시작했다. 규범과 원칙 아래에서 객체가 가져야 할 조건을 논했다. 그렇게 적절한 조건 위에서 잘 구성된 객체들이 추상적 거리가 가까운 모듈을 공유하는 경우가 있다. 데이터의 유효성을 검사한다든지, 로그를 남긴다든지. 그러한 공통 관심사(cross-cutting concerns)를 별도로 모듈화하는 것이 관점 지향 프로그래밍(aspect-oriented programming)이다. (관점 지향 프로그래밍은 그 자체로 패러다임이라기보다는 객체 지향 프로그래밍의 보론에 가까운 듯하다)

객체 지향 프로그래밍에서는 객체의 상태와 행위가 정의되어 있는데, 이는 프로그램 내부에서 특정 객체에 접촉할 때 그 객체가 특정 상태에 있음을 전제한다는 뜻이기도 하다. 그런데 기술이 발전하면서 트래픽이 증대하고 멀티스레딩이 일반화되었다. 여러 요청이 거의 동시에 특정 객체에 접근하면 약간 늦게 도착한 요청은 괴상한 응답을 받게 될 수도 있다. 이렇게 등장한 동시성(concurrency) 문제에 따라 여러 방식이 제시되었는데, 입력과 출력 사이의 무결한 대응을 보장하는 함수형 프로그래밍(functional programming)이 그 예시다.

'Study > Computer Science' 카테고리의 다른 글

[HTTP] Stateless  (0) 2024.05.02
인터페이스  (0) 2024.04.25
자료형, 메모리, 그리고 Python [2]  (0) 2024.04.07
자료구조  (0) 2024.04.05
자료형, 메모리, 그리고 Python [1]  (0) 2024.03.24