functional programming

eesope·2024년 11월 18일

programming paradigm

목록 보기
3/3

TLDR;

  1. 모듈: 코드를 정리하는 상자.

    • Math.add 3 5처럼 모듈 이름을 통해 함수나 값을 사용.
  2. 모듈 타입: 모듈의 메뉴판.

    • 어떤 함수와 값이 제공되는지 보여줌.
  3. 추상 타입: 내부 구조를 숨기는 상자.

    • type t로 내부를 감추고, 정해진 함수만 사용하게 강제.
  4. 펑터: 모듈을 받아 새로운 모듈을 만드는 함수.

    • Set.Make(String)처럼 키 타입을 지정해 집합이나 맵 생성.

OCaml의 모듈 관련 개념

1. 모듈 (Module)

모듈은 OCaml에서 코드와 데이터를 묶는 "상자"입니다. 파일 단위로 분리하거나 코드를 조직적으로 관리할 때 사용합니다.

  • 역할: 코드를 논리적으로 분리하고, 재사용성을 높입니다.
  • 예시:
module Math = struct
  let add x y = x + y
  let square x = x * x
end

(* 사용법 *)
let result = Math.add 3 5  (* result = 8 *)
let square_result = Math.square 4  (* square_result = 16 *)

2. 모듈 타입 (Module Type)

모듈의 인터페이스를 정의합니다. 모듈 타입은 어떤 함수와 값을 외부에 공개할지 결정합니다.

  • 역할: 외부에서 접근 가능한 요소를 제한하고, 모듈의 구조를 명확히 합니다.
  • 예시:
module type MathSig = sig
  val add : int -> int -> int
  val square : int -> int
end

module Math : MathSig = struct
  let add x y = x + y
  let square x = x * x
end
  • Math는 MathSig라는 모듈 타입에 맞춰 작성된 모듈입니다.

3. 추상 타입 (Abstract Type)

모듈 타입에서 구체적인 타입 구현을 숨기는 방식입니다. 사용자에게 타입이 어떤 구조인지 감추고, 제공된 함수만 사용하도록 강제합니다.

  • 역할: 캡슐화 및 구현 세부사항 보호.
  • 예시:
module type CounterSig = sig
  type t
  val create : unit -> t
  val increment : t -> t
  val value : t -> int
end

module Counter : CounterSig = struct
  type t = int
  let create () = 0
  let increment x = x + 1
  let value x = x
end
  • CounterSig는 t 타입의 내부 구조를 감춥니다. 외부에서는 Counter.create와 같은 함수만 사용 가능합니다.

4. 펑터 (Functor)

펑터는 모듈을 입력으로 받아 새로운 모듈을 생성하는 함수입니다. 예를 들어, Map.Make는 특정 키 타입을 입력으로 받아 Map 모듈을 생성하는 펑터입니다.

  • 역할: 모듈의 일반화된 구현을 제공.
  • 예시:
module StringSet = Set.Make(String)

(* StringSet 사용 *)
let my_set = StringSet.empty
let my_set = StringSet.add "hello" my_set
let is_member = StringSet.mem "hello" my_set  (* true *)
  • Set.Make는 문자열(String)을 키로 사용하는 집합을 생성합니다.

—
이 문장은 OCaml에서 함수형 프로그래밍(Functional Programming)에만 집중하도록 요구하고 있으며, 명령형(imperative) 또는 객체지향(object-oriented) 프로그래밍 기법을 사용하지 말라는 의미입니다. 참조 타입이나 가변 데이터 구조, 그리고 for나 while 같은 반복문을 사용하지 않고 함수와 불변(immutable) 데이터 구조를 통해 문제를 해결하라는 지침입니다.

  • 불변성: 데이터가 생성된 이후에는 변경되지 않으며, 기존 데이터를 수정하지 않고 새로운 데이터를 생성하여 반환합니다.
  • 함수 중심: 함수를 값처럼 취급하고, 함수를 인수로 넘기거나 반환할 수 있습니다. 이처럼 고차 함수와 일급 함수의 개념을 적극 활용하여 함수를 조합하고 재사용하는 데 집중합니다.
  • 순수 함수: 동일한 입력에 대해 항상 같은 결과를 반환하며, 외부 상태에 의존하지 않는 순수 함수를 작성하는 것이 핵심입니다.
  • 재귀: 반복문 대신 재귀를 통해 반복 작업을 수행합니다.

함수형 프로그래밍에서는 이러한 특성들을 통해 프로그램의 상태 변화를 최소화하고, 코드의 가독성과 유지보수성을 높일 수 있습니다.

명령형 프로그래밍 (Imperative Programming) 개념

  • 순서 중심: 명령문을 순차적으로 실행하며, 코드의 실행 흐름이 프로그램의 상태를 변경합니다.
  • 변경 가능한 변수: 상태를 변경하기 위해 변수를 선언하고, 반복문이나 조건문을 통해 값을 업데이트합니다.

명령형 프로그래밍은 코드가 변경되는 과정을 따라가야 하므로, 코드의 흐름이 복잡해질 수 있습니다.

profile
go simple 🧑🏻‍💻

0개의 댓글