FPJS | 2. 고계 자바스크립트

Lumpen·2024년 11월 17일
0

지배적인 패러다임은 없다
적절히 필요한 곳에 사용하면 된다

함수형 프로그램은 호출자로부터 데이터를 숨길 필요 없이 소규모 자료형만을 대상으로 움직인다
데이터와 기능을 느슨하게 결합한다
여러 자료형에 두루 적용 가능하고 굵게 나뉜 연산에 더 의존한다
객체 지향은 특정 기능이 구현된 여러 자료형을 논리적으로 연결해서 쓰지만
함수형 프로그래밍은 합성을 통해 자료형에 수행할 연산을 묶는다
두 패러다임을 적절히 사용하면 매우 생산적인 코드가 된다
자바스크립트는 하이브리드 언어기 때문에 둘 다 적용할 수 있다

객체를 관리하는 방법

객체를 명시적으로 전달하면 this 를 사용할 필요가 없으므로 부수효과를 없앨 수 있다

함수형 자바스크립트로 개발할 때에는 상태 변화 관리에 특히 신경써야 한다
불변성을 바탕으로 사고하려면 모든 객체 또한 불변 값으로 취급해야 한다
객체의 변이를 방지하기 위해 캡슐화를 고려해볼 수 있고, 구조가 단순하다면 값 객체 패턴도 좋다
값 객체는 객체의 동등성이 항등성이나 레퍼런스가 아닌 오직 값에 따라 좌우되는 객체를 말한다
date 같은 형식이 값 객체다

메서드를 일부만 호출자에게 공개하고 의사-프라이빗 변수 처럼 다루는 개체 리터럴 인터페이스를 반환하는 식으로 자바스크립트 함수를 이용하면 외부에서 내부 상태 접근을 차단할 수 있다
이러한 변수는 클로저를 이용해서 구현할 수 있다
이렇게 반환된 객체는 변이를 일으키는 메서드가 전혀 없는 기본형처럼 작동한다
toString() 같은 메서드는 순수함수가 아니지만 순수함수처럼 동작하면서
해당 객체를 순수한 문자열로 나타낸다
값 객체는 함수형/객체지향 모두 가볍고 다루기 편하다

사본을 새로 만들어 반환하는 메서드 역시 불변성을 구현하는 또 다른 수단이다
값 객체는 함수형 프로그래밍의 영향을 받은 객체지향 디자인 패턴으로
상호 보완적 관계를 보여주는 실례이다

객체를 동결하는 Object.freeze() 를 사용하여 객체의 writerble 속성을
제어하는 방법도 있다

객체 그래프를 렌즈로 탐색/수정하는 방법도 있다
렌즈는 컴퓨터 과학에서 메모리를 관리하는 전략 중 하나로
데이터 복사 명령을 받아도 원본 주소값을 기록, 원본이 사본인 것 처럼 보여주다가
원본/사본 중 한 쪽이 수정되면 그 때 복사를 한다
복사가 필요한 시점에 하고 그 전까진 존버

함수

함수형 프로그래밍에서 함수는 작업의 기본 단위로
return 이 있을 경우에만 유의미하고 나머지는 부수효과를 낼 수 있다
값을 내는 함수를 표현, 값을 내지 않는 함수를 구문이라고 한다

일급 함수

자바스크립트의 함수는 객체로 일급 시민이라고 한다
모두 Function 형식의 인스턴스다

고차함수

함수를 인수로 전달받거나 함수를 반환하는 함수를 고차함수라고 부른다
자바스크립트의 함수는 일급 + 고차함수이기 때문에 값이나 다름 없다
언젠가는 실행될 값으로 생각할 수 있다
고차함수를 사용하면 선언적 패턴으로 사용하기 쉽고
표현식만 봐도 프로그램이 하는 일을 파악할 수 있다

전역 공유 객체, 객체 콘텍스트 등이 관여하는 this, call 등은 함수형 프로그래밍에서는 사용되지 않는다
하지만 함수 콘텍스트는 꼭 기억해야 한다

클로저와 스코프

자바스크립트 이전에는 클로저가 순수 함수형 프로그래밍으로 작성된 언어에만 존재했다
클로저는 함수를 선언할 당시의 환경에 묶어둔 자료구조다
함수 선언부라는 물리적 위치에 의존하기 떄문에 정적 스코프, 렉시컬 스코프라고도 부른다.
클로저를 사용하면 명확하고 가독성 높은 코드를 작성할 수 있다
고차함수를 응용한 함수형 프로그래밍뿐 아니라 이벤트 처리, 콜백, 프라이빗 변수 모방 등으로 사용할 수 있다

스코프는 일련의 변수 바인딩을 모아 변수가 정의된 코드 영역을 확정하는데
클로저는 함수의 스코프를 상속한 것이다
자신의 부모를 참조한다는 점에서 객체의 메서드가 자신이 상속한 인스턴스 변수에 접근하는 방법과 같다

클로저의 변수는 활성 스코프에 없지만
반환된 함수를 호출하면 여전히 사용할 수 있다
중첩된 함수가 스코프 내의 모든 변수의 스냅샷을 간직하고 있기 때문이다

일반적으로 함수의 클로저는
관여한 모든 함수의 매개변수와 전역 변수를 포함한 바깥 스코프의 모든 변수를 기억한다
클로저가 존재하면 모든 변수들이 참조되고 있어 가비지 컬렉터가 제거 대상으로 삼지 않는다 때문에 메모리 누수를 고려해야 한다

전역 스코프

전역 스코프는 가장 단순하고 가장 나쁘다
전역 스코프에는 스크립트 가장 바깥에 선언된 객체 및 변수가 자리하고
모든 코드가 접근할 수 있다

자바스크립트의 함수 스코프

함수 스코프는 자바스크립트가 선호하는 스코프 방식이다
함수 내부에 선언된 스코프는 해당 함수의 지역 변수이기 때문에
다른 곳에서는 안보이고, 함수가 반환되는 시점에 모두 사라진다

스코프 체인은 프로토타입 체인과 같이
전역 변수까지 탐색하면서 전역 스코프에도 참조하려는 대상이 없으면 undefined 를 반환한다

의사 블록 스코프

es5 표준 자바스크립트는 제어문의 블록 스코프를 지원하지 않는다
catch 블록에 전달된 error 변수는 예외다

클로저의 응용

  • 프라이빗 변수 모방
  • 서버 측 비동기 호출
  • 가상의 블록 스코프 변수 생성

프라이빗 변수 모방

자바스크립트는 접근 제한자가 없지만 클로저를 이용해서 비슷하게 구현할 수 있다
전역 범위의 데이터 공유를 피하기 위해 네임스페이스 관리하는 수단으로도 쓰인다
자바스크립트 라이브러리나 모듈 개발자는 클로저를 적극 활용한다
내부 변수를 캡슐화하면서 전역 레퍼런스 개수를 줄이고 외부에는 딱 필요한 기능만 표출하기 위해 즉시 실행 함수를 사용하는데 이 것을 모듈 패턴이라고 한다

함수형 코드를 잘 캡슐화한 모듈 내부에 넣어두는 편이 좋다
함수형 프로그래밍의 핵심 원리는 모두 모듈 수준으로 변환할 수 있다

모듈의 뼈대는 아래와 같다

var MyModule = (function MyModule(export) {
	let _myPrivateVar = ''; // private 처럼 사용 가능
  	export.method1 = function () {}
  	export.method2 = function () {}
  	return export
}(MyModule || {}))

서버 측 비동기 호출

일급 함수는 다른 함수의 콜백으로 건넬 수 있다
다른 프로그램에 영향을 끼치지 않고 이벤트를 가로채 처리할 때 유용하다

가상의 블록 스코프 변수 생성

forEach() 등의 콜백 함수에서 사용되는 변수를 말하는 것 같다

profile
떠돌이 생활을 하는. 실업자, 부랑 생활을 하는

0개의 댓글