본문 바로가기

Backend/Javascript

[Javascript] - Purity

Purity (순수함)

 

- 함수형 프로그래밍은 함수로 프로그래밍하는 것을 뜻합니다.

 

하지만 조금은 정의가 모호한게, 특정 도메인의 값을 다른 값과 연관짓는 수학적인 함수로 프로그래밍한다는 뜻일 수도 있고 대부분의 프로그래밍 언어가 의미하는 매개변수를 사용하는 소프트웨어 함수로 프로그래밍한다는 뜻일 수도 있습니다.

 

- 순수 함수는 변경을 초래하지 않습니다.

 

순수 함수는 변경에 영향을 받지도 않습니다. 순수 함수의 결과 값은 오직 함수의 입력 값에 의해서만 결정됩니다.

결과를 만드는 것 외엔 다른 어떤 행동도 하지 않습니다. 동일한 입력을 주면 항상 동일한 출력을 냅니다.

(반면 자바스크립트의 17개에 달하는 할당 연산자는 순수함과 거리가 멀어 보입니다)

 

- 순수함의 몇 가지 중요한 가치

 

  • 순수함은 아주 훌륭한 모듈화를 내포하고 있습니다.

순수 함수는 매우 높은 응집도를 보이고 함수의 모든 것은 하나의 결과를 만들어 내기 위해서만 존재합니다.

또한 순수 함수는 약한 결합도를 보입니다. 순수 함수는 오로지 자신의 입력에만 의존합니다.

좋은 모듈을 만드는 것은 어렵지만, 순수함을 쓰면 좋은 모듈화를 덤으로 가져올 수 있습니다.

 

 

  • 순수 함수는 테스트하기도 훨씬 쉽습니다.

순수 함수는 오직 그 인자에만 의존하기 때문에 가짜를 만들거나, 속이거나, 토막 낼 필요가 없습니다.

순수 함수가 입력에 대해서 올바른 출력을 낸다는 것을 한번 확인하면, 그 외의 환경에서 벌어지는 변경들이 순수 함수의 출력 값을 오염시키지 않는다는 사실을 확신할 수 있습니다.

 

 

  • 순수 함수는 구성하기가 아주 좋습니다.

어떤 사이드 이펙트도 없고 외부에 대한 의존성도 없으며 영향도 받지 않기 때문에 순수 함수들을 모아서 더 크고 복잡한 함수를 만들 수 있습니다. 또한 그렇게 만들어진 함수도 순수하고 구성하기 좋은 함수가 됩니다.

 

 

  • 순수 함수는 성능에서도 아주 큰 기여를 하게 될 것입니다.

순수 함수는 스레드에도 영향을 주는 신뢰성과 성능 문제를 해결할 수 있는 훌륭한 방법입니다.

멀티스레드 시스템에서 두 스레드가 같은 메모리 영역에 동시에 접근하려고 하면, race condition 도 신경을 써야하고

mutual exclusion 을 통한 관리, 그럼에도 불구하고 생길 수 있는 지연, deadlock, 심하게는 시스템이 멈추는 상황을 맞이할 수 있습니다.

 

물론 싱글스레드로 돌아가는 자바스크립트에선 멀티스레드에 대한 고민을 하지 않지만, 자바스크립트 코드 내에 객체나 배열에 대한 접근 시 비슷한 고민이 생깁니다.

 

순수 함수는 스레드 안전하며 효과적입니다. 순수 함수는 아무것도 변경하지 않기 때문에 메모리를 공유한다고 해도 아무 문제가 없습니다. 배열의 map 메서드의 경우 순수 함수이기 때문에 배열의 요소들을 사용 가능한 모든 코어에 균등하게 나눠서 처리할 수 있습니다. 그만큼 처리가 빨라지고, 선형적인 성능 향상을 기대할 수 있습니다.

 

- 언어에 순수함을 추가할 순 없습니다.

 

신뢰성이나 보안성처럼, 순수함은 추가할 수 있는 기능이 아닙니다.

신뢰성을 시스템에 추가할 순 없지만 신뢰할 수 없는 것을 없앨 수는 있습니다.

마찬가지로 보안성도 추가는 안되지만, 안전하지 않은 것들을 제거할 뿐입니다.

순수함 또한 추가할 수는 없고 그 대신, 순수하지 않은 것들을 빼야 합니다.

 

- 자바스크립트의 순수하지 않은 부분들

 

  • var 나 let 문을 포함한 할당 연산자를 사용하지 않고, const 를 사용합니다.

const 문을 써서 변수를 초기화하고, 변경되는 일을 막을 수 있습니다.

 

 

  • 객체나 배열을 수정, 변경하는 연산자나 메서드들을 제거해야 합니다.

delete / Object.assign / splice / sort 등이 있습니다.

 

 

  • getter 와 setter 도 없애야 합니다.

setter 는 분명히 변경을 가하는 함수이며, 두 가지 모두 사이드 이펙트를 만들기 위해 존재하는 것입니다.

모든 사이드 이펙트는 제거해야 할 대상입니다.

 

 

  • 정규표현식의 exec 메서드는 lastIndex 속성을 변경하기 때문에 제거해야 합니다.

 

  • 반복문 또한 없애야 합니다.

for 문은 색인 변수를 변경하는 것이 목적이기 때문에 쓰지 않아야 하며, while 이나 do 도 마찬가지 입니다.

꼬리 재귀가 반복을 구현할 수 있는 가장 순수한 방법입니다.

 

 

  • 사용자도 개입되어서는 안 됩니다.

사람과의 상호 작용은 다른 결과를 가져올 수 있습니다.

 

 

  • 네트워크와도 연결되어서는 안 됩니다.

물론 이 중에선, 완벽하게 제거할 수 없는 부분도 있습니다. 함수형 프로그래밍에선 실제 앱에서 완전히 배제할 수 없는

네트워크와 같은 외부 요인은 제거가 아닌 분리를 통해 최대한 순수함을 얻고자 합니다.

객체 또한 변경이 가능한 상태 값을 가지고 있음에도 불구하고 여전히 가치가 있습니다.

객체를 제대로 설계해서 상태 값을 엄격하고 단단하게 관리해야 합니다.

 

- 변경은 순수하지 않지만 궁극적으로 가장 순수한 시스템이라 할지라도 그 속에 비순수함이 있습니다.

 

함수형 시스템은 항상 새로운 활성 객체를 만들고 객체를 가용한 메모리에서 활성화 메모리, 혹은 그 반대로 옮기기에

결국 변경입니다. 그러나 이건 잘못된 것이 아닙니다.

위에서 말한 것처럼 일반적으로 가능한 많은 부분을 순수하게 만들고, 순수하지 않은 부분을 숨기고자 합니다.

 

출처 : 자바스크립트는 왜 그 모양일까?

'Backend > Javascript' 카테고리의 다른 글

[Javascript] - Date  (0) 2021.01.16
[Javascript] - Asynchronous Programming  (0) 2021.01.09
[Javascript] - this  (0) 2020.12.19
[Javascript] - Exception  (0) 2020.12.12
[Javascript] - Generator  (0) 2020.12.05