우리는 어떤 문제를 코딩으로 해결하는 과정에서 여러 가지 방법으로 접근할 수 있다. 우리는 함수를 작성하기를 원할 수도, 혹은 메소드를 담고 있는 클래스를 생성할 수도 있다. 이러한 모든 다양성은 서로 다른 프로그래밍 접근 방식으로 결합될 수 있는데, 이를 우리는 패러다임이라고 부른다. (프로그래밍 “관점”으로 해석할 수 있음)아래 우리는 크게 두 가지의 메인 패러다임을 분석할 것인데, 바로 명령형(imperative)과 선언형(declarative) 및 이들의 타입에 대해서이다.
거의 모든 현대 프로그래밍 언어는 멀티 패러다임이다. 이들은 쉽게 명령형 접근과 선언형 접근을 결합해서 사용할 수 있다. 그럼에도, 각 패러다임에 대한 섹션에서, 우리는 다른 패러다임 중 섹션에서 논의된 것이 구현되는 프로그래밍 언어 목록을 제시할 것이다.
Imperative paradigm(명령형 패러다임)
명령형 패러다임은 가장 오래된 프로그래밍 패러다임이다. 이는 기계의 아키텍쳐와 밀접하게 연관된다. 명령형 프로그램은 자연어에서 명령하는 분위기와 비슷한 느낌이다. 이는 명령의 연속인데 프로세서가 반드시 단계적으로 수행해야만 한다. 이 패러다임의 핵심은 어떻게 목표를 달성할 것인가이다. 패러다임은 여러 진술(statement: 실행가능(executable)한 최소의 독립적인 코드 조각 - 한 개 이상의 수식과 프로그래밍 키워드를 포함)로 구성되어 있으며, 이들을 모두 수행한 뒤 결과가 저장된다.
예를 들어, 우리는 “Hello, !”이라는 구문을 스크린에 출력하고 싶다고 하자. 프로그램을 어떻게 짜야 할까? 아래와 같은 절차를 밟을 것이다.
- username을 묻는다.
- username을 읽고 기억한다.
- 결과를 출력한다.
명령형 프로그래밍은 3개의 넓은 카테코리로 분류한다.
- 절차적 프로그래밍(Procedural programming)
- 객체 지향 프로그래밍(Object-oriented programming)
- 병렬 프로세싱 접근(Parallel processing approach)
이 셋을 좀 더 자세히 살펴보자.
1. 절차적 프로그래밍 패러다임(Procedural programming paradigm)
절차적 프로그래밍 패러다임은 절차적 호출(procedure calls) 컨셉에 기반하는데, statement가 서브루틴 혹은 함수로 알려진 절차로 설계되어있다. 이들은 명령문의 리스트인데 이 명령문은 컴퓨터에세 무엇을 할 것인지 스텝 바이 스텝으로 알려준다. 즉, 컴퓨터는 입력 데이터를 받고 이를 순서대로 변경하여 각 새로운 변경값을 기억한다. 절차적 접근과 명령형 접근에는 차이가 없다.
절차적 프로그래밍은 이는 일반적인 일을 완수하는 범용 목적 프로그래밍에 적합하다. 따라서, 이것은 작은 계산 문제일 수 있는데, 예를 들어 팩토리얼을 계산하거나 figure의 영역을 찾거나, 혹은 몇몇 정보 혹은 구문(”Hello, world!”
)을 출력하는 것이라고 할 수 있다. 또한, 코드는 프로그램의 다른 파트에 복사 없이 재사용할 수도 있다.
이 패러다임으로 작성한 알고리즘은 구현이 매우 간단하나, 오히려 느리거나 복잡한 문제를 풀 수 없다.
절차적 프로그래밍 패러다임을 구현하는데 쓰는 프로그래밍 언어로는 C, Java, C++, ColdFusion, Pascal 등이 있다.
2. Object-oriented programming
객체 지향 프로그래밍(Object-oriented programming, OOP)는 프로그램이 클래스의 집합으로 구성되는 패러다임이다. 각 클래스는 객체라고 불리는 인스턴스를 갖는다.
클래스는 일반적으로 엔티티(Entity, 개체: 인간의 개념 또는 정보의 세계에서 의미있는 하나의 정보 단위)를 묘사하는 방식인데, 일반적인 상태를 정의하고 각 상태에 의존하는 행위뿐만 아니라 이 엔티티와 상호작용하기 위한 일반적인 규칙을 정의한다. 일반적으로, 클래스는 데이터의 집합(set)으로 바라볼 수 있는데, 예시로는 아래와 같다.
- 필드(field, 클래스 혹은 객체로 캡슐화된 데이터의 특정 조각(a particular piece of data encapsulated within a class or object)),
- 속성(attribute, 다른 값으로 설정될 수 있는 프로그램 내 컴포넌트의 변화할 수 있는 성질 혹은 특성 (a changeable property or characteristic of some component of a program that can be set to different values))
- 클래스 멤버,
- 함수(메소드)
예를 들어, 우리는 고양이(cat)이라는 엔티티를 클래스를 이용해 묘사하기를 원한다고 하자. 따라서, 고양이는 cat
클래스에 대응하는 객체가 될 것이다. 고양이는 몇몇 속성을 갖는데, 예를 들어 꼬리, 발, 발톱, 입, 귀, 털 등이 있다. 고양이의 행동으로는 달리거나, 뛰어오르거나, 울거나, 먹거나, 벽지를 긁는(...) 행위 등이 있다. 이 모든 것들이 cat
클래스 내 메소드로 정의될 것이다.
OOP는 일반적인 현실 세계의 문제의 거의 모든 종류를 다룰 수 있는데, 이를 위해 우리는 객체를 모델링하고 이와 함께 일할 필요가 있다.
객체 지향 패러다임을 구현하는데 쓰이는 프로그래밍 언어로는 Ruby, Java, C++, Python, Simula(가장 첫번째 OOP 언어), Smalltalk, Visual Basic, .NET(C# 웹 프레임워크), Obejctive-C 등이 있다.
3. Parallel processing approach
병렬 프로세싱은 명령 수행 시간을 줄이는 것을 돕는다. 이 방식은 여러 프로세스 간에 명령을 공유하거나 병렬화함으로써 가능해진다. 이 접근방식의 의미는 한 문장으로 요약할 수 있는데, 바로 “분할정복(Divide and conquer)”이다. 예로는 NESL, C/C++ 등이 있다.
Declarative paradigm(선언형 패러다임)
선언형 패러다임은 문제와 해결책에 대한 예상 결과를 구체화하는 것이 중요한 프로그래밍 패러다임이다. 즉, “어떻게 할 것인가?”라는 질문에 대해 답을 구하는 것이 필요한 명령형 패러다임과 대조적으로, “완료하기 위해 무엇이 필요한가?”와 “무엇이 이 일의 결과가 될 것인가?”와 같은 질문을 던져야 한다. 따라서, 스텝 바이 스텝과 같이 명령을 절차적으로 제공하는 것이 아니라 오히려 우리는 시스템에 필요한 것을 말하고 해결책을 제시하도록 해야 한다.
선언형 프로그래밍은 논리적, 함수형, 그리고 데이터베이스 패러다임으로 타입이 분류된다.
1. Logic programming paradigm(논리적 프로그래밍 패러다임)
논리적 프로그래밍은 일반적인 논리에 강하게 기반하는 프로그래밍 패러다임이다. 논리적 프로그래밍 언어로 쓰여진 모든 프로그램은 논리적 형식으로 쓰여진 문장의 집합인데, 이 논리적 형식은 어떤 문제 영역에 대한 사실과 규칙을 표현한다.
따라서, 논리적 프로그래밍의 기본 statement는 다음과 같다.
- Facts는 문제 도메인에 대한 근본적인 주장(일종의 공리)이다. ex) “소크라테스는 남자다.”
- Rules는 도메인 내에서 facts에 대한 추론이다. ex) “모든 사람은 반드시 죽는다(=필멸).”
- Queries는 도메인에 대한 질문이다. “소크라테스는 필멸자인가?”
일반적으로, 이 프로그래밍에서 task는 facts와 rules에 기반한 query로 답을 찾는 것과 같다.
논리적 프로그래밍 언어의 종류로는 Prolog, Answer Set Programming(ASP), Datalog 등이 있다.
2. Functional programming paradigm
함수형 프로그래밍은 계산 과정을 함수값의 계산으로 해석하는 프로그래밍 패러다임이다. 여기서 말하는 함수는 수학적으로 정의하는 함수와 유사한데, 이는 즉 함수에서 이 함수의 입력값은 변하지 않는 배열이며 출력값은 새로운 데이터가 담긴 새로운 배열이다. 이것이 절차적 프로그래밍에서의 함수와 다른 수학적 함수를 만드는 차이인데, 기존 절차적 프로그래밍에서의 함수는 원래의 데이터를 바꾸는 행위의 연속으로 간주하기 때문이다.
여기 간단한 예시가 있다. 어떤 함수가 (1)숫자가 담긴 리스트를 입력값으로 갖고 (2)이 숫자의 제곱값이 담긴 새로운 리스트를 반환한다고 하자. 이 함수는 원래 리스트에 담겨있던 숫자(1)를 전혀 바꾸지 않는다.(절차적 프로그래밍에서는 (1)에 있던 값을 특정 절차(함수)를 통해 바꿨던 것과 대조된다.)
함수형 프로그래밍 패러다임을 구현하는 프로그래밍 언어로는 자바스크립트, Haskell, Scala, Erlang, Lisp, ML, Clojure, OCaml, Common Lisp, 그리고 F# 이 있다.
3. Database programming paradigm(데이터베이스 프로그래밍 패러다임)
이 프로그래밍 방법론은 데이터로 작업하는 것에 기반한다. 이 데이터는 데이터베이스에 저장되고 쿼리는 특별한 언어로 이 데이터베이스에 의해 만들어진다. 예를 들어 SQL이 있다.(세상에..SQL이 선언형 프로그래밍 언어였구만 새삼 놀람) 이 언러로, 우리는 데이터에 접근해 필터링, 변환, 통계 계산 등을 처리할 수 있다. 프로그램 statement는 절차의 연속이라기보다 데이터로 정의된다.
데이터베이스 프로그램은 비즈니스 정보 시스템의 심장과도 같다.
Conclusion(결론)
정리하면,
- 프로그램을 생성하는 접근 방식을 패러다임이라고 정의한다.
- 크게 두 가지 메인 프로그래밍 패러다임이 존재하는데, 명령형과 선언형이 있다.
- 명령형 패러다임은 결과를 얻기 위해 스텝 바이 스텝으로 명령을 수행하는데 초점을 두는데, 이 과정에서 해당 명령은 데이터를 연속적으로 변경한다.
- 선언형 패러다임의 종류로는 절차적 프로그래밍(Procedural programming), 객체지향 프로그래밍(Object-oriented programming), 그리고 병렬 프로세싱 접근(Parallel processing approach)이 있다.
- 선언형 패러다임은 작업 그 자체에 초점을 맞추고 예상되는 결과를 얻으려고 노력한다.
- 선언형 패러다임의 종류로는 논리적(Logic), 함수형(Functional), 그리고 데이터베이스(Database) 패러다임이 있다.
Reference
'기술면접 준비' 카테고리의 다른 글
[운영체제] 현대 컴퓨팅은 왜 라운드 로빈을 쓸까?(feat.CPU 스케쥴링 알고리즘 정리) (0) | 2022.04.10 |
---|---|
JPG와 PNG 차이점 (0) | 2022.03.20 |