[CS] 함수형 프로그래밍과 불변성(immutable)
프로그래밍 패러다임은 크게 두가지로 구분된다.
1. 명령형 프로그래밍
- 절차지향, 객체지향 프로그래밍이 여기 속함.
2. 선언형 프로그래밍
- 함수형 프로그래밍
함수형 프로그래밍
순수 함수를 조합하고 소프트웨어를 만드는 방식. ( 클로저, 하스켈, 리스프 )
함수를 타입으로 지정하거나, 인자값으로 넘기거나, 리턴값으로 받을 수 있다. ( 함수를 1급 시민, 1급 객체로 관리 )
=> 마치 함수도 객체처럽 변수나 함수의 인자, 리터럴하게 다룰 수 있다는 것.
대입문을 사용하지 않는 프로그래밍, 작은 문제를 해결하기 위한 함수를 작성한다. -> 변수에 값을 할당하지 않는다
// 1 ~ 10까지의 값이 i에 할당된다
for(int i = 1 ; i < 10; i++){
System.out.println(i);
}
// 함수형 프로그래밍으로 변경.
process(10, print(num));
ex) 첫 번째 인자로 몇까지 iteration을 돌 것인가, 두 번쨰 인자로 전달받은 값을 출력하라는 함수를 매개변수로 받음.
🔑keyword
# 부수효과 # 순수함수 # 1급객체 # 참조투명성
부수효과 (Side Effect)
다음과 같은 변화가 발생하는 작업
- 변수의 값이 변경됨
- 자료 구조를 제자리에서 수정
- 객체의 필드값을 설정
- 예외나 오류가 발생하며 실행 중단
- 콘솔 또는 파일 I/O 발생
순수 함수 (Pure Function)
부수 효과(Side Effect)들을 제거한 함수. 함수형 프로그래밍에서 사용하는 함수는 이런 순수 함수다.
- Memory or I/O 관점에서 Side Effect가 없는 함수
- 함수 실행이 외부에 영향을 끼치지 않는 함수
장점
- 함수 자체가 독립적이며 Side Effect가 없기 때문에 Thread에 안전성을 보장받는다
- 쓰레드에 안전성? 을 어떻게??? 추가 조사 혹은 생각 필요
- Thread에 안정성을 보장받아 병렬 처리를 동기화 없이 진행 가능
1급 객체 (First-class Object)
다음 것들이 가능한 객체
- 변수나 데이터 구조 안에 담을 수 있다.
- 파라미터로 전달 가능
- 반환값으로 사용 가능
- 할당에 사용된 이름과 무관하게 고유 구별 가능
참조 투명성 (Referential Transparency)
- 동일한 인자에 대해 항상 동일한 결과 반환
- 참조 투명성을 통해 기존의 값은 변경되지 않고 유지됨 ( Immutabl Data )
어떤 함수 f에 어떠한 인자 x를 넣고 f를 실행하게 되면, f는 입력된 인자에만 의존하므로 항상 f(x)라는 동일한 결과를 얻는다는 것을 의미한다. 부작용을 제거하여 프로그램의 동작을 이해하고 예측을 용이하게 하는 것
출처:
https://mangkyu.tistory.com/111
[MangKyu's Diary:티스토리]
불변성 ( immutable )
변수에 값을 할당한다는 것은 값의 메모리의 주소를 가리키는 것(참조) 하는 것이다.
let a = 'hello world!'
'hello world!' 가 메모리에 생성되고 a라는 변수가 이 메모리의 주소를 가리키도록 참조한것.
Immutable type
불변 데이터는 한번 생성되고나면 그 뒤에는 변할 수 없음. JavaScript의 원시 타입(primitive type)은 불변이다.
이는 메모리 영역 내에서 변경 불가능하며 변수에 할당할 때 완전히 새로운 값이 만들어져 재 할당된다.
- Boolean
- String
- Number
- Null
- undefined
- Symbol
let name = 'foo';
let newName = name;
name = 'bar';
console.log(newName); //foo
console.log(name); //bar
위 예제에서 name은 'foo'를 가리키고 있다. newName 도 foo를 가르키게 됨.
name = 'bar'을 하면, name은 'bar'를 가르키게 되고 주소값 내에서 값이 변하는게 아니다.
Mutable type
JS에서 Primitive Type을 제외하면 모든 값은 "객체" 타입이며 변할 수 있는 값이다. 객체는 새로운 값이 만들어지지 않고 직접적으로 변경이 가능하다.
let x = {
name: 'junimo'
};
let y = x;
x.name = 'ken';
console.log(y.name); // ken
console.log(x === y) // true
보면 y가 x의 주소값을 할당받았고, x.name으로 해당 주소 값을 변경했기 때문에 y.name도 같은 결과가 나온다.
const 는?
const는 바뀌지 않는 "재할당 불가능"한 값이다. 하지만, 불변은 아니다.
const는 단지 가르키는 주소값을 바꿀 수 없을 뿐이지, 주소에 저장된 값은 변경 가능하다.
[프로그래밍] 함수형 프로그래밍(Functional Programming) 이란?
1. 함수형 프로그래밍(Functional Programming)에 대한 이해 [ 프로그래밍 패러다임(Programming Paradigm) ] 프로그래밍 패러다임(Programming Paradigm)은 프로그래머에게 프로그래밍의 관점을 갖게 하고 코드를
mangkyu.tistory.com
자바스크립트에서 불변성(Immutability)이란
사실 나는 불변성이라는 개념을 자바스크립트 언어 자체를 공부할 때 말고 리액트를 공부하면서 state를 변경할 때 처음 접했었다. 그냥 단순하게 '새로운 값을 할당하지 않으면 리렌더링이 안되
sustainable-dev.tistory.com