프로그래밍 패러다임 (Programming Paradigm)

이학성·2022년 2월 2일
0
post-thumbnail

프로그래밍 패러다임

절차지향 프로그래밍, 객체지향 프로그래밍, 함수형 프로그래밍 등등...
평소 자주 들어보던 이 모든 것들은 프로그래밍 스타일을 의미하며 전체적인 프로그래밍 방식을 뜻한다.

건물을 지을 때도 건물의 용도에 따라, 건축가의 취향에 따라 다양한 방법으로 건축을 하듯이
프로그램을 만들 때, 원하는 목표에 따라서 적절한 방법기법을 활용해서 프로그램을 만든다.

프로그램을 개발하기 위해선 우선 어떤 언어를 사용할지, 어떤 것을 지양하거나 지향할지 등등 다양한 방법으로 전략을 수립하는 데 이러한 모든 것을 통틀어 프로그래밍 패러다임이라고 한다. 이러한 패러다임에 알맞는 특성을 가진 프로그래밍 언어를 "OO패러다임을 갖는다" 라고 한다.

종류

프로그래밍 패러다임의 종류는 굉장히 다양하지만 대표적이고 범용적인 "함수형, 객체지향, 선언형" 패러다임을 알아보겠다.

패러다임은 "명령형 프로그래밍(HOW)""선언형 프로그래밍(WHAT)"의 두가지 큰 범주로 나눌 수 있다.

명령형 프로그래밍(HOW) : 알고리즘을 명시하고 목표를 명시하지 않는다.

프로그램의 상태와 상태 변경을 시키는 '구문'의 관점에서 연산을 설명하는 방식으로 문제를 어떻게 해결해야 하는지 컴퓨터에게 명령을 내리는 방법의 프로그래밍이다.

  • 절차형 프로그래밍: 수행되어야 할 연속적인 계산 과정을 포함하는 방식이다.
  • 객체지향 프로그래밍: 객체들의 집합으로 프로그램의 상호작용을 표현한다.

선언형 프로그래밍(WHAT) : 알고리즘을 명시하지 않고 목표만 명시한다.

어떤 방식(How)가 아닌 무엇(What)과 같은지를 설명하는 방식으로 무엇을 어떻게 해결해야 하는지 집중하고 해결 방법은 컴퓨터에게 위임하는 방법이다.

  • 함수형 프로그래밍: 순수함수와 보조함수를 조합하는 방식이다.

절차적 프로그래밍 (Procedural Programming)

단순히 절차적으로 실행하는 것을 중점으로 한다고 알려져있지만 절차적이지 않은 프로그래밍은 존재하지않다.
코드를 단순히 실행 순서의 관점으로만 보는 순차적 프로그래밍과 프로시저 단위로 보는 절차적 프로그래밍은 분명한 차이가 있다.
프로시저 콜, 즉 함수 호출을 통해서 추상화재사용성을 얻어내는 것이 본질인 패러다임이다.

장점

  • 함수를 통해 코드의 재활용성이 높아지게 된다.
  • 함수의 호출을 통해 여러 부분을 생략하여 코드의 가독성이 높아진다.
  • 모듈화와 구조화에 용이하다.

단점

  • 그냥 코드를 쓰는 것보다 시간이 매우 많이 소모된다.
  • 더 많은 메모리 접근을 요구하여 많은 시간과 자원을 잡아먹는다. (최근에는 컴파일러 성능이 좋아져 괜찮다.)
  • 조금만 복잡해지면 순서도로 나타내는 것이 불가능할 정도로 꼬인 "스파게티 코드"를 만들게 된다.
  • 대형 프로젝트에 부적합하고 유지보수가 어렵다.
  • 코드 순서 변경 시 다른 결과를 초래할 수 있다.

대표언어 : C


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

컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체(Object)"들의 모임으로 파악하고자 하는 것이다. 각 “객체(Object)" 들은 서로 메시지를 주고 받을 수 있으며 데이터를 처리할 수 있다.
클래스를 이용해 연관있는 처리부분과(함수) 데이터부분(변수)을 하나의 객체(인스턴스)로 묶어 생성, 사용, 작은 문제를 해결하는 객체를 생성해 큰문제를 해결하는 Bottom-Up 방식이다.

장점

  • 프로그램을 유연하고 변경이 용이하게 만든다.
  • 프로그램의 개발과 보수를 간편하게 만든다.
  • 직관적인 코드 분석을 가능하게 한다.

단점

  • 객체가 처리하려는 것에 대한 정확한 이해가 필요하기에 설계단계부터 많은 시간이 소모되서 개발속도가 느리다.
  • 모든 것을 객체로 생각해서 메모리와 연산에 대한 비용이 많이 들어가 실행속도가 느리다.

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

수학의 원리와 밀접하게 연관이 있기 때문에 어렵고 난해할 수 있다. 하지만 요즘 AI, IoT, 빅데이터, 비트코인 등의 발전으로 방대한 데이터를 빠르게 계산해서 병렬적으로 안정적으로 처리하는 것의 중요성이 부각되며 인기가 많아졌다.
파이프라인 처럼 입력(Input)을 넣으면 처리과정을 거쳐서 결과(Output)이 나온다. 외부에서는 이 파이프라인의 정보를 접근할 수 없고 안에서도 밖을 접근 할 수가 없다. 이런 함수들을 묶어서 프로그램을 구성해나가는 것을 말한다.

함수에서 외부의 상태값을 참조하거나 외부의 상태를 변경할 수 없어서 사이드 이팩트를 발생시키지 않는다. 때문에 동시성과 관련된 문제를 원천적으로 봉쇄하고, 테스트하기 용이하지만, 상태가 없기 때문에 함수형 프로그래밍 패러다임만 사용하여 프로그램을 작성할 수는 없다.

장점

  • 부작용(side effect)이 없다.
  • 디버깅이 쉽다.
  • 테스트하기 쉽다.

단점

  • 순수함수를 구현하기 위해 코드의 가독성이 좋지 않을 수 있다.
  • 반복이 재귀를 통해 이뤄지는데,(=deep copy) 재귀적 코드 스타일은 무한루프에 빠질 수 있다.
  • 순수함수를 쓰는건 쉬울 수 있지만, 그것들을 조합하는 것은 쉽지 않다.
  • 상태가 없기 때문에 함수형 프로그래밍 패러다임만 사용하여 프로그램을 작성할 수는 없다.

결론

프로그래밍 패러다임을 비교하는 것은 마치 주택과 아파트, 세단과 트럭, 배와 비행기 등을 비교하는 것과 같다.
따라서 어느 하나가 다른 하나를 완벽하게 대체할 수 있는 것이 아니라 원하는 목표에 따라서 적절한 것을 잘 골라서 사용해야 한다.

profile
좋은 개발자가 되기 위해

0개의 댓글