함수형 프로그래밍

jeong_hyeok·2025년 7월 23일

프로그래밍 패러다임

프로그래밍 패러다임

🔸 명령형 프로그래밍 (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가지 조건을 모두 만족하는 객체:
    1. 변수나 데이터에 담을 수 있다
    2. 함수의 파라미터로 전달할 수 있다
    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(); // 10
  • 함수 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(); // 10

함수 outerFunc는 내부함수 innerFunc를 반환하고 생을 마감했으므로 outerFunc의 변수 x 또한 더이상 유효하지 않게 되어 변수 x에 접근할 수 있는 방법은 달리 없어 보인다.

그러나 위 코드의 실행 결과는 변수 x의 값인 10이다.

이미 life-cycle이 종료된 함수 outerFunc의 지역변수 x가 다시 부활이라도 한 듯이 동작하고 있다.

이처럼 자신을 포함하고 있는 외부함수보다 내부함수가 더 오래 유지되는 경우, 외부 함수 밖에서 내부함수가 호출되더라도 외부함수의 지역 변수에 접근할 수 있는데 이러한 함수를 클로저(Closure)라고 부르는 것이다.

0개의 댓글