Programming Paradigm

패러다임(paradigm)은 어떤 한 시대 사람들의 견해나 사고를 근본적으로 규정하고 있는 테두리로서의 인식의 체계, 또는 사물에 대한 이론적인 틀이나 체계를 의미한다. - From.wikipedia -

프로그래밍 패러다임은 어떤 프로그래밍 언어를 사용하여 문제를 해결하기위한 접근법이다. 혹은 우리들로 하여금 어떠한 접근방식을 따를수 있도록 해주는 특정 도구나 기술을 사용하여 문제를 해결할 수 있는 방법을 의미한다. 이미 많은 프로그래밍 언어가 있는데, 그 언어들도 결국 구현될 때 어떠한 전략을 따를 필요가 있었으며, 그 전략이나 방법론을 패러다임이라고 부른다. 수많은 언어들에 비해 패러다임은 많지 않다. 많은 사람들의 지지를 받지 않았다면 그것은 이미 패러다임은 아닐 것이다.

가장 큰 분류는 크게 두 가지로 나뉜다. 명령형 프로그래밍(Imperative Programming Paradigm)과 선언형 프로그래밍(Declarative Programming Paradigm)이다.

1. Imperative programming paradigm

이는 가장 오래된 프로그래밍 패러다임 중 하나이다. 이는 기계 구조의 특징과 밀접한 연관이 있다. 폰 노이만 아키텍쳐에 근간을 두고 있으며, 할당(대입) 연산을 통해 프로그램 상태를 변경시키는 동작을 한다. 따라서 상태를 변경함으로써 단계별로 동작을 수행한다. 핵심 원리는 어떻게 목적을 달성하는가이다. 이 패러다임은 몇가지 상태와 다음 실행될 결과를 모두 저장한다.

  • Advantage

    1) 구현하기가 매우 간단하다.

    2) loop, 변수 등을 포함한다.

  • Disadvantage

    1) 복잡한 문제를 해결하기 매우 힘들다.

    2) 저생산적이고 저효율적이다.

    3) 병렬 프로그래밍이 불가능하다.

  • Examples

    C, Fortran, Basic

1.1. Procedural programming paradigm

이 패러다임은 머신 모델의 관점에서의 절차를 강조한다. 때문에 Imperative 접근 방식과 차이점이 없어서 동의어로 사용되기도 한다. 이는 재사용성 때문에 사용중인 코드를 재사용할 수 있는 기능을 제공한다.

  • Examples

    1) C, C++, Java, ColdFusion, Pascal

1.2. Object oriented programming ★

프로그램은 의사소통에 사용되는 클래스와 오브젝트의 모음이다. 가장 작고 기본적인 엔티티는 객체이며 모든 종류의 연산은 객체를 통해서만 이루어진다. 절차보다는 데이터에 더 중점을 둔다. 오늘날 현실세계의 거의 모든 문제를 다룰 수 있다. 왜냐하면 소프트웨어 세계에서의 객체를 현실세계에서의 객체로 빗대어서 이해하기가 쉽기 때문이다. 실제로 소프트웨어에서의 객체는 현실세계에서의 객체보다 훨씬 큰 의미일수도 있고, 유연하다. 이에 대해서는 좀 더 깊은 이해가 필요하다.

  • Advantages

    1) 데이터 보안성

    2) 상속성

    3) 코드 재사용성

    4) 유연하며 추상화를 구현한다.

  • Disadvantages

    단점은 시대의 변화와 기술의 발전에 따라서 상대적인데, 함수적 프로그래밍이 대두되고 있는 이유가 바로 OOP의 단점을 보완하기 위한 것이라고 볼 수 있다.

    1) 코드의 변화에 따라 테스트 코드를 작성하는 것이 비교적 어렵다.

    2) 클래스 변수나 다른 외부의 데이터를 가져다 쓰는 메서드의 경우, 멀티 쓰레드 환경에서의 프로그래밍, 병렬 프로그래밍이 어렵다.

    3) 비교적 코드가 복잡하다.

  • Examples

    Simula, Java, C++, Objective-C, Visual Basic .NET, Python, Ruby, Smalltalk

1.3. Parallel processing approach

병렬 처리는 여러개의 프로세서들 사이에서 명령을 나누기 위한 처리를 프로그래밍하기 위한 것이다. 병렬 처리 시스템은 여러개의 프로세서를 보유하는데, 프로그램을 분할하여 더 짧은 시간에 실행할 수 있도록 보장한다. 이 접근방식은 divide and conquer방식과 비슷하다.

2. Declarative programming paradigm

선언형 프로그래밍은 프로그램을 빌딩할때 제어 흐름을 빼고 연산의 로직을 표현하기위한 방법이다. 이는 종종 어떤 로직의 이론으로서 프로그램을 고려한다. 이는 병령 프로그램을 작성하는것을 단순화해준다. 어떻게 완료되는가? 보다는 완료되기 위해서 무엇이 필요한가?에 중점을 둠으로써 기본적으로 코드가 실제로 무엇을 하는가?를 강조한다. 이것이 명령형 프로그래밍(how to do)과 선언형 프로그래밍(what to do) 패러다임의 유일한 차이점이다.

2.1. Logic programming paradigm

이는 연산의 추상적 모델이라고 할 수 있다. 이는 논리적 문제들을 마치 퍼즐이나 시리즈처럼 해결하는 것과 비슷하다. 논리 프로그래밍에서 우리는 사전에 이미 알고있는 지식 기반을 가지고 있으며, 그 기반에 추가로 기계에 주어진 질문 및 지식 기반과 함께 결과를 생성한다. 일반 프로그래밍 언어에서는 이러한 지식 기반 개념을 사용할 수 없지만 인공 지능, 기계 학습이라는 개념을 사용하면서 동일한 매커니즘을 사용하는 인지 모델과 같은 모델이 있다.

논리 프로그래밍에서 핵심 강조사항은 지식 기반과 문제이다. 프로그램의 실행은 수학적인 문장의 증명과 매우 유사하다.

2.2. Functional programming paradigm ★

함수적 프로그래밍 패러다임은 수학에 근간을 두고있으며 언어 독립적이다. 이 패러다임의 핵심원칙은 일련의 수학적 함수를 실행하는 것이다. 추상화의 중심 모델은 데이터 구조가 아닌 특정 계산을 하기위한 기능이다. 데이터는 함수와 느슨하게 결합되며 함수는 구현을 숨긴다. 함수는 프로그램의 의미를 변경하지 않고 기능을 해당 값으로 대체할 수 있다.

2.3. Database/Data driven programming approach

이 프로그래밍 방법론은 데이터와 데이터 이동을 기반으로합니다. 프로그램 문은 일련의 단계를 하드 코딩하는 대신 데이터로 정의됩니다. 데이터베이스 프로그램은 비즈니스 정보 시스템의 핵심이며 파일 생성, 데이터 입력, 업데이트, 쿼리 및보고 기능을 제공합니다. 주로 데이터베이스 애플리케이션을 위해 개발 된 몇 가지 프로그래밍 언어가 있습니다. 예를 들어 SQL. 필터링, 변환, 집계 (예 : 통계 계산) 또는 다른 프로그램 호출을 위해 구조화 된 데이터 스트림에 적용됩니다. 따라서 자체적으로 광범위한 응용 프로그램이 있습니다.