프로그래밍 패러다임
패러다임이란 무엇인가?
- 한 시대의 견해나 사고를 규정하는 양식, 규범, 체계를 통칭하는 말
- 토머스 쿤의 책 ‘과학혁명의 구조’에서 소개한 용어
- 과학 분야의 큰 발전에 따라 이전 믿음이 흔들리고 대체되는 과정을 표현함
- 패러다임 전환의 사례
- 과학: 천동설 → 지동설
- 경제: 저축이 미덕 → 소비가 미덕
- 생활: 둘만 낳아 잘 기르자 → 자녀에게 가장 좋은 선물은 동생입니다.
- 언어: 너무 나쁘다. → 너무 좋다 (’너무’란 말의 의미가 바뀜)
프로그래밍 패러다임의 변화
- 프로그램을 작성하는 전형적인 방식
- 프로그래밍 패러다임의 변화: 주어진 데이터에 어떤 연산을 어떤 순서로 할지 결정하는 것이 중요 → 명령형 프로그래밍 패러다임 등장
- 복잡한 데이터 처리를 위해 데이터 처리 방식 자체를 잘 정리하는 것이 중요 → 절차형 프로그래밍 패러다임 등장
- 데이터가 저장된 메모리를 관리하는 것이 어려운 문제로 대두 → 함수형 프로그래밍 패러다임 등장
- 계산 절차를 문제의 조건을 명시하는 규칙으로 생각
- 논리 프로그래밍 패러다임 등장
- 선언적 프로그래밍 패러다임의 한 종류
- 같은 데이터에 대해 다른 처리 절차를 여러 개 명시해야 하는 경우가 흔히 발생 → 객체지향 프로그래밍 패러다임 등장
프로그래밍 패러다임 변화의 배경
- 응용 도메인의 변화
- 요구사향의 변화
- 계산 분야 → 데이터베이스 관리, 인식 시스템, 임베디드 시스템 등 다양한 응용 분야
- 예) 시뮬레이션을 위해 객체지향 프로그래밍이 등장
- 프로그램 구성 방식
- 문제를 해결하기 위한 프로그램 구성 방식이 다양하게 변화됨
- 명령어의 나열로 인식 → 모듈로 인식
- 큰 문제를 풀기 위해 작은 문제를 풀 때 사용하던 모듈을 조합
- 계산 모델
- 튜링기계 모델 → 새로운 방식의 계산 모델
- 예) 재귀 함수론을 계산 모델로 삼은 함수형 패러다임, 연역 추론을 계산 모델로 삼은 논리 패러다임
프로그래밍 언어 패러다임
- 프로그래밍 패러다임: 프로그램을 작성하는 전반적인 방식
- 프로그래밍 언어 패러다임: 어떤 프로그래밍 패러다임을 해당 프로그래밍 언어가 지원하느냐 하는 것
- 프로그래밍 언어가 특정 패러다임을 지원한다고 해도 그 패러다임으로만 프로그램을 작성해야 한다는 뜻은 아니며 해당 패러다임을 잘 지원한다는 뜻
주요 언어의 프로그래밍 패러다임
명령형 | 절차형 | 함수형 | 논리 | 객체지향 | |
BASIC | o | o | |||
C | o | o | |||
C++ | o | o | o | o | |
Clojure | o | o | |||
Haskell | o | o | o | ||
Java | o | o | o | o | |
JavaScript | o | o | o | o | |
LISP | o | o | |||
Prolog | o | o | |||
Python | o | o | o | o | |
Ruby | o | o | o | o | |
Scala | o | o | o | o | |
Smalltalk | o | o | o | ||
Visual Basic | o | o | o | ||
Visual Prolog | o | o | o |
프로그래밍 패러다임의 양립성
- 새로운 패러다임의 등장으로 이전에 있던 패러다임이 더욱 공고히 완성
- 다양한 프로그래밍 패러다임은 서로 양립할 수 있음
- 주류 프로그래밍 패러다임이 바뀜에 따라 이를 언어가 수용하는 형태로 변화
- Python: 명령형 패러다임, 절차형 패러다임 지원 → 객체지향 패러다임을 포함
여러 패러다임의 프로그램 예
명령형 프로그래밍
- 프로그램을 일련의 명령어 나열로 간주
- 장점: 프로그램을 쉽게 이해할 수 있도록 함
- 단점: 프로그램이 복잡한 경우를 효과적으로 다루지 못함
절차형 프로그래밍
- 프로그램은 서브루틴이라는 절차 집합으로 구성
- 장점: 재귀호출을 사용하여 프로시저를 간단하게 정의할 수 있음
구조화 프로그래밍
- goto 없이 프로그램을 작성하는 방법
- goto 논란
- E. W. 다익스트라의 편지: goto문(당시엔 go to 문)을 이용한 코드가 읽기 어려워 해로움
- D. E. 커누스의 논문: goto를 이용해도 구조화 프로그래밍이 가능
- goto 논란
- 블록과 서브루틴을 이용하며 구조화된 제어문을 사용해야 함
- 현재 우리가 사용하는 대부분의 언어는 블록 구조 언어임
객체지향 프로그래밍
- 프로그램은 서로 통신할 수 있는 객체(obejct)의 집합
- 객체의 개념
- 객체는 상태를 지니고 있으며 외부의 요청에 반응하는 데이터
- 상태는 필드(멤버 변수)로 나타내며, 반응은 메서드(멤버 함수)로 나타냄
- 객체의 상태는 외부에 숨기고 메서드는 외부에 공개함
- 처음으로 클래스 개념을 도입한 언어는 Simula로서 시뮬레이션 언어님
- 객체지향 언어의 절정은 Smalltalk로서 GUI 개발에 큰 획을 그음
- 객체지향 언어는 소프트웨어 재사용을 통해 빠른 개발을 지원함
함수형 프로그래밍
- 프로그램 수행이란 원하는 값을 구하는 것 → 원하는 값은 초깃값에 함수를 반복적으로 적용함으로써 구할 수 있음
- 함수형 언어는 함수 자체를 값으로 취급할 수 있음
- 함수를 다룰 수 있는 함수를 고차함수(higher order function)라고 부름
- 데이터 리터럴을 나타낼 수 있는 것처럼 함수 리터럴도 나타낼 수 있음
- 최신 함수형 언어는 강력한 타입 및 타입 추론을 도입하여 프로그램 안정성을 꾀하고 있음
선언적 프로그래밍과 논리 언어
- 프로그램은 논리식 집합으로 구성
- 논리식의 열거를 통한 선언적 프로그래밍 지원
- 논리식은 명제나 술어로 나타내는데 명제와 달리 술어는 인수를 받을 수 있음
- 최초의 논리 언어인 Prolog는 언어 처리, 인공지능 분야에서 널리 사용됨
- 논리 언어는 1990년대 초 연역적 데이터베이스 시스템에 도입되어 발전되었으나 현재는 사용되지 않음
- 최근에는 제약조건 프로그래밍에 도입되어 다른 패러다임과 합쳐 사용됨
프로그래밍 언어와 프로그래밍 패러다임
- 객체지향 패러다임: 객체 사이의 통신을 통해 계산을 표현
- 함수형 패러다임: 함수의 적용을 통해 계산을 표현
- 논리 패러다임: 논리식의 진위를 증명하는 과정을 통해 계산을 표현
'CS' 카테고리의 다른 글
[프로그래밍 언어론] 구문 분석 (0) | 2023.11.23 |
---|---|
[프로그래밍 언어론] 구문론과 의미론 (1) | 2023.11.22 |
[프로그래밍 언어론] 프로그래밍 언어의 발전 및 동작원리 (0) | 2023.11.22 |
[프로그래밍 언어론] 프로그래밍 언어 소개 (1) | 2023.11.22 |
[컴퓨터과학개론] 자료구조 (1) | 2023.11.19 |