프로그래밍 패러다임
프로그래밍 패러다임
🔸 명령형 프로그래밍 (Imperative Programming)
- '어떻게 해결해야 하는가'에 집중
- 알고리즘을 명시, 목표는 명시하지 않음
- 하위 패러다임:
- ✅ 절차지향 프로그래밍 (Procedural Programming)
- 물이 위에서 아래로 흐르듯, 순차적인 처리가 중요
- 프로그램 전체가 유기적으로 연결되도록 구성
- 대표 언어: C
- ✅ 객체지향 프로그래밍 (Object-Oriented Programming)
- 컴퓨터 프로그램을 '객체들의 모임'으로 파악
- 대표 언어: C++, C#, Java
🔸 선언형 프로그래밍 (Declarative Programming)
- '무엇을 해결해야 하는가'에 집중
- 목표를 명시, 알고리즘은 명시하지 않음
- 하위 패러다임:
- ✅ 함수형 프로그래밍 (Functional Programming)
함수형 프로그래밍이란?
함수형 프로그래밍(functional programming)은 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다.
출처: https://ko.wikipedia.org/wiki/%ED%95%A8%EC%88%98%ED%98%95_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D
함수형 프로그래밍은 대입문이 없는 프로그래밍이다.
Robert C.Martin (Clean Code 저자)
함수형 프로그래밍의 특징
함수형 프로그래밍의 핵심 개념
🔸 순수 함수 (Pure Function)
- 부수 효과(Side Effect)가 발생하지 않는 함수
- 부수 효과란 다음과 같은 외부 상태 변화를 의미한다:
- 콘솔 또는 파일 I/O
- 예외나 오류 발생 → 프로그램 중단
- 변수나 객체 등의 데이터 변경
🔸 불변성 (Immutability)
- 선언 후 초기화를 제외하고 값을 다시 대입하지 않음
- 한 번 정해진 값은 변하지 않음
- 상태 변경이 필요한 경우, 기존 값을 복사한 새 값을 생성
🔸 1급 객체 (First-Class Object)
- 함수형 프로그래밍에서 함수는 1급 객체
- 1급 객체란, 다음 3가지 조건을 모두 만족하는 객체:
- 변수나 데이터에 담을 수 있다
- 함수의 파라미터로 전달할 수 있다
- 함수의 반환값으로 사용할 수 있다
🔸 참조 투명성 (Referential Transparency)
- 동일한 인자에 대해 항상 동일한 결과를 반환
- 기존 값은 절대 변경되지 않음
- 따라서 식(expression)을 값으로 치환(substitution) 가능
익명 함수(Anonymous function)
말 그대로 이름이 없는 함수이다.
함수 자체가 표현식이기 때문에 함수를 변수에 대입하거나 다른 함수의 매개변수로 사용할 수 있다.
let sum = function(a, b) {
return a + b;
}
console.log(sum(10, 20));
람다식(Lambda Expression)
let sum = function(a, b) {
return a + b;
}
let sum2 = (a, b) => {
return a + b;
}
클로저(Closure)
클로저는 반환된 내부함수가 자신이 선언됐을 때의 환경(Lexical environment)인 스코프를 기억하여, 만일 자신이 선언됐을 때의 환경(스코프) 밖에서 호출되어도 스코프에 접근할 수 있는 함수를 말한다.
function outerFunc() {
let x = 10;
let innerFunc = function () { console.log(x); };
innerFunc();
}
outerFunc();
- 함수 outerFunc 내에서 내부함수 innerFunc가 선언되고 호출되었다.
- 이때 내부함수 innerFunc는 자신을 포함하고 있는 외부함수 outerFunc의 변수 x에 접근할 수 있다.
- 이는 함수 innerFunc가 함수 outerFunc의 내부에 선언되었기 때문이다.
이번에는 내부함수 innerFunc를 함수 outerFunc 내에서 호출하는 것이 아니라 반환하도록 변경해 보자.
function outerFunc() {
let x = 10;
let innerFunc = function () { console.log(x); };
return innerFunc;
}
let inner = outerFunc();
inner();
함수 outerFunc는 내부함수 innerFunc를 반환하고 생을 마감했으므로 outerFunc의 변수 x 또한 더이상 유효하지 않게 되어 변수 x에 접근할 수 있는 방법은 달리 없어 보인다.
그러나 위 코드의 실행 결과는 변수 x의 값인 10이다.
이미 life-cycle이 종료된 함수 outerFunc의 지역변수 x가 다시 부활이라도 한 듯이 동작하고 있다.
이처럼 자신을 포함하고 있는 외부함수보다 내부함수가 더 오래 유지되는 경우, 외부 함수 밖에서 내부함수가 호출되더라도 외부함수의 지역 변수에 접근할 수 있는데 이러한 함수를 클로저(Closure)라고 부르는 것이다.