- 순수함수: 어떤 외부상태에 의존하지도 않고 변경하지도 않는, 부수효과가 없는 함수
- 비순수함수: 외부상태에 의존하거나 외부상태를 변경하는, 부수효과가 있는 함수
자바스크립트는 주로 객체지향 프로그래밍과 함수형 프로그래밍으로 나뉘는데 객체가 기본이 되는 프로그래밍을 객체지향 프로그래밍이라고 하고, 함수형 프로그래밍은 말 그대로 함수가 기본이 되는 프로그래밍을 의미합니다.
함수형 프로그래밍은 프로그래밍 패러다임 중 하나로, 순수 함수와 불변성을 강조하며, 프로그램의 상태 변경을 최소화하는 것을 목표로 합니다. 함수형 프로그래밍은 수학적 함수의 개념에 기반을 두고 있으며, 이를 통해 코드의 간결성, 모듈성 및 예측 가능성을 높일 수 있습니다.
순수 함수는 어떤 외부 상태에 의존하지도 않고 변경하지도 않는, 즉 부수 효과가 없는 함수를 의미합니다.
비순수 함수는 외부 상태에 의존하거나 외부 상태를 변경하는, 즉 부수 효과가 있는 함수를 의미합니다.
부수효과(Side Effect)란 다음과 같은 변화 또는 변화가 발생하는 작업을 의미한다.
- 변수의 값이 변경
- 자료 구조를 제자리에서 수정
- 객체의 필드값을 설정
- 예외나 오류가 발생하며 실행이 중단
- 콘솔 또는 파일 I/O가 발생
순수 함수(Pure Function)는 입력값에 대해 항상 동일한 결과를 반환하며, 함수 내부에서 외부 상태를 변경하지 않는 함수를 말합니다.
- 동일한 입력에 대해 항상 같은 출력을 반환합니다.
- 함수 내부에서 외부 상태를 변경하지 않으며, 오로지 입력값에만 의존합니다.
- 부작용(side effect)이 없습니다. 즉, 함수의 실행이 프로그램의 상태를 변경하지 않습니다.
|
// 순수함수 (Pure Functions)
let count = 0;
function increase(number){
return ++number;
}
function decrease(number){
return --number;
}
// 순수 함수의 첫번쨰 특징은 함수의 외부 상태를 변경하지 않는 것이다.
console.log(`count = ${count}`);
console.log(`increase(${count}) 호출 = ${increase(count)}`);
console.log(`count = ${count}`);
console.log(`decrease(${count}) 호출 = ${decrease(count)}`);
console.log(`count = ${count}`);
console.log();
// 순수 함수의 두번쨰 특징은 동일한 인수가 전달되면 언제나 동일한 값을 반환한다.
console.log(`increase(${11}) 호출 = ${increase(11)}`);
count=11;
console.log(`increase(${count}) 호출 = ${increase(count)}`);
|
순수 함수는 상태를 변경하지 않기 때문에 여러 스레드나 프로세스에서 동시에 호출해도 안전하고, 같은 입력에 대해 항상 같은 결과를 보장하기 때문에 디버깅과 테스트도 용이합니다. 또한, 순수 함수는 입력과 출력 사이의 매핑이 명확하기 때문에 추론이나 최적화가 용이합니다.
비순수 함수(Impure Function)는 외부 상태를 변경하거나, 예측 불가능한 결과를 반환하는 함수입니다. 외부 상태를 변경하는 함수는 다른 부분에 영향을 미치기 때문에, 프로그램의 동작을 예측하기 어렵습니다. 또한 같은 입력에 대해 항상 같은 결과를 반환하지 않으므로, 디버깅하기도 어렵습니다.
|
// 비 순수 함수
let x = 10;
function increment() {
x++;
}
function decrement() {
x--;
}
console.log(`x = ${x}`);
increment();
console.log(`increment() 호출!! `);
console.log(`x = ${x}`);
increment();
console.log(`increment() 호출!! `);
console.log(`x = ${x}`);
decrement();
console.log(`decrement() 호출!! `);
console.log(`x = ${x}`);
decrement();
console.log(`decrement() 호출!! `);
console.log(`x = ${x}`);
|
위 예제에서 increment 함수는 외부 상태인 변수 x의 값을 변경하므로 순수 함수의 조건을 만족하지 않습니다. 즉, 같은 입력값에 대해서 항상 같은 출력값을 반환하지 않으며, 함수 실행 후 외부 상태가 변경됩니다. 따라서, increment 함수는 비순수 함수입니다.
비순수 함수는 순수 함수보다 프로그램의 동작을 추론하고 디버깅하기가 어렵습니다. 예를 들어, increment 함수를 호출하는 다른 코드에서는 x의 값이 변할 수 있기 때문에 예측이 어렵습니다.
이러한 이유로 함수형 프로그래밍에서는 부작용을 최소화하는 방식으로 프로그래밍을 하기 위해 순수 함수를 사용합니다.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>순수 함수 & 비 순수 함수</title>
<script>
/*
순수함수 (Pure Functions)
특징
동일한 입력에 대해 항상 동일한 출력을 반환하고, 외부 상태를 변경하지 않으며, 부작용이 없음
일반적으로 값을 구해오거나 데이터 값을 출력하기만 하는 작업에 사용
✅ 참조 투명성 (Referential Transparency) : 함수가 함수 외부의 영향을 받지 않는 것으로, 동일한 입력에 대해 항상 동일한 출력을 반환
✅ 부작용 없음 (No Side Effect) : 내부에서 외부 상태를 변경하지 않음
✅ 상태 독립성 (State Independence) : 외부 상태나 전역 변수를 참조하지 않음
비순수함수(Impure Fuctions)
특징
클래스의 멤버나 상태를 자유롭게 변경할 수 있음
✅ 부작용 존재 (Side Effects) : 외부 상태를 변경하거나, 전역 변수를 참조 및 수정
✅ 상태 의존성 (State Dependency) : 함수의 동작이 외부 상태나 전역 변수에 의해 영향을 받음
*/
// 순수함수 (Pure Functions)
let count = 0;
function increase(number) {
return ++number;
}
function decrease(number) {
return --number;
}
// 순수 함수의 첫번쨰 특징은 함수의 외부 상태를 변경하지 않는 것이다.
console.log(`count = ${count}`);
console.log(`increase(${count}) 호출 = ${increase(count)}`);
console.log(`count = ${count}`);
console.log(`decrease(${count}) 호출 = ${decrease(count)}`);
console.log(`count = ${count}`);
console.log();
// 순수 함수의 두번쨰 특징은 동일한 인수가 전달되면 언제나 동일한 값을 반환한다.
console.log(`increase(${11}) 호출 = ${increase(11)}`);
count = 11;
console.log(`increase(${count}) 호출 = ${increase(count)}`);
// 비 순수 함수
let x = 10;
function increment() {
x++;
}
function decrement() {
x--;
}
console.log(`x = ${x}`);
increment();
console.log(`increment() 호출!! `);
console.log(`x = ${x}`);
increment();
console.log(`increment() 호출!! `);
console.log(`x = ${x}`);
decrement();
console.log(`decrement() 호출!! `);
console.log(`x = ${x}`);
decrement();
console.log(`decrement() 호출!! `);
console.log(`x = ${x}`);
</script>
</head>
<body>
</body>
</html>
|
cs |

고차 함수(Higher-Order Function)
고차함수는 다른 함수를 인자로 받거나, 함수를 반환하는 함수입니다.
고차 함수의 장점
- 재사용성 : 코드를 더 간결하게 재사용 가능하게 만들어 줍니다.
- 가독성 : 코드의 의도를 명확하게 전달할 수 있습니다.
- 추상화 : 세부 구현을 감추고, 동작을 추상화할 수 있습니다.
고차함수는 배열을 다룰때 다시한번 설명드리도록 하겠습니다.
'Front End > Javascript' 카테고리의 다른 글
| [JavaScript] 배열 생성하기 (0) | 2024.10.23 |
|---|---|
| [JavaScript] 정적 타입 (Static Typing) & 동적 타입 (Dynamic Typing) (2) | 2024.10.23 |
| [JavaScript] 일급 객체 & 일급 함수 (1) | 2024.10.18 |
| [JavaScript] let 키워드 (0) | 2024.10.18 |
| [JavaScript] var의 문제점 (0) | 2024.10.18 |