본문 바로가기
척척학사/프로그래밍 언어론

프로그래밍 패러다임

by 학사쟁이 2023. 8. 28.
반응형

프로그래밍 패러다임

패러다임이란?

패러다임이란 한 시대의 견해나 사고를 규정하는 양식, 규범, 체계를 통칭하는 말로 토머스 쿤에 의해 소개되었다. 과학분야의 큰 발전으로 과거에 믿음과 체계가 흔들리고 대체되는 과정을 표현했다.

  • 과학 : 천동설 → 지동설
  • 경제 : 저축이 미덕 → 소비가 미덕
  • 언어 : 너무 나쁘다 → 너무 좋다

프로그래밍 패러다임의 변화

프로그래밍의 패러다임은 프로그램을 작성하는 전형적인 형식,그리고 프로그래머가 추구하는 방식이다.컴퓨팅 환경의 변화에 따라 비교적 자연스럽게 진행되어 왔다.

  • 명령형 프로그래밍 패러다임 - 초기 한정된 자원에서 효율적인 절차를 통해 프로그램을 작성하는 것이 중요했다. 어떤 연산을 어떤 순서로 할지 결정하는 것이 중요했는데 본질적으로 데이터 처리하기 위한 명령어의 나열이었다.
  • 절차형 프로그래밍 패러다임 - 점차 복잡한 데이터를 처리하게 됨에 따라 처리하는 방식 자체를 잘 정리하는 것이 중요해졌다. 문제를 해결하는데 필요한 연산이 무엇인지 정리하고 관리하기 쉽도록 모듈화 하여 관리하는 것이 필요했다. 프로그램을 절차의 집합으로 간주했다.
  • 함수형 프로그래밍 패러다임 - 그동안 저장된 메모리를 관리하는 게 어려운 문제가 등장했고 그러다 메모리 관리에 신경을 쓰게 되었다. 주어진 데이터를 값으로 간주하고 새로운 값을 생성하는 함수에 초점을 맞춤으로써 메모리 관리에 대한 부담을 제거했다.
  • 논리 프로그래밍 패러다임 - 계산 절차를 절차로 생각하는 대신 해당 문제의 조건을 명시하는 규칙으로 생각하지는 방식, 문제에서 명시학 있는 요구사항을 논리식으로 표현하고 논리식의 무결성에 초점을 맞추면 원하는 답을 찾는 과정은 컴퓨터가 알아서 처리한다. 데이터처리과정 대신에 문제의 요구사항을 선언적으로 명시하는 것에 초점을 맞추다 보니 선언적 프로그래밍 패러다임의 한 종류로 볼 수 있다.
  • 객체지향 프로그래밍 패러다임 - 절차형 패러다임으로 데이터 처리 절차를 구현하다 보면 같은 데이터에 대해 다른 처리 절차를 여러 개 명시해야 되는 경우가 자주 발생한다. 이때 공통된 데이터를 처리하는 절차를 하나로 묶으면 데이터와 여러 절차를 하나로 다룰 수 있는데 이것이 객체지향이다. 시뮬레이션에 특히 효과적이었다. GUI프로그래밍에 많이 사용된다.

프로그래밍 패러다임 변화의 배경

첫 번째로 응용 도메인의 변화가 있다. 초기 계산 분야였던 요구사항이 다양하게 변화하였고, 데이터베이스관리 및 트랜잭션 처리, 인공지능에 필요한 요구사항으로 시뮬레이션을 위해 객체지향 프로그래밍이 등장한 것이 예시이다.
두 번째로 프로그램 구성 방식이다. 초기 문제 해결을 위한 명령어의 나열로 프로그램을 생각했지만 복잡해져 프로그램을 모듈로 인식하려는 경향이 강해졌다.  즉 문제해결을 위해 점점 복잡해지는 구성으로 큰 문제를 풀기 위해 작은 문제 풀 때 사용하던 모듈을 조합하게 되었다.
세 번째로 계산모델이다.  튜링모델이 계산 주류 모델이었지만 사람이 이해하기 쉬운 방식을 원했고 그 결과 재귀 함수론을 계산모델로 삼은 함수형 패러다임, 연역추론을 모델로 삼은 논리 패러다임이 등장했다.
 

프로그래밍 언어 패러다임

프로그래밍 패러다임이 프로그램을 작성하는 방식이나 스타일을 뜻한다면 프로그래밍 언어의 패러다임은 어떤 프로그래밍 패러다임을 해당 프로그래밍 언어가 지원하느냐 하는 것이다. 특정 프로그래밍 언어가 특정 패러다임을 지원한다 해도 그 패러다임으로만 프로그램을 작성한다는 것이 아니라 잘 지원한다는 뜻이다.

주요 언어의 프로그래밍 패러다임

특정 패러다임을 지원하는 언어에서 다른 패러다임으로 작성하는 것도 가능하다. 예로 C언어는 명령형 패러다임과 절차형 패러다임을 지원하지만 함수형 스타일이나 객체지향스타일로 프로그래밍하는 것도 가능하다. 자연스럽게 프로그램을 작성할 수는 없지만 불가능한 것이 아니다.

프로그래밍 패러다임의 양립성

프로그래밍 패러다임은 새로운 패러다임이 등장하면 이전에 있던 패러다임이 더욱 공고히 완성된다. 이러한 다양한 패러다임은 서로 양립할 수 있으며, 주류 프로그래밍 패러다임이 바뀜에 따라 이를 언어가 수용하는 형태로 변화한다.
파이썬의 경우 이러한 특성이 잘 드러난다. 본래 명령형, 절차형 패러다임을 지원하지만 새로운 버전에서 함수형, 객체지향 패러다임을 포함하는 형태로 발전했다.
 

여러 패러다임의 프로그램 예시

구체적인 예를 통해 명령형, 절차형, 객체지향, 함수형, 논리 패러다임을 살펴보고 특징을 파악해 보자.

명령형 프로그래밍

명령형 프로그래밍 패러다임은 프로그램을 일려로 나열된 명령어라고 간주한다. 또한 프로그램을 매우 쉽게 이해할 수 있다는 장점이 있지만 프로그램이 복잡해질경우 효과적으로 다루지 못한다는 단점이 있다.
명령어의 수행여부, 횟수제어를 위해 제어 명령어가 사용되는데 이를 흐름제어 명령어라고 부르고 대표적으로 goto가 있다.
BASIC

절차형 프로그래밍

프로 그래을 서브루틴이라는 절차를 통해 프로그램을 구성하는 방법이다. 프로시저라는 용어에서 나왔는데 서브루틴 결괏값이 반환되면 함수라 부르고 반환하지 않는다면 프로시저라고 부른다. 재귀호출을 사용하여 프로시저를 간단하게 정의할 수 있는 점이 장점이다.
임의 함수가 자신을 다시 호출하는 것을 재귀호출이라고 한다.
Algol

구조화 프로그래밍

goto 없이 프로그램을 작성하는 방법을 뜻하는데 구체적으로 블로과 서브루틴을 활용하여 프로그램을 작성한다. 구조화된 제어문이란 if문이나 while문처럼 다른 문장을 포함하는 중첩된 제어문을 뜻한다. 현재 사용하는 대부분의 언어는 블록 구조의 언어이다.
goto논란은 유명한 자들이 서로 goto가 좋다 좋지 않다로 얽힌 대립된 주장을 펼쳤던 것을 말한다. 

객체지향 프로그래밍

시뮬레이션 분야에서 발전하기 시작했다. 실세계의 대상을 모형화할 수 있는 방법이 필요하였는데 객체지향 언어에서는 이를 객체로 나타낸다.

  • 객체란 상태를 유지하고 있으며 외부의 요청에 반응하는 어떤 행위를 수행하는 데이터, 자신에 상태를 유지하며 외부 요구에 따라 수행하는 것을 모형화한 것이다. 처음으로 도임한 언어는 Simula이다.

같은 부류의 객체는 클래스로 나타낼 수 있다. 클래스는 필드를 외부에 숨기고 메소드만 외부에 공개함으로써 정보은닉과 캡슐화를 지원할 수 있다. 이러한 특징은 프로그램을 재사용하기 편 라하게 만들어졌으며 이는 소프트웨어 생산성에 크게 기여하였다.

함수형 프로그래밍

프로그래밍 언어 초기부터 명령형 언어와 함께 발전하였다. 함수형 언어는 데이터를 값으로 바라보는데 이렇게 해서 얻을 수 있는 이점은 데이터를 바꾸는 명령어를 함수로 취급할 수 있다는 것이다. 함수형 언어는 함수자체를 값으로 취급할 수 있어 함수를 다루는 함수를 자연스럽게 사용할 수 있다. 이는 함수형 언어의 큰 장점이다.

  • 함수를 다루는 함수를 고계함수라고 한다.
  • 별도의 함수 정의 없이도 함숫값을 나타낼수 있는데 이와 같은 함수값을 함수리터럴 혹은 람다함수라고 부른다.

최신 함수형 언어는 강력한 타입 및 타입 추론을 도입하여 프로그램 안정성을 높이려 하고 있다.
Haskell

선언적 프로그래밍과 논리언어

논리언어는 기호 처리분야에서 널리 사용된다. 프로그램을 논리식 집합으로 구석하고 논리식 열거를 통한 선언적 프로그래밍을 지원한다. 논리식은 명제나 술어로 나타내는데 명제와 달리 술어는 인수를 받을 수 있다. 초초의 논리언어는 Prolog고 특히 자연어 처리분야에서 문법규칙을 나타낼 때 매우 유용하다. 이러한 특징으로 인해 언어처리, 인공지능 분야에서 널리 사용되었다. 
논리언어는 패턴 매칭과 재귀적 정의를 이용하여 계산을 수행하고 논리언어 프로그램은 논리식 집합으로 구성되는데 논리식 연거를 통해 선언적 프로그래밍을 지원한다.
1990년대 초 연역적 데이터베이스 시스템이 도입되었으나 현재는 사용되지 않고 있으며 최근에는 제약 조건 프로그래밍에 도입되어 다른 패러다임과 합쳐서 사용된다.
Prolog
 

프로그래밍 언어와 프로그래밍 패러다임

위의 내용처럼 다양한 프로그래밍 패러다임은 서로 배타적이라기 보단 상호 보완적으로 보는 것이 바람직하다.
앞서 설명한 패러다임의 특징을 요약하면

  • 객체지향 패러다임 : 객체 사이의 통신은 ㄹ통해 계산을 표현함
  • 함수형 패러다임 : 함수의 적용을 통해 계산을 ㄹ표현함
  • 논리 패러다임 : 논리식의 진위를 증명하는 과정을 통해 계산을 표현함

특히 최근에는 프로그래밍 패러다임이 결합되는 형태를 보이고 있고 이러한 이유로 다양한 패러다임을 이곃 자신의 프로그래밍 사고를 넓히는 것이 중요하다.

반응형