사용자 도구

사이트 도구


패러다임

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판이전 판
다음 판
이전 판
패러다임 [2026/04/14 07:49] – 패러다임 sync flyingtext패러다임 [2026/04/14 07:54] (현재) – 패러다임 sync flyingtext
줄 35: 줄 35:
 === 정상 과학과 수수께끼 풀이 === === 정상 과학과 수수께끼 풀이 ===
  
-[[정상 과학]](Normal science)은 [[토머스 쿤]](Thomas S. Kuhn)이 제시한 과학 발전의 단계 중 하나로, 특정 [[패러다임]]이 [[과학자 공동체]]에 의해 보편적으로 수용된 이후 전개되는 안정적이고 누적적인 연구 활동을 의미한다. 이 단계에서 과학자들은 패러다임이 제공하는 이론적 틀과 방법론을 근본적으로 의심하지 않으며, 오히려 이를 토대로 자연의 세부적인 현상을 설명하고 정교화하는 데 주력한다. 쿤은 이러한 정상 과학의 성격을 [[수수께끼 풀이]](puzzle-solving)라는 비유를 통해 설명하였다. 수수께끼는 해답이 존재한다는 확신이 전제되어 있으며, 그 해답에 도달하기 위한 일정한 규칙과 개념적·계기적 도구가 마련되어 있다는 점에서 일반적인 미지의 문제와 구별된다. 정상 과학의 목적은 새로운 패러다임을 창출하거나 근본적인 원리를 비판하는 것이 아니라, 패러다임이 예측한 바를 실제 관찰과 일치시키고 이론의 적용 범위를 확장하는 데 있다.+[[정상 과학]](Normal science)은 [[토머스 쿤]](Thomas S. Kuhn)이 제시한 과학 발전의 단계 중 하나로, 특정 [[패러다임]]이 [[과학자 공동체]]에 의해 보편적으로 수용된 이후 전개되는 지식의 누적적 확장이 이루어지는 안정적인 연구 단계를 의미한다. 이 단계에서 과학자들은 패러다임이 제공하는 이론적 틀과 [[방법론]]을 근본적으로 의심하지 않으며, 오히려 이를 토대로 자연의 세부적인 현상을 설명하고 정교화하는 데 주력한다. 쿤은 이러한 정상 과학의 성격을 [[수수께끼 풀이]](puzzle-solving)라는 비유를 통해 설명하였다. 수수께끼는 패러다임에 의해 해답의 존재가 보증되어 있으며, 그 해답에 도달하기 위한 일정한 규칙과 개념적·도구적 장치가 마련되어 있다는 점에서 일반적인 미지의 문제와 구별된다. 정상 과학의 목적은 새로운 패러다임을 창출하거나 근본적인 원리를 비판하는 것이 아니라, 패러다임의 예측과 관찰된 현상 사이의 부합도를 높이고 이론의 적용 범위를 확장하는 데 있다.
  
-정상 과학 내에서 이루어지는 구체적인 연구 활동은 크게 세 가지 유형으로 분류된다. 첫째는 패러다임이 특히 중요하다고 지목한 사실들을 더욱 정밀하게 측정하고 결정하는 작업이다. 이는 [[천문학]]에서의 별의 위치 측정이나 [[화학]]에서의 원자량 결정과 같이, 기존 체계 내에서 데이터의 정확도를 높이는 활동을 포함한다. 둘째는 관찰된 사실을 패러다임의 이론적 예측과 직접 비교함으로써 이론과 실재 사이의 일치도를 확인하고 강화하는 과정이다. 셋째는 패러다임 자체의 논리적 구조를 정비하거나, 모호한 상수를 결정하고, 새로운 영역으로 이론을 확장하는 이론적 정교화 작업이다. 이러한 활동 과정에서 과학자가 직면하는 난관은 패러다임의 근본적 결함이 아니라 과학자 개인의 독창성이나 기술적 숙련도의 문제로 귀결된다. 수수께끼 풀이에 실패하더라도 과학자들은 패러다임을 폐기하지 않으며, 대신 문제를 해결하지 못한 과학자의 무능함을 탓하는 경향을 보인다((Wray, K. B. (2021). The roles of normal science and puzzles in Kuhn’s theory of scientific development. Synthese, 199, 13417–13434. https://doi.org/10.1007/s11229-021-03152-4+정상 과학 내에서 이루어지는 구체적인 연구 활동은 크게 세 가지 유형으로 분류된다. 첫째는 패러다임에 의해 유의미하다고 결정된 특정 사실들을 더욱 정밀하게 측정하고 결정하는 작업이다. 이는 [[천문학]]에서의 별의 위치 측정이나 [[화학]]에서의 원자량 결정과 같이, 기존 체계 내에서 데이터의 정확도를 높이는 활동을 포함한다. 둘째는 관찰된 사실을 패러다임의 이론적 예측과 직접 비교함으로써 이론과 현상 사이의 일치도를 확인하고 강화하는 과정이다. 셋째는 패러다임 자체의 논리적 구조를 정비하거나, 모호한 상수를 결정하고, 새로운 영역으로 이론을 확장하는 이론적 정교화 작업이다. 이러한 활동 과정에서 과학자가 직면하는 난관은 패러다임의 근본적 결함이 아니라 과학자 개인의 독창성이나 기술적 숙련도의 문제로 귀결된다. 수수께끼 풀이에 실패하더라도 과학자들은 패러다임을 폐기하지 않으며, 대신 문제를 해결하지 못한 과학자의 무능함을 탓하는 경향을 보인다((Wray, K. B. (2021). The roles of normal science and puzzles in Kuhn’s theory of scientific development. Synthese, 199, 13417–13434. https://doi.org/10.1007/s11229-021-03152-4
 )). )).
  
-이러한 수수께끼 풀이 방식의 탐구는 과학 연구에 강력한 지향성과 효율성을 부여한다. 패러다임은 연구자들에게 무엇이 가치 있는 문제인지, 어떠한 도구를 사용하여 데이터를 수집해야 하는지, 그리고 도출된 결과가 어떤 형식을 갖추어야 하는지에 대한 명확한 기준을 제공한다. 과학자 공동체는 패러다임이라는 공통의 인식 틀을 공유함으로써, 기초적인 원리에 대한 소모적인 논쟁에서 벗어나 세부적인 지식의 밀도를 높이는 데 매진할 수 있게 된다. 그러나 이러한 폐쇄성과 보수성은 역설적으로 패러다임과 일치하지 않는 [[변칙 사례]](anomaly)를 더욱 선명하게 부각하는 결과를 낳는다. 정상 과학이 정교해질수록 패러다임의 예측과 어긋나는 현상이 더 민감하게 포착되며, 이는 훗날 패러다임의 [[위기]]와 [[과학 혁명]]으로 이어지는 필수적인 전제 조건이 된다((Andersen, H., & Wagenknecht, S. (2013). Epistemic dependence in collaborative belief formation. Social Epistemology, 27(3-4), 188-214. https://doi.org/10.1080/02691728.2013.794870+이러한 수수께끼 풀이 방식의 탐구는 과학 연구에 강력한 지향성과 전문적 효율성을 부여한다. 패러다임은 연구자들에게 무엇이 가치 있는 문제인지, 어떠한 도구를 사용하여 데이터를 수집해야 하는지, 그리고 도출된 결과가 어떤 형식을 갖추어야 하는지에 대한 명확한 기준을 제공한다. 과학자 공동체는 패러다임이라는 공통의 인식 틀을 공유함으로써, 기초적인 원리에 대한 소모적인 논쟁에서 벗어나 세부적인 지식의 밀도를 높이는 데 매진할 수 있게 된다. 그러나 정상 학의 보수적 은 역설적으로 패러다임과 일치하지 않는 [[변칙 사례]](anomaly)를 더욱 선명하게 부각하는 결과를 낳는다. 정상 과학이 정교해질수록 패러다임의 예측과 어긋나는 현상이 더 민감하게 포착되며, 이는 훗날 패러다임의 [[위기]]와 [[과학 혁명]]으로 이어지는 필수적인 전제 조건이 된다((Andersen, H., & Wagenknecht, S. (2013). Epistemic dependence in collaborative belief formation. Social Epistemology, 27(3-4), 188-214. https://doi.org/10.1080/02691728.2013.794870
 )). )).
  
 === 위기와 변칙 사례의 출현 === === 위기와 변칙 사례의 출현 ===
  
-[[정상 과학]]의 수행 과정은 본질적으로 기존 [[패러다임]]이 제공하는 이론적·방법론적 틀 안에서 문제를 해결하는 ’수수께끼 풀이’의 성격을 띠지만, 모든 관찰 결과가 패러다임의 예측과 일치하는 것은 아니다. 패러다임이 제시한 규칙과 기대를 저버리는 관찰이나 실험 결과가 나타날 때, 이를 [[변칙 사례]](Anomaly)라고 정의한다. 초기 단계에서 과학자들은 이러한 변칙 사례를 측정 장비의 결함, 실험자의 숙련도 부족, 혹은 아직 밝혀지지 않은 부차적인 변수의 간섭으로 치부하며 패러다임 자체의 결함으로 간주하지 않는다. 과학 공동체는 기존의 이론적 정합성을 유지하기 위해 [[보조 가설]]을 도입하거나 수치적 수정을 가함으로써 변칙 사례를 패러다임 내부로 포섭하려는 노력을 지속한다.+[[토머스 쿤]](Thomas Kuhn)이 제시한 [[정상 과학]](Normal Science)의 수행 과정은 본질적으로 기존 [[패러다임]]이 제공하는 이론적·방법론적 틀 안에서 문제를 해결하는 ’수수께끼 풀이(puzzle-solving)’의 성격을 띠지만, 모든 관찰 결과가 패러다임의 예측과 일치하는 것은 아니다. 패러다임이 제시한 규칙과 기대를 저버리는 관찰이나 실험 결과가 나타날 때, 이를 [[변칙 사례]](Anomaly)라고 정의한다. 초기 단계에서 과학자들은 이러한 변칙 사례를 측정 장비의 결함, 실험자의 숙련도 부족, 혹은 아직 밝혀지지 않은 부차적인 변수의 간섭으로 치부하며 패러다임 자체의 결함으로 간주하지 않는다. 과학 공동체는 기존의 이론적 정합성을 유지하기 위해 [[보조 가설]]을 도입하거나 수치적 수정을 가함으로써 변칙 사례를 패러다임 내부로 포섭하려는 노력을 지속한다. 이는 [[칼 포퍼]]가 주장한 [[반증]]에 의한 즉각적인 이론 폐기와는 대조적인 양상을 보인다.
  
-그러나 변칙 사례가 단순히 우연한 예외를 넘어 특정 영역에서 반복적으로 발생하거나, 패러다임의 가장 기초적인 핵심 원리와 정면으로 충돌할 때 과학은 [[위기]](Crisis) 국면에 진입한다. 위기는 기존 패러다임이 더 이상 자연 현상을 설명하거나 예측하는 신뢰할 만한 도구가 되지 못한다는 인식이 확산되면서 시작된다. 이 시기에 이르면 과학자들은 더 이상 수수께끼 풀이에 매진하지 못하, 패러다임의 근본 가정 자체를 의심하기 시작한다. 이는 과학 연구의 효율성을 급격히 저하시키며, 공동체가 공유하던 확고한 신념 체계에 균열을 일으킨다.+그러나 변칙 사례가 단순히 우연한 예외를 넘어 특정 영역에서 반복적으로 발생하거나, 패러다임의 가장 기초적인 핵심 원리와 정면으로 충돌할 때 과학은 [[위기]](Crisis) 국면에 진입한다. 위기는 기존 패러다임이 더 이상 자연 현상을 설명하거나 예측하는 신뢰할 만한 도구가 되지 못한다는 인식이 확산되면서 시작된다. 이 시기에 이르면 과학자들은 더 이상 수수께끼 풀이에 매진하지 못하, 패러다임의 근본 가정 자체를 의심하기 시작한다. 이는 과학 연구의 효율성을 급격히 저하시키며, 공동체가 공유하던 확고한 신념 체계에 균열을 일으킨다. 위기는 단순히 논리적인 부정의 과정을 넘어, 과학 공동체가 겪는 집단적인 심리적 불안 상태를 동반한다.
  
-위기 국면의 두드러진 특징 중 하나는 학문적 혼란과 방법론적 논쟁의 격화이다. 정상 과학 단계에서는 당연하게 받아들여지던 규칙들이 도전받으며, 문제를 해결하기 위해 제시되는 수많은 임시방편적 가설들은 서로 일관성을 갖지 못한 채 파편화된다. [[토머스 쿤]]은 이를 “이례적인 탐구(Extraordinary research)”의 시기라고 불렀다. 이 단계에서 과학자들은 자신의 전공 영역을 넘어 [[인식론]]이나 [[과학 철학]]적 논쟁에 깊이 관여하게 되는데, 이는 패러다임이 제공하던 자동적인 문제 해결 기제가 마비되었음을 의미한다. 례로 [[천동설]]이 지배하던 시기, 행성의 역행 운동을 설명하기 위해 도입된 수많은 [[주전원]]의 복합 체계는 패러다임이 위기에 처했음을 보여주는 전형적인 사례로 꼽힌다.+위기 국면의 두드러진 특징 중 하나는 학문적 혼란과 방법론적 논쟁의 격화이다. 정상 과학 단계에서는 당연하게 받아들여지던 규칙들이 도전받으며, 문제를 해결하기 위해 제시되는 수많은 임시방편적 가설들은 서로 일관성을 갖지 못한 채 파편화된다. 쿤은 그의 저서 『[[과학 혁명의 구조]]』에서 이를 “[[이례적 탐구]](Extraordinary research)”의 시기라고 불렀다. 이 단계에서 과학자들은 자신의 전공 영역을 넘어 [[인식론]]이나 [[과학 철학]]적 논쟁에 깊이 관여하게 되는데, 이는 패러다임이 제공하던 자동적인 문제 해결 기제가 마비되었음을 의미한다. 대표적인 사례로 [[천동설]]이 지배하던 시기, 행성의 역행 운동을 설명하기 위해 도입된 수많은 [[주전원]]의 복합 체계는 패러다임이 위기에 처했음을 보여주는 전형적인 사례로 꼽힌다. [[코페르니쿠스]]의 [[지동설]]이 등장하기 직전의 천문학계는 이처럼 극심한 복잡성과 모순에 직면해 있었다.
  
-결국 위기는 과학 공동체 내부의 긴장감을 극도로 높이며, 기존 체제를 대체할 새로운 대안적 패러다임이 출현할 수 있는 토양을 마련한다. 쿤에 따르면, 위기는 단순히 지식의 오류를 수정하는 과정이 아니라 새로운 이론이 정당성을 얻기 위해 반드시 거쳐야 하는 심리적·사회적 전제 조건이다. 기존 패러다임에 대한 신뢰가 완전히 붕괴되어 공동체가 ’전문가적 실명 상태’에 빠졌을 때 비로소 과학자들은 세계를 바라보는 새로운 틀을 수용할 준비를 갖추게 된다. 따라서 변칙 사례의 누적과 그로 인한 위기는 과학적 진보가 불연속적인 도약을 이루기 위한 필수적인 진통이라 할 수 있다.+결국 위기는 과학 공동체 내부의 긴장감을 극도로 높이며, 기존 체제를 대체할 새로운 대안적 패러다임이 출현할 수 있는 토양을 마련한다. 쿤에 따르면, 위기는 단순히 지식의 오류를 수정하는 과정이 아니라 새로운 이론이 정당성을 얻기 위해 반드시 거쳐야 하는 심리적·사회적 전제 조건이다. 기존 패러다임에 대한 신뢰가 완전히 붕괴되어 공동체가 ’전문가적 실명 상태’에 빠졌을 때 비로소 과학자들은 세계를 바라보는 새로운 틀을 수용할 준비를 갖추게 된다. 따라서 변칙 사례의 누적과 그로 인한 위기는 [[과학 혁명]]을 통해 과학적 진보가 불연속적인 도약을 이루기 위한 필수적인 진통이라 할 수 있다. 이는 과학이 선형적으로 축적되는 지식의 집합이 아니라, 근본적인 [[세계관]]의 전환을 통해 발전한다는 점을 시사한다.
  
 === 과학 혁명과 패러다임 전환 === === 과학 혁명과 패러다임 전환 ===
줄 146: 줄 146:
 === 절차적 프로그래밍 === === 절차적 프로그래밍 ===
  
-문제를 함수나 프로시저 단위로 할하여 순차적으로 해결하는 통적인 접근을 다다.+절차적 프로그래밍(Procedural Programming)은 [[명령형 패러다임]]의 핵심적인 분파로서, 프로그램을 상호작용하는 ’[[프로시저]](Procedure)’들의 집합으로 구성하는 방식이다. 여기서 프로시저란 루틴(Routine), 하위 루틴(Subroutine), 또는 함수(Function)라고도 불리며, 수행해야 할 일련의 계산 과정을 하의 단위로 묶은 것을 의미한다. 이 패러다임은 컴퓨터가 실행해야 할 구체적인 절차를 순차적으로 명시함으로써 특정 [[상태]](State)를 원하는 결과로 변화시키는 데 중점을 둔다. 이는 기계어의 동작 원리와 밀접하게 연관되어 있어 실행 효율이 높으며, 현대적인 [[컴퓨터 과학]]의 방법론적 토대를 마련하였다. 
 + 
 +절차적 프로그래밍의 확립은 1960년대 후반 [[에츠허르 데이크스트라]](Edsger W. Dijkstra)가 제창한 [[구조적 프로그래밍]](Structured Programming) 이론과 궤를 같이한다. 초기 프로그래밍 언어들은 프로그램의 흐름을 임의의 위치로 이동시키는 [[GOTO 문]]을 빈번하게 사용하였으며, 이는 코드의 논리적 구조를 파악하기 어렵게 만드는 ‘[[스파게티 코드]]’ 문제를 야기하였다. 이에 대한 대안으로 등장한 절차적 접근법은 조건문, 반복문, 그리고 프로시저 호출이라는 제어 구조를 통해 프그램의 흐름을 체계화하였다. 이러한 구조화는 코드의 가독성을 비약적으로 높였을 뿐만 아니라, 복잡한 문제를 관리 가능한 수준으로 통제할 수 있게 였다. 
 + 
 +이 패러다임의 핵심적인 설계 전략은 [[하향식 설계]](Top-down design)이다. 이는 시스템의 전체적인 기능을 정의한 뒤, 이를 실현하기 위해 필요한 하위 기능을 순차적으로 분해해 나가는 방식이다. 프로그래머는 거대한 문제를 해결하기 위해 이를 여러 개의 작은 프로시저로 나누고, 각 프로시저는 다시 더 세부적인 단계로 쪼개어 구현한다. 이러한 [[모듈화]](Modularization) 과정을 해 개발자는 특정 기능의 내부 구현 상세를 알지 못하더라도 해당 프로시저의 이름과 [[매개변수]]만을 이용하여 전체 시스템을 구축할 수 있는 [[추상화]](Abstraction)의 혜택을 누리게 된다. 
 + 
 +데이터 관리 측면에서 절차적 프로그래밍은 함수와 데이터가 엄격하게 분리된 구조를 취한다. 데이터는 [[변수]]에 저장되며, 프로시저는 이 변수들을 자로 받아 처리하거나 [[전역 변수]](Global variable)를 통해 상태를 공유한다. 그러나 프로그램의 규모가 방대해지면 여러 프로시저가 동일한 전역 데이터에 접근하고 수정하는 과정에서 예기치 못한 [[부작용]](Side effect)이 발생할 위험이 커진다. 데이터의 변경 주체를 추적하기 어려워지는 문제는 소프트웨어의 유지보수성을 저해하는 주요 원인이 되었으며, 이는 후대 패러임인 [[객체 지향 프로그래밍]]에서 데이터와 기능을 하나로 묶는 [[캡슐화]] 개념이 등장하는 결정적인 계기가 되었다. 
 + 
 +그럼에도 불구하고 절차적 프로그래밍은 여전히 시스템 프로그래밍, [[임베디드 시스템]], 수치 해석 분야에서 강력한 영향력을 발휘하고 있다. [[C 언어]], [[포트란]](FORTRAN), [[알골]](ALGOL)과 같은 언어들은 절차적 패러다임을 충실히 구현하여 하드웨어 자원을 최적으로 제어할 수 있는 수단을 제공한다. 함수 호출 시 발생하는 [[콜 스택]](Call stack)의 생성과 소멸, 매개변수 전달 메커니즘 등은 [[컴퓨터 아키텍처]]의 동작 방식과 논리적으로 일치하기 때문에, 실행 성능이 최우선시되는 영역에서 절차적 프로그래밍은 대체 불가능한 도구로 평가받는다. 결과적으로 절차적 프로그래밍은 문제를 논리적 단계로 분해하여 해결하는 사고방식을 정립함으로써, 현대 소프트웨어 공학의 가장 고전적이면서도 견고한 방법론으로 자리 잡았다.
  
 === 객체 지향 프로그래밍 === === 객체 지향 프로그래밍 ===
  
-데이터와 기능을 객체라는 단위로 묶어 상호작용하게 함으로써 사용성을 이는 방식을 기한다.+객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 프로그램을 단순히 명령어의 순차적인 나열로 파악하는 기존의 [[절차적 프로그래밍]] 방식에서 벗어나, 데이터와 그 데이터를 처리하는 함수를 하나의 논리적 단위인 [[객체]](object)로 묶어 파악하는 패러다임이다. 이 패러다임의 핵심은 현실 세계의 실체나 개념을 [[추상화]](abstraction)하여 소프트웨어 내부의 독립적인 주체로 정의하고, 이들 사이의 상호작용을 통해 전체 시스템을 구축하는 데 있다. 객체 지향 패러다임은 소프트웨어의 규모가 거대해지고 복잡성이 증대됨에 따라 발생하는 [[소프트웨어 위기]]를 극복하고, 코드의 [[재사용성]]과 [[유지보수성]]을 극대화하기 위한 대안으로 발전하였다. 
 + 
 +객체 지향 시스템의 가장 기본적인 구성 요소는 [[클래스]](class)와 객체이다. 클래스는 객체를 생성하기 위한 일종의 설계도 혹은 템플릿이며, 객체는 이 클래스를 바탕으로 메모리에 할당된 실체인 [[인스턴스]](instance)를 의미한다. 국제 표준화 기구(ISO)와 국제 전기 기술 위원회(IEC)의 정보 기술 용어 정의에 따르면, 객체는 데이터와 그 데이터를 처리하는 연산을 결합하여 하나의 개체로 취급하는 소프트웨어 구성 단위를 의미한다((ISO/IEC 2382:2015 - Information technology — Vocabulary, https://committee.iso.org/standard/63598.html 
 +)). 각 객체는 고유한 [[상태]](state)를 나타내는 [[속성]](attribute)과 그 상태를 조작하거나 특정 기능을 수행하는 [[행위]](behavior)를 포함한다. 행위는 대개 [[메서드]](method)라는 형태로 구현되며, 객체 간의 통신은 한 객체가 다른 객체의 메서드를 호출하는 [[메시지 전달]](message passing) 방식을 통해 이루어진다. 이러한 구조는 데이터와 로직이 분리되어 있던 기존 방식과 달리, 데이터와 기능이 밀접하게 결합된 형태를 취함으로써 코드의 [[응집도]]를 높인다. 
 + 
 +객체 지향 패러다임을 지탱하는 네 가지 주요 원칙은 [[캡슐화]](encapsulation), 상속, 다형성, 추상화이다. 캡슐화는 객체의 세부 구현 내용을 외부에 감추고 필요한 인터페이스만을 노출하는 [[정보 은닉]](information hiding)을 실천한다. 이를 통해 외부의 잘못된 접근으로부터 객체의 내부 상태를 보호하고, 내부 구현이 변경되더라도 이를 사용하는 다른 코드에 미치는 영향을 최소화한다. [[상속]](inheritance)은 기존 클래스의 특성을 이어받아 새로운 클래스를 생성하는 메커니즘으로, 코드의 중복을 제거하고 계층적인 구조를 형성하여 체계적인 시스템 설계를 가능하게 한다. 
 + 
 +[[다형성]](polymorphism)은 동일한 인터페이스나 메서드 호출이 객체의 실제 유형에 따라 다르게 동작하는 성질을 의미한다. 이는 [[오버라이딩]](overriding)이나 [[오버로딩]](overloading)을 통해 구현되며, 프로그램의 유연성과 확장성을 크게 향상시킨다. 마지막으로 추상화는 복잡한 현실의 문제를 핵심적인 특징 위주로 단순화하여 모델링하는 과정이다. 이러한 원칙들은 객체 지향 프로그래밍이 대규모 소프트웨어 개발에서 [[모듈화]](modularity)를 실현하는 강력한 도구가 되게 한다. 결과적으로 객체 지향 패러다임은 독립적인 객체들의 협력을 통해 능을 수행하게 함으로써, 부품을 조립하듯 소프트웨어를 구성할 수 있는 토대를 제공한다.
  
 ==== 선언형 패러다임 ==== ==== 선언형 패러다임 ====
줄 164: 줄 179:
 === 함수형 프로그래밍 === === 함수형 프로그래밍 ===
  
-수학적 함수의 계산을 통해 상태 변화를 최소화하고 부작용을 지하는 발 방법을 설명한다.+함수형 프로그래밍(Functional Programming)은 [[수학]]적 함수의 계산을 기반으로 프로그램을 구성하는 [[선언형 패러다임]]의 한 갈래이다. 이 패러다임은 1930년대 [[알론조 처치]](Alonzo Church)가 정립한 [[람다 대수]](Lambda Calculus)에 그 이론적 뿌리를 두고 있으며, 계산 과정을 상태의 변화가 아닌 함수의 적용과 합성으로 이해한다. 함수형 프로그래밍의 핵심적 동기는 프로그램의 동작을 예측 가능하게 만들고, 복잡한 상태 관리에서 기인하는 오류를 원천적으로 방지하는 데 있다. 
 + 
 +전통적인 [[명령형 패러다임]]이 컴퓨터의 메모리 상태를 변경하는 명령들의 순차적 실행에 집중한다면, 함수형 프로그래밍은 데이터의 변형 과정을 추상된 함수의 연결로 표현한다. 이러한 접근 방식은 [[존 배커스]](John Backus)가 지적했듯이, 변수 할당과 상태 전이에 의존하는 [[폰 노이만 구조]]의 한계를 극복하고 프로그램의 논리적 구조를 더욱 명확히 드러내는 효과를 가진다((Can programming be liberated from the von Neumann style?: a functional style and its algebra of programs, https://dl.acm.org/doi/10.1145/359576.359579 
 +)). 람다 대수에서 함수는 다음과 같이 추상화된 형태로 정의될 수 있다. 
 + 
 +$$ f = \lambda x. x + 1 $$ 
 + 
 +위 식에서 함수 $ f $는 입력 $ x $를 받아 $ x + 1 $을 반환하는 순수한 계산 규칙만을 명시한다. 이처럼 함수형 프로그래밍의 가장 중추적인 개념은 [[순수 함수]](Pure Function)이다. 순수 함수는 동일한 입력에 대하여 항상 동일한 출력을 보장하며, 함수 외의 상태를 수정하거나 입출력 장치와 상호작용하는 등의 [[부작용]](Side Effect)을 일으키지 않는다. 이러한 성질은 [[참조 투명성]](Referential Transparency)을 확보게 하며, 프로그램 내의 어떤 함수 호출 표현식을 그 결과값으로 치환하더라도 전체적인 동작이 변하지 않음을 보장한다. 
 + 
 +또한 함수형 패러다임은 [[불변성]](Immutability)을 원칙으로 삼다. 한 번 생성된 데이터 구조는 결코 수정되지 않으며, 상태를 변경해야 할 필요가 있을 때는 기존 데이터를 수정하는 대신 새로운 데이터를 생성하여 반환하는 방식을 취한다. 이러한 불변 데이터 모델은 다중 스레드 환경에서 생하기 쉬운 [[경쟁 상태]](Race Condition)를 근본적으로 차단하며, [[병렬 컴퓨팅]]의 복잡성을 획기적으로 낮추는 기반이 된다. 
 + 
 +함수형 프로그래밍에서 함수는 [[일급 객체]](First-class Object)로 취급된다. 이는 함수가 숫자나 문자열과 같은 일반적인 데이터와 동등한 지위를 가짐을 의미하며, 함수를 변수에 할당하거나 다른 함수의 인자로 전달하고, 함수의 결과값으로 또 다른 함수를 반환하는 것이 가능하다. 이러한 특성을 바탕으로 하나 이상의 함수를 다루는 [[고차 함수]](Higher-order Function)를 활용할 수 있다. 대표적인 고차 함수로는 컬렉션의 각 요소에 함수를 적용하는 [[맵]](Map), 조건에 맞는 요소만을 선별하는 [[필터]](Filter), 요소들을 하나의 값으로 축약하는 [[리듀스]](Reduce) 등이 있다. 
 + 
 +함수 간의 결합은 함수 합성(Function Composition)을 통해 이루어진다. 두 함수 $ f $와 $ g $가 존재할 때, 이들의 합성은 다음과 같이 정의된다. 
 + 
 +$$ (f \circ g)(x) = f(g(x)) $$ 
 + 
 +이러한 합성 식은 작은 기능을 수행하는 함수들을 조립하여 복잡한 로직을 구축하는 [[데이터 추상화]]의 강력한 도구가 된다. 이 외에도 계산이 실제로 필요한 시점까지 연산을 늦추는 [[지연 평가]](Lazy Evaluation) 기법을 통해 무한 크기의 자료구조를 효율적으로 처리하거나 연산 자원을 최적화할 수 있다. 
 + 
 +현대 소프트웨어 공학에서 함수형 프로그래밍은 [[LISP]]나 [[하스켈]](Haskell)과 같은 순수 함수형 언어를 넘어, [[자바스크립트]], [[파이썬]], [[자바]] 등 주류 다중 패러다임 언어들에 깊숙이 통합되었다. 이는 대규모 분산 시스템과 동시성 제어가 중요해진 현대 컴퓨팅 환경에서 함수형 패러다임이 제공하는 불변성과 순수성이 코드의 안정성과 유지보수성을 높이는 핵심적인 해결책으로 인정받았기 때문이다.
  
 === 논리 프로그래밍 === === 논리 프로그래밍 ===
  
-기호 논리학에 근하여 사실과 규칙을 의하고 추론 엔진을 통해 해답을 찾는 식을 기한다.+논리 프로그래밍(Logic Programming)은 [[수리 논리학]](Mathematical Logic)의 형식을 차용하여 프로그램의 논리적 구조를 명시하고, 이를 기반으로 [[컴퓨터]]가 정답을 도출하도록 하는 [[선언형 패러다임]]의 한 갈래이다. 이 패러다임은 프로그래머가 문제 해결을 위한 세부적인 절차(How)를 일일이 명령하는 대신, 문제의 대상이 되는 개체 간의 관계와 규칙(What)을 논리식으로 기술하면 [[추론 엔진]](Inference Engine)이 이를 해석하여 결과를 산출하는 방식을 취한다. 이러한 접근법은 1970년대 초반 [[로버트 코왈스키]](Robert Kowalski)의 이론적 정립과 [[알랭 콜메로]](Alain Colmerauer)의 [[프롤로그]](Prolog) 언어 개발을 통해 구체화되었다. 
 + 
 +논리 프로그래밍의 철학적 간은 로버트 코왈스키가 제시한 “알고리즘은 논리와 제어의 결합이다”라는 명제로 요약된다. 이를 수식으로 표현면 다음과 같다. 
 + 
 +$$ \text{Algorithm} = \text{Logic} + \text{Control} $$ 
 + 
 +기서 [[논리]](Logic)는 해결해야 할 문제의 정의와 지식을 의미하며, [[제어]](Control)는 해당 논리를 용하여 문제를 해결하는 전략을 의미한다. 논리 프로그래밍 패러다임에서 프로그래머는 오직 논리 부분만을 담당하며, 제어 부분은 시스템에 내장된 [[추론]] 메커니즘에 위임한다. 이는 개발자가 하드웨어의 상태 변화나 [[메모리]] 관리와 같은 저수준의 행 절차로부터 해방되어 문제의 본질적인 논리에 집중할 수 있게 한다((Kowalski, R., Algorithm = Logic + Control, Communications of the ACM, https://dl.acm.org/doi/10.1145/359131.359136 
 +)). 
 + 
 +논리 프로그램의 구성 요소는 크게 [[사실]](Fact), [[규칙]](Rule), [[질의]](Query)로 나뉜다. 사실은 “소크라테스는 사람이다”와 같이 무조건적으로 참인 명제를 기술하며, 규칙은 “모든 사람은 죽는다”와 같이 조건부 참을 나타내는 명제이다. 이러한 지식은 주로 [[1차 술어 논리]](First-order Predicate Logic)의 부분 집합인 [[호른 절]](Horn Clause) 형식을 빌려 표현된다. 일반적인 호른 절은 다음과 같이 나의 결론(Head)과 여러 개의 조건(Body)으로 이루어진다. 
 + 
 +$ A B_1, B_2, , B_n $ 
 + 
 +위 식에서 $ A $가 참이 되기 위해서는 모든 $ B_i $가 참이어야 함을 의미한다. 만약 조건부가 비어 있다면 이는 단순한 사실이 된다. 사용자가 특정 목적을 달성하기 위해 시스템에 질의를 던지면, 추론 엔진은 기 구축된 사실과 규칙의 집합인 [[지식 베이스]](Knowledge Base)를 탐색하여 해답을 찾는다. 
 + 
 +추론 엔진이 해답을 찾아가는 과정의 핵심은 [[단일화]](Unification)와 [[해소 원리]](Resolution principle)에 있다. 단일화는 서로 다른 두 논리의 변수들에 적절한 값을 대입하여 두 식을 일치시키는 과정이다. 시스템은 [[SLD 해소]](Selective Linear Definite clause resolution)라 불리는 자동 추론 법을 사용하여 질의로부터 역방향으로 추론을 진행다((Colmerauer, A., & Roussel, P., The birth of Prolog, ACM SIGPLAN Notices, https://dl.acm.org/doi/10.1145/232629.232646 
 +)). 이 과정에서 여러 선택지가 존재할 경우 [[백트래킹]](Backtracking)을 통해 가능한 모든 경로를 탐색하며, 이는 논리 프로그래밍이 비결정론적 계산 모델을 자연스럽게 지원하게 만드는 원동력이 된다. 
 + 
 +논리 프로그래밍은 [[기호 논리학]]에 기반한 강력한 표현력 덕분에 [[인공지능]], [[전문가 시스템]], [[자연어 처리]], [[데이터베이스]] 질의 언어 등 복잡한 지식 구조를 다루는 분야에서 널리 활용되어 왔다. 특히 [[지식 표현]]의 명확성과 코드의 간결함은 복잡한 제약 조건 만족 문제(Constraint Satisfaction Problem)를 해결하는 데 탁월한 효율성을 보여준다. 그러나 순수 논리 모델과 실제 컴퓨팅 환경 사이의 간극으로 인해 발생하는 효율성 저하와 [[부정]](Negation)의 처리 문제 등은 현대 논리 프로그래밍 연구의 주요 과제로 남아 있다.
  
 ===== 사회 과학에서의 패러다임 ===== ===== 사회 과학에서의 패러다임 =====
패러다임.1776120586.txt.gz · 마지막으로 수정됨: 저자 flyingtext