brunch

You can make anything
by writing

C.S.Lewis

by 개앞맵시 이복연 Dec 23. 2022

[개발 상식] 3대 프로그래밍 패러다임의 등장과 부흥

3대 프로그래밍 패러다임의 등장 순서와 부흥 순서가 반대인 이유는?

★ 역시나 오래전에, 지인께 간략히 설명드리기 위해 정리해둔 글입니다. 깊게 조사해서 정리한 건 아니니 감안해서 가볍게 봐주세요.




3대 프로그래밍 패러다임의 등장과 부흥

3대 프로그래밍 패러다임이라고 하면 다음 3개를 뽑을 수 있다.


구조적 프로그래밍(structural programming)

객체지향 프로그래밍(object-oriented programming)

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


각 패러다임의 대표적인 언어로는 C, 자바, 리스프(LISP)를 들 수 있다.


우리가 프로그래밍을 배울 때는 보통 ‘구조적 → 객체지향 → 함수형’ 순으로 익히데, 각 패러다임이 주류에 편입된 순서이기도 하고, 사람이 이해하기 쉬운 순서이기도 하다.


하지만 세 패러다임이 등장한 순서는 정 반대인 ‘함수형 → 객체지향 → 구조적’이다. 함수형 패러다임의 근간인 람다 계산법은 심지어 컴퓨터 프로그래밍 자체보다 먼저 등장했다. 알론조 처치가 발명한 이 계산법의 영향을 받아 만들어진 리스프 언어가 등장한 게 1958년이다. 그리고 객체지향은 1966년에, 구조적 프로그래밍은 1968년에 등장한다.


부흥 순서: 구조적 → 객체지향 → 함수형

등장 순서: 함수형 → 객체지향 → 구조적


패러다임별 상대적 비중은 임의로 정한 것이니 대략적인 흐름만 참고하자.


이처럼 등장 순서와 부흥 순서가 반대인 이유는 무엇일까?


등장과 부흥 시기가 반대인 이유


구조적 프로그래밍은 if/then/else와 do/while/until 같은 단순한 구조를 활용해 로직을 표현하는 프로그래밍으로, 세 패러다임 중 개념이 가장 단순하고 직관적이다. 그래서 ‘기계와 사람 모두가 가장 쉽게 이해’할 수 있는 프로그래밍 방식이다. 초창기 컴퓨터는 속도도 느리고 용량도 작아서 단순한 일밖에 할 수 없었기에 구조적 프로그래밍이 가장 적합했다.


객체지향 프로그래밍은 모든 것을 객체 사이의 상호작용으로 바라본다. 객체는 서로 밀접한 상태(데이터)와 동작(연산)을 한데 묶은 것으로, 이 외에도 데이터 은닉, 상속, 다형성 같은 복잡한 개념을 응축한 덩어리다. 그래서 같은 걸 구현하더라도 구조적 프로그래밍에 비해 훨씬 무겁고 느렸다.


그러다가 하드웨어가 발전하여 점점 더 많은 일을 더 빠르게 처리할 수 있게 되어서 사람들은 점점 더 복잡한 일을 컴퓨터에 맡기고 싶어 했다. 구조적 프로그래밍의 단순한 구조만 활용해서는 거대한 로직을 오류 없이 표현하기가 점점 어려워지자, 객체라는 단단한 틀에 맞춰 각각의 모듈을 구현하고, 이 모듈들을 조합해서 더 큰 로직을 완성하는 방식으로 넘어가게 되었다. 결국 하드웨어의 발전이 패러다임 전환을 이끈 것이다.


함수형 프로그래밍은 이름에서 예상할 수 있듯 그 뿌리가 ‘수학’이다. 함수형 프로그래밍에서는 데이터의 값이 변하지 않으며, 그래서 어떤 함수도 부작용을 낳지 않는다. 컴퓨터 시각에서는 객체지향보다 단순하지만 보통의 사람이 이해하기엔 훨씬 어렵다. 그래서 가장 먼저 등장했음에도 특정 분야에서 근근이 명맥을 유지할 뿐이었다.


그런데 이번에도 하드웨어의 발전이 패러다임을 움직였다. 음.. 이번에는 조금 다르게, ‘하드웨어의 발전 방향이 바뀌면서’ 패러다임도 바뀌었다고 봐도 될 것이다. 한계가 없어 보이던 하드웨어의 발전은 2000년대에 들어서며 변곡점을 맞는다. 단일 코어의 성능을 끌어올리는 데 한계에 부딪히자 방향을 수평으로, 즉 코어 수를 늘리는 쪽으로 선회한 것이다. 그래서 소프트웨어에도 이 수평적인 확장에 발맞춰 동시성 프로그래밍이 요구되었다.


문제는 기존의 구조적 프로그래밍이나 객체지향 프로그래밍으로는 동시성을 제어하기가 만만치 않다는 것이다. 동시성 버그는 소프트웨어에서 해결하기가 가장 난해한 문제에 속한다. 경쟁 조건race condition, 데드락deadlock, 동시 업데이트concurrent update 같은 단어만 들어도 프로그래머의 뇌는 쥐가 난다. 그런데 이런 문제는 모두 데이터의 값이 변하기 때문에 발생한다.


잠깐! 값이 변하기 때문이라고? 앞서 함수형 프로그래밍에서는 데이터의 값이 변하지 않는다고 했다. 동시성 문제 해결! 땅! 땅!


여기에 더해, 객체라는 복잡한 추상화를 이용하지 않기 때문에 객체지향보다 코드가 한결 간결하다. 수학에 기초한 난해한 개념들만 극복하고 나면, 모던 하드웨어의 잠재력을 십분 활용하며 버그 없는 간명한 코드를 만들어낼 수 있는 것이다.


마치며

처음 그림에 대표적인 부흥 이유를 추가해 보았다.


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari