책소개
좋은 코드엔 프로그래밍 패러다임의 경계가 없다!복잡한 문제를 해결하기 위해 객체지향, 함수형, 명령형을 자유롭게 넘나들며 설계하고 구현하는 법 견고한 코드, 유연한 문제 해결을 위한 멀티패러다임 프로그래밍의 모든 것현대 개발에서는 객체지향, 함수형, 명령형 프로그래밍을 상황에 따라 유연하게 조합하는 역량이 필요하다. 이 책은 세 가지 패러다임의 강점을 통합해 더 유연하고 견고한 소프트웨어를 설계할 수 있도록 실무 중심으로 설명한다. 타입스크립트를 기반으로 반복자와 제너레이터, 리스트 프로세싱, 고차 함수 등 현대 언어의 기능을 폭넓게 활용하며, 프런트엔드와 백엔드 개발에 바로 적용할 수 있는 통찰을 제공한다. 단순히 구현 방법을 알려주는 것에 머무르지 않고 ‘왜 그렇게 구현해야 하는가’를 설명해 개발자의 사고력과 설계 역량을 강화한다. 더 나은 코드와 구조를 고민하는 개발자에게 이 책은 프로그래밍 시야를 확장하고 실무와 이론을 잇는 든든한 길잡이가 될 것이다.
저자소개
마플코퍼레이션의 CTO이자 22년 차 소프트웨어 엔지니어. 카카오와 엔씨소프트 오픈마루팀에서 개발자로 근무했으며 넥슨, 네이버, 카카오 등 국내 주요 IT 기업의 개발자를 대상으로 기술 교육을 진행한 경험이 있다. 타입스크립트, 오브젝티브-C, 자바, Node.js, PostgreSQL, 클로저, 루비 온 레일즈 등 다양한 언어와 기술을 다루며 폭넓은 소프트웨어 개발 노하우를 쌓고 있다. 또한 객체지향 프런트엔드 개발 라이브러리인 rune-ts와 데이터베이스 쿼리 빌더 FxSQL을 직접 개발하고 함수형 라이브러리 FxTS 설계에도 참여하는 등 다양한 오픈소스 프로젝트에 기여했다. 최근에는 소프트웨어 공학을 사랑하는 온라인 커뮤니티 마플개발대학의 교수로 활동하며 지식을 공유하고 있다.
목차
1장 멀티패러다임이 현대 언어를 확장하는 방법1.1 객체지향 디자인 패턴의 반복자 패턴과 일급 함수 __1.1.1 GoF의 반복자 패턴 __1.1.2 ArrayLike로부터 Iterator 생성하기 __1.1.3 ArrayLike를 역순으로 순회하는 이터레이터 만들기 __1.1.4 지연 평가되는 map 함수 __1.1.5 멀티패러다임의 교차점: 반복자 패턴과 일급 함수 1.2 명령형 프로그래밍으로 이터레이터를 만드는 제너레이터 함수 __1.2.1 제너레이터 기본 문법 __1.2.2 제너레이터로 작성한 reverse 함수 1.3 자바스크립트에서 반복자 패턴 사례: 이터레이션 프로토콜 __1.3.1 이터레이터와 이터러블 __1.3.2 언어와 이터러블의 상호작용 __1.3.3 제너레이터로 만든 이터레이터도 이터러블 1.4 이터러블을 다루는 함수형 프로그래밍 __1.4.1 forEach 함수 __1.4.2 map 함수 __1.4.3 filter 함수 __1.4.4 고차 함수 조합하기 __1.4.5 재미난 filter 1.5 이터러블 프로토콜이 상속이 아닌 인터페이스로 설계된 이유 __1.5.1 Web API의 NodeList도 이터러블 __1.5.2 상속이 아닌 인터페이스로 해결해야 하는 이유 __1.5.3 인터페이스와 클래스 상속 1.6 요약 정리 2장 함수형 프로그래밍과 타입 시스템 그리고 LISP2.1 타입 추론과 함수 타입 그리고 제네릭 __2.1.1 타입 추론 __2.1.2 함수 타입과 제네릭 2.2 멀티패러다임 언어에서 함수형 타입 시스템 __2.2.1 이터레이션 프로토콜과 타입 다시 보기 __2.2.2 함수형 고차 함수와 타입 시스템__2.2.3 함수 시그니처와 중첩된 함수들의 타입 추론 2.3 멀티패러다임 언어와 메타프로그래밍 - LISP로부터 __2.3.1 Pipe Operator __2.3.2 클래스와 고차 함수, 반복자, 타입 시스템을 조합하기 __2.3.3 LISP(클로저)에서 배우기 - 코드가 데이터, 데이터가 코드 __2.3.4 클로저에서 map이 실행될 때 __2.3.5 멀티패러다임 언어에서 사용자가 만든 코드이자 클래스를 리스트로 만들기 __2.3.6 LISP의 확장성 - 매크로와 메타프로그래밍__2.3.7 런타임에서 동적으로 기능 확장하기 __2.3.8 언어를 확장하는 즐거움 2.4 요약 정리3장 코드 : 객체 : 함수 = Generator : Iterator : LISP = IP : OOP : FP3.1 코드가 곧 데이터 - 로직이 담긴 리스트 __3.1.1 [for, i++, if, break] - 코드를 리스트로 생각하기 __3.1.2 현대 언어에서 리스트 프로세싱 - 클로저, 코틀린, 스위프트, 스칼라, C#, 자바 __3.1.3 언어를 넘어 적용 가능한 개념, 패러다임 3.2 하스켈로부터 배우기 __3.2.1 하스켈의 함수와 함수 시그니처 __3.2.2 언어 차원에서 지원하는 커링 __3.2.3 main 함수와 IO __3.2.4 head, map, filter, foldl 함수 시그니처 __3.2.5 함수 합성 - . 연산자와 $ 연산자 __3.2.6 sumOfSquaresOfOddNumbers 함수 __3.2.7 파이프라인 스타일 - & __3.2.8 Either를 통한 에러 처리 __3.2.9 패턴 매칭 3.3 지연 평가 자세히 살펴보기 __3.3.1 중첩된 이터레이터의 실행 순서 - 제너레이터로 확인하기 __3.3.2 자세히 살펴보기 __3.3.3 이터레이터로 직접 살펴보기 __3.3.4 단순화해서 살펴보기 3.4 Generator :Iterator :LISP - 지연 평가와 안전한 합성 __3.4.1 find 함수 시그니처 __3.4.2 하스켈에서 find 함수와 안전한 합성 __3.4.3 find 함수로 생각하는 지연 평가와 리스트 프로세싱 __3.4.4 타입스크립트에서의 안전한 합성 __3.4.5 every 함수 __3.4.6 some 함수 __3.4.7 지연 평가에 기반한 break 로직 끼워 넣기 __3.4.8 every와 some 함수의 공통 로직을 함수형으로 추상화하기 __3.4.9 concat으로 더하기 3.5 요약 정리 4장 비동기 프로그래밍4.1 값으로 다루는 비동기__4.1.1 Promise __4.1.2 new Promise( )를 직접 사용해본 적 있는가 __4.1.3 Promise.race __4.1.4 IO 작업에 타임아웃 설정하기 __4.1.5 응답 속도에 따라 다른 전략으로 UI 렌더링하기 __4.1.6 Promise.all __4.1.7 Promise.allSettled __4.1.8 Promise.any 4.2 지연성으로 다루는 비동기 __4.2.1 Promise 실행을 지연하려면 __4.2.2 챗GPT가 명령형으로 구현한 동시성 핸들링 함수 __4.2.3 함수형으로 구현한 동시성 핸들링 함수 __4.2.4 효과적인 비동기 핸들링으로 가는 계단 - 지연성 4.3 타입으로 다루는 비동기 __4.3.1 AsyncIterator, AsyncIterable, AsyncGenerator 프로토콜 __4.3.2 AsyncIterable을 다루는 고차 함수 __4.3.3 동기와 비동기를 동시에 지원하는 함수로 만드는 규약 - toAsync __4.3.4 타입 시스템 + 비동기 함수형 함수 + 클래스4.4 비동기 에러 핸들링 __4.4.1 여러 이미지를 불러와서 높이 구하기 __4.4.2 개선된 비동기 로직 __4.4.3 에러가 제대로 발생되도록 하는 것이 핵심 __4.4.4 안정적인 소프트웨어와 비동기 프로그래밍 4.5 요약 정리 5장 실전 함수형 프로그래밍5.1 실전 데이터 다루기 __5.1.1 2차원 배열에서 숫자 다루기 __5.1.2 농구팀 데이터 다루기 __5.1.3 커머스 데이터 다루기__5.1.4 커머스 데이터 다루기 2 __5.1.5 일관된 접근 방식으로 문제 해결하기 5.2 더 많은 문제에 적용하기 __5.2.1 pipe 함수 __5.2.2 pipe와 비동기 함수 합성 __5.2.3 zip 함수 __5.2.4 인덱스가 값으로 필요할 때 __5.2.5 콜라츠 추측 - 1이 될 때까지 세기 __5.2.6 break를 대신하는 take, takeWhile, takeUntilInclusive __5.2.7 함수의 조합으로 만들어내는 로직 5.3 백엔드 비동기 프로그래밍 __5.3.1 커머스 플랫폼의 결제 프로세스 문제 __5.3.2 결제 내역 동기화 스케줄러 만들기__5.3.3 해시 기반 접근으로 시간 복잡도 최적화__5.3.4 안정적인 비동기 작업 간격 유지__5.3.5 최대 요청 크기 제한을 효과적으로 처리하기__5.3.6 사전 카운트로 효율 높이기__5.3.7 병렬성으로 효율 높이기__5.3.8 리스트 프로세싱 기반 비동기/동시성 프로그래밍5.4 리스트 프로세싱 패턴화__5.4.1 변형-누적 패턴__5.4.2 중첩-변형 패턴__5.4.3 반복자-효과 패턴__5.4.4 필터-중단 패턴__5.4.5 무한-중단 패턴__5.4.6 분할-평탄 패턴__5.4.7 변형-평탄 패턴__5.4.8 결합-누적 패턴__5.4.9 해시-매치 패턴__5.4.10 리스트 프로세싱 함수 유형별 개념 정리5.5 요약 정리6장 멀티패러다임 프로그래밍6.1 HTML 템플릿 엔진 만들기__6.1.1 Tagged Templates__6.1.2 리스트 프로세싱으로 구현하기__6.1.3 push를 concat으로__6.1.4 XSS 공격 방지__6.1.5 중첩 데이터 처리로 컴포넌트 방식 개발 지원하기__6.1.6 구조의 문제는 객체지향으로, 로직의 문제는 함수형으로 해결하기__6.1.7 배열로부터 html 문자열 만들기__6.1.8 객체를 함수형으로 더하기__6.1.9 배열 처리를 클래스 내부로 이동하여 편의성 높이기__6.1.10 고차 함수로 추상화하기__6.1.11 작은 프런트엔드 개발 라이브러리 만들기__6.1.12 멀티패러다임 언어가 제시하는 기회6.2 멀티패러다임을 활용한 동시성 핸들링__6.2.1 executeWithLimit 다시 보기__6.2.2 챗GPT가 명령형으로 구현한 동시성 핸들링 함수__6.2.3 멀티패러다임으로 구현한 동시성 핸들링 함수__6.2.4 동시성(부하) 크기를 동적으로 변경할 수 있도록 확장하기__6.2.5 무한 반복되는 작업의 부하 조절하기__6.2.6 runAllSettled 추가하기6.3 요약 정리7장 객체지향 프런트엔드 개발 그리고 멀티패러다임적 접근과 응용7.1 Setting 앱 만들기 __7.1.1 SwitchView __7.1.2 SettingItemView __7.1.3 SettingListView __7.1.4 SettingPage __7.1.5 전체 토글 기능 추가하기 __7.1.6 객체 간 통신과 커스텀 이벤트 디스패치 __7.1.7 이벤트가 자꾸 루프에 빠지고 부수 효과가 발생하는 이유 __7.1.8 타입 안전한 커스텀 이벤트 통신 패턴 __7.1.9 재사용 가능한 컴포넌트 SwitchView __7.1.10 패러다임이 만드는 리액티브한 코드 7.2 Todo 앱 만들기 __7.2.1 CheckView__7.2.2 추상 클래스와 상속__7.2.3 Headless UI__7.2.4 TodoItemView__7.2.5 계층적 캡슐화를 통한 도메인과 UI 명명 불일치 관리__7.2.6 TodoListView__7.2.7 제네릭 클래스로 추상화__7.2.8 TodoPage__7.2.9 인터페이스에 기반한 객체 간 통신으로 중복 제거하기__7.2.10 GoF의 디자인 패턴 관점으로 보기 - 전략 패턴__7.2.11 일급 함수를 활용한 객체 간 통신 - 콜백 인젝션 패턴__7.2.12 멀티패러다임적인 코드 설계7.3 Todo 앱 만들기 2__7.3.1 데코레이터로 코드를 간결하게__7.3.2 TextSubmitView__7.3.3 ListView에 헬퍼 메서드 추가하기__7.3.4 새로운 Todo 생성하기__7.3.5 SegmentControlView__7.3.6 휴리스틱 기반 Diff로 DOM 업데이트 최적화7.4 Todo 앱 만들기 3__7.4.1 상태 패턴으로 유연하게 만들기__7.4.2 상태 패턴 적용의 이점__7.4.3 런타임에서도 변경 가능한 코드와 소프트웨어 동작__7.4.4 상태 객체로 더 확장하기__7.4.5 멀티패러다임 객체지향 설계7.5 비동기와 UI, Promise와 Class__7.5.1 Promise를 활용한 alert, confirm__7.5.2 값으로서의 Promise, 컴포넌트 간 통신 매개__7.5.3 그룹 채팅에 참여할 친구 선택하기