프로그래밍 공부를 하다보면 간혹 Side Effect라는 단어를 자주 보았을 것이다.
그대로 해석하면 부작용(예상치 못한)이라는 단어이다.
그러나 프로그래밍 학문에서는 부정적인 단어는 아니다.
Sid Effect는 코딩 표준 문서에 이렇게 설명된다.
JSF Air Vehicle C++ Coding Standards Rule 187
All non null statements shall potentially have a side effect
해석) 빈 구문이 아니라면 반드시 하나의 Side Effect를 가져야 한다.
즉 빈 구문이 아닌데 Side Effect가 일어나지 않는 구문은 일반적으로 프로그래밍 에러를 발생한다.
Side Effect를 더 자세히 설명하자면
Accessing an object designated by a volatile lvalue, modifying an object, calling a library I/O function, or calling a function
that does any of those operations are all size effects, which are changes in the state of the execution environment
해석) 실행 도중 어떠한 객체를 접근해서 변화가 발생하는 행위이다.
코드를 통해 Side Effect의 예를 설명해보겠다.
let arr = "Hello Universe"
Side Effect가 한번 발생하였다.
왜냐하면 arr 변수에 "Hello Universe"라는 문자열이 할당되었기 때문이다.
let arr = "Hello Universe"
anoterArr = arr
이번에는 Side Effect가 두번 발생하였다.
arr에 할당을 한번하고, anoterArr 변수에도 할당이 되었기 때문이다.
let arr
아무런 변화가 없다면 Side Effect는 발생하지 않는다.
결국 코드에 변화가 조금이라도 일어난다면 Side Effect가 발생하게 되는 것이다.
그러나 Side Effect는 큰 문제가 아니지만, 의도치 않게 발생할 경우 많은 시간을 허비하게 될 것이다.
왜냐하면 Side Effect가 많이 발생할수록 디버깅 과정이 까다로워지기 때문이다.
let age = 26;
function yourAge () {
age = 48;
return age;
}
yourAge();
나는 분명 26세인데, 전역변수가 지역 스코프 효과로 인해 48세가 되어, 즉 잃어버린 22년을 가지게 된다. 🤷♂️
(Side Effect가 나를 중년층으로 만들어 버렸다...)
이러한 문제를 해결하기 위해서는 순수 함수를 활용해야 한다.
순수함수 : 부수적인 효과가 발생하기 않도록 억제 해준다.
function yourAge () {
let age = 26;
return age;
}
yourAge();
다시 나의 원래 나이를 되찾게 되었다.👱
Side Effect로 인해 예상치 문제를 예방하기 위해서는 코드 작성 시 순수 함수를 활용하는 것을 추천한다.
코드를 디버깅하는데 소요하는 시간이 줄어들 것이고 무엇보다 코드 간편화로 인해
누군가 나의 코드를 리뷰하기에도 편리할 것이다.