Skip to content

dhyun2(2주차): 함수형 프로그래밍과 타입시스템 그리고 LISP #11

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 18, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
# 2. 함수형 프로그래밍과 타입 시스템 그리고 LISP

이번 챕터의 전반부는 타입스크립트 개념과 문법을 설명하고, 이터레이터기반 함수형 라이브러리를 만들때 타입스크립트를 어떻게 적용하면 좋을지 설명합니다.

후반부에서는 LISP를 소개하며, 메타프로그래밍에 대한 관점과 이터레이터를 통해 만든 함수형 라이브러리들의 구현 방법을 소개하며, 멀티패러다임 프로그래밍의 실 적용 사례를 보여줍니다.

## 주요 내용

es6에서 이터레이터가 표준화되며, js에서도 멀티패러다임이 크게 진화됨

## JavaScript의 멀티 패러다임 진화 과정

JavaScript의 멀티 패러다임 진화는 크게 세 단계로 나눌 수 있습니다.

### 1. ES5 (2009) - 함수형 프로그래밍의 시작

ES5에서 가장 중요한 변화는 일급 함수(First-class Function)의 도입이었습니다. 이는 함수를 변수에 할당하고, 다른 함수의 인자로 전달하고, 함수의 반환값으로 사용할 수 있게 되었다는 의미입니다. 이로 인해 `map`, `reduce`, `filter`와 같은 고차 함수를 사용할 수 있게 되었고, 함수형 프로그래밍의 기초가 마련되었습니다.

```javascript
// 함수형 프로그래밍의 시작
var numbers = [1, 2, 3, 4, 5];
var sum = numbers.reduce(function (acc, curr) {
return acc + curr;
}, 0);
```

### 2. ES6 (2015) - 패러다임의 통합

ES6는 JavaScript의 혁명적인 변화를 가져왔습니다. 클래스 문법의 도입으로 객체지향 프로그래밍이 더욱 자연스러워졌고, 이터레이터 프로토콜과 제네레이터의 도입으로 함수형 프로그래밍이 한 단계 더 발전했습니다.

특히 이터레이터 프로토콜은 데이터 구조를 순회하는 표준화된 방법을 제공하여, 서로 다른 패러다임 간의 자연스러운 통합을 가능하게 했습니다. 제네레이터는 지연 평가(lazy evaluation)를 구현할 수 있게 해주어, 대용량 데이터 처리나 무한 시퀀스 처리에 큰 도움이 되었습니다.

```javascript
// 이터레이터와 제네레이터의 결합
class NumberSequence {
*[Symbol.iterator]() {
yield 1;
yield 2;
yield 3;
}
}
```

### 3. 최신 JavaScript - 완전한 통합

최신 JavaScript에서는 이러한 패러다임들이 완전히 통합되었습니다. 클래스와 함수형 프로그래밍이 자연스럽게 결합되어, 각 패러다임의 장점을 선택적으로 활용할 수 있게 되었습니다.

예를 들어, `DataProcessor` 클래스는 객체지향적인 구조를 가지면서도, 내부적으로 함수형 메서드들을 제공합니다. 이는 코드의 구조화와 재사용성을 모두 높이는 결과를 가져왔습니다.

```javascript
class DataProcessor {
constructor(data) {
this.data = data;
}

// 함수형 메서드
map(fn) {
return new DataProcessor(this.data.map(fn));
}

// 이터레이터 구현
*[Symbol.iterator]() {
yield* this.data;
}
}
```

## 멀티 패러다임의 장점

1. **유연한 문제 해결**

- 각 패러다임의 장점을 선택적으로 활용 가능
- 문제의 특성에 맞는 최적의 접근 방식 선택 가능
- 코드의 가독성과 유지보수성 향상

2. **성능 최적화**

- 지연 평가를 통한 메모리 효율성
- 이터레이터를 통한 대용량 데이터 처리
- 비동기 처리와의 자연스러운 통합

3. **확장성과 재사용성**
- 함수형 유틸리티의 재사용
- 객체지향적인 구조화
- 인터페이스 기반의 설계

이러한 진화를 통해 JavaScript는 단순한 웹 스크립트 언어에서 현대적인 멀티 패러다임 프로그래밍 언어로 성장했습니다. 각 패러다임의 장점을 선택적으로 활용할 수 있게 되면서, 더욱 강력하고 유연한 애플리케이션 개발이 가능해졌습니다.