KUR Creative


QnA - 왜 전역변수를 사용하면 안 되나요?

Q

너무 원초적이고 이상한 질문 일수도 있겠지만
전역변수를 사용해서 코딩하는것은 좋지않다고 배웠던거 같은데

제가 자료구조 문제를 풀거나 다른 코딩을 할 때도 마찬가지로
코드를 깔끔하게 작성하고 싶어서 많이 연구해 보았는데 전역변수를 사용하는게 여러 함수에서 참조하기도 쉽고
코드가 더 깔끔해진다고 생각하는데 이러한 코딩은 좋지않은 코딩인가 궁금합니다.

아니면 좀더 깔끔하게 작성 할 수 있는 노하우나 기술이 있으면 공유해 주시면 감사하겠습니다.

A

전역 변수의 함정

전역 변수는 과제 프로그램과 같이 한 사람이 단 하나의 파일로 이뤄질 정도의 작은 프로그램을 개발할 때는 그리 문제가 되지 않습니다.
프로그램의 규모가 커지게 됬을 때 전역변수의 가장 큰 문제점은
전역 변수를 사용하는 모든 모듈(함수, 클래스 등)이 서로 연관되는 것입니다.

함수에서 전역 변수를 사용한다고 해봅시다. 함수 시그니처에는 전역 변수에 대한 내용을 적을 수 없습니다.
전역 변수를 많이 사용할 수록 함수 시그니처는 보나 마나한 물건이 됩니다.
어떤 함수가 어떤 전역 변수를 쓰는지 알아내기 위해서는 함수의 구현을 읽어야하기 때문입니다.
그 뿐 아니라 함수를 그냥 사용할 때도 매번 문제가 발생할 수 있습니다.
함수가 호출될 때마다 프로그래머는 전역변수가 변경되었는지, 그대로인지 확인해야하기 때문입니다.

혼자서 개발한다면 그럭저럭 이름을 잘 짓고 원칙을 정해서 잘 지키는 방법으로 해결할 수도 있지만,
개발에 참여하는 사람이 많아지면 그런 방법은 거의 불가능해집니다.
개발이 진행됨에 따라 어제는 전역 변수를 변경하지 않던 함수가 오늘은 변경하게 되는 경우도 있고
개발이 많이 진행되어 수많은 모듈이 전역변수에 의존하는 경우, 전역 변수의 값을 변경할 때마다 변수를 사용하는 모든 모듈에 문제가 없는지 살펴봐야 합니다.

결론을 내리자면, 전역 변수를 사용하는 것은 프로그램의 규모가 작고 개발자가 적을 때는 쉽고 편리해 보입니다.
그러나 전역변수는 프로그램의 복잡도(연관도)를 매우 증가시키기 때문에 프로그램이 커질수록 사용해서는 안 됩니다.

전역 변수 없이 프로그래밍 하는 법

전역 변수 없이 어떻게 프로그래밍을 할까요?
별로 어려운 일은 아닙니다.

  1. 가능한 한 지역 변수만을 사용하고
  2. 함수는 함수가 받는 인자에만 의존하면 됩니다.

그러면 기존에 전역변수로 main 밖에 선언되던 변수들이 모두 main 함수 안으로 들어가게 되고,
main에서 호출되는 함수안으로 변수들이 전달되는 것이 흔한 패턴입니다.

이렇게 코딩하면 기존에 전역 변수에 선언 되던 것들을 모두 함수 내부의 지역 변수로 선언할 수 있습니다.

전역변수는 쉬우나(easy) 복잡하다(complex)

왜 전역 변수를 쓰는 게 더 깔끔하고 편하게 느껴질까요?

전역 변수를 사용하는 것은 쉽기 때문입니다.
전역 변수(전역 상태)는 쉽지만 복잡합니다.
그러한 복잡함은 과제 프로그램처럼 작은 규모에서는 잘 드러나지 않습니다.

resource/simple-easy-768x848.jpg
[1] (speed는 개발 속도, time은 규모나 개발에 걸리는 시간을 의미합니다. 과제는 보통 x축 1/5 지점에서 끝납니다..)

과제 뿐 아니라 개인적으로, 혹은 여럿이서 어느 정도 규모가 있는 프로젝트(최소 1000라인 이상)를 진행해보세요.
많은 것을 배울 수 있을 것입니다.


ps.쉬운데 복잡하다는게 뭔 소리인지는 이 글을 한번 읽어보세요


과거 블로그 댓글 (23/02/18 현재 0개)

늘 주장하는 몇가지에 대한 근거가 될 수 있겠다.

  1. 개인 프로젝트를 따로 진행하라
  2. 알고리즘 문제, 온라인 저지보다는 프로젝트를 하라
  3. LOC는 전투력이다

프로그래밍은 복잡성과의 싸움이다.
그러나 그런 복잡함은 작은 프로그램에서는 잘 드러나지 않는다.
복잡함은 여러가지가 엮일 때 발생하는 것인데, 프로그램이 작으면 애초에 엮일 것이 없기 때문에...
큰 프로그램을 짜 보아야만 알 수 있는 것들이 있다.


  1. Rich Hickey의 발표에서 발췌 https://github.com/matthiasn/talk-transcripts/blob/master/Hickey_Rich/SimpleMadeEasy.md ↩︎

#from/old-blog#simplicty단순함
kur1707072227Archivekur1910171132