처음 파이썬을 배울 때 global 전역변수는 웬만해선 사용하지 않는 편이 좋다는 얘기를 들은적이 있다.
당시엔 '쓰지 말아야지' 정도로 생각하고 넘어갔었는데, 어제 문제를 풀다 보니 문득 궁금해졌다.
https://hobbyloggle.tistory.com/13
[백트래킹] 백준 15686: 치킨 배달
문제: 크기가 N * N인 도시가 있다. 도시는 1 * 1 크기의 칸으로 나누어져 있다. 도시의 칸은 (r, c)와 같은 형태로 나타나고, r행 c열 또는 위에서부터 r번째 칸, 왼쪽에서부터 c번째 칸을 의미한다. r
hobbyloggle.tistory.com
위 문제에서 deepcopy를 활용해 copy_city라는 리스트를 선언했다. 이 copy_list는 전역적으로 사용되지 않았고, 매개변수로 함수에 넣어주거나 전역으로 선언해 사용해 줄 필요가 있었다.
나는 전역으로 선언해 사용하는 방법을 택했고, 문제를 해결했다. 문제를 해결하고 나자 예전에 들었던 'global 전역변수는 사용하지 않는 편이 좋다'라는 말이 떠올랐다.
떠오른 참에 그 이유를 정리해보려 한다.
1. global 전역변수를 사용하는 이유는?
나의 경우 함수 밖에서 선언된 변수를 함수의 로직 내에서 변경하고 싶을 때 사용한다.
전역변수를 사용하지 않고 같은 코드를 짜기 위해선 네 가지의 과정이 더 필요하게 된다. 첫째는 매개변수로 넣어주는 과정, 둘째는 매개변수를 로직에 맞게 변경해 리턴해주는 과정. 셋째는 리턴한 값을 변수에 적용시키는 과정. 마지막으로 넷째는 적용된 변수를 다시 로직에 적용시키는 과정.
코드의 길이가 줄어든다는 장점이 있는 것 같다.
2. 그럼에도 사용하면 안되는 이유는?
사실 '사용하면 안된다'라는 표현이 맞는지는 모르겠다. 프로젝트의 성격에 따라 다를 것 같은데, 로직적 고려 없이 마구잡이로 전역변수를 사용하는 상황은 지양하는것이 맞을 것 같다.
사용하면 안되는 이유는 다음과 같이 요약할 수 있을 것 같다.
a. 전역변수를 사용하면 문제가 생겼을 때 문제점을 추적하기 어렵다는 단점이 있다.
- 소스의 어느 부분에서는 전역변수를 건드릴 수 있기 때문에, 어디서 문제가 발생했는지 정확히 파악하기가 어렵다.
b. 동시호출이 될 때 데이터가 틀어질 수 있다.
- 전역변수로 선언된 값을 두개 이상의 함수가 동시에 수정한다면, 어느 한 쪽은 다른 한 쪽이 수정한 값을 가지고 다시 로직을 돌리게 될 것이다. 이는 원하는 값을 반환하지 못하게 되는 원인이 될 수 있다.
c. oop(객체지향프로그래밍)의 은폐성 원칙에 어긋난다.
Javascript 내용정리 (5) (0) | 2021.12.30 |
---|---|
Javascript 내용정리 (4) (0) | 2021.12.28 |
Javascript 내용정리 (3) (0) | 2021.12.25 |
Javascript 내용정리 (2) (0) | 2021.12.24 |
Javascript 내용정리 (1) (0) | 2021.12.24 |
댓글 영역