고(Go) 언어 전역 변수, 양날의 검! 똑똑하게 활용하는 방법은? (핵심 정리)
전역 변수, 넌 누구냐? (개념부터 확실하게!)
프로그래밍을 하다 보면 '변수'라는 말을 정말 많이 듣게 되는데요.
변수는 쉽게 말해 데이터를 잠시 담아두는 그릇이라고 생각하면 됩니다.
그런데 이 변수라는 그릇은 어디에 놓느냐에 따라 사용할 수 있는 범위가 달라집니다.
오늘 우리가 이야기할 '전역 변수'는 마치 부엌 한가운데에 놓인 커다란 설탕통처럼, 프로그램 전체 어디에서든 손쉽게 꺼내 쓸 수 있는 변수를 말합니다.
즉, 어떤 특정 함수 안에 선언되는 것이 아니라, 함수 바깥에 떡하니 자리를 잡고 있어서 모든 함수가 이 변수를 알고 접근할 수 있는 것이죠.
이렇게 여러 함수에서 데이터를 쉽게 공유할 수 있다는 점이 전역 변수의 가장 큰 특징이지만, 동시에 프로그램의 각 부분이 서로 너무 얽히게 만들어 모듈성을 해칠 수도 있다는 점을 기억해야 합니다.
고(Go)에서 전역 변수는 어떻게 만들까요? (선언 방법)
고(Go) 언어에서 전역 변수를 만드는 방법은 아주 간단합니다.
그냥 var
라는 키워드를 사용해서 함수 바깥쪽에 변수를 선언해주기만 하면 되는데요.
말로만 설명하면 감이 잘 안 오실 테니, 간단한 예제 코드를 통해 직접 확인해볼까요?.
package main
import "fmt"
// globalVar 라는 이름의 전역 변수를 선언하고 "나는야 전역 변수!" 라는 문자열을 담았습니다.
// 어떤 함수 안에도 속해있지 않죠? 이게 바로 전역 변수입니다.
var globalVar = "나는야 전역 변수!"
func main() {
// main 함수 안에서도 globalVar에 접근해서 값을 출력할 수 있습니다.
fmt.Println(globalVar)
localFunction() // 다른 함수를 호출해볼까요?
}
func localFunction() {
// localFunction 이라는 다른 함수 안에서도 역시 globalVar에 접근 가능합니다!
fmt.Println(globalVar)
}
위 코드에서 globalVar
라는 변수는 main
함수와 localFunction
함수 모두에서 아무 문제 없이 사용되는 것을 볼 수 있습니다.
정말 프로그램 어디에서든 쓸 수 있는 만능 변수 같죠?.
전역 변수, 좋을 때도 있다고요? (장점 살펴보기)
모든 것에는 장단점이 있듯이, 전역 변수도 잘만 활용하면 꽤나 유용할 때가 있습니다.
첫째, 편리함의 끝판왕!
가장 큰 장점은 바로 '편리함'입니다.
여러 함수에서 똑같은 데이터를 사용해야 할 때, 일일이 함수에 매개변수(Parameter, 함수에 넘겨주는 값)로 전달하지 않아도 전역 변수 하나만 선언해두면 어디서든 바로바로 가져다 쓸 수 있으니 정말 간편하겠죠?.
마치 온 가족이 함께 쓰는 공용 물건처럼 말입니다.
둘째, 프로그램 전체의 상태 관리!
프로그램 전체에서 공유되어야 하는 중요한 상태 정보(예를 들어, 프로그램의 설정값이나 현재 사용자 정보 등)를 관리할 때 전역 변수가 유용하게 사용될 수 있습니다.
프로그램의 여러 부분에서 이 상태를 참고하거나 변경해야 할 때, 전역 변수를 통하면 일관성 있게 관리하기가 상대적으로 수월해집니다.
하지만, 함부로 쓰면 큰일 나요! (단점과 위험성)
편리함 뒤에는 항상 대가가 따르는 법일까요? 전역 변수도 잘못 사용하면 프로그램 전체를 엉망으로 만들 수 있는 무시무시한 단점들을 가지고 있습니다.
첫째, 프로그램이 스파게티처럼 꼬여버려요! (강한 결합도)
전역 변수를 사용하면 함수들이 이 전역 변수에 너무 심하게 의존하게 됩니다.
마치 거미줄처럼 여러 함수가 하나의 전역 변수를 중심으로 얽히게 되는 건데요.
이렇게 되면 프로그램의 각 부분이 서로 너무 긴밀하게 연결되어(이를 '강한 결합도'라고 합니다), 한 부분을 수정하면 다른 부분까지 영향을 미치는 연쇄 작용이 일어날 수 있습니다.
결국 프로그램의 유연성과 모듈성(각 부분을 독립적으로 관리하고 재사용하기 쉬운 정도)이 떨어지게 되어 유지보수가 어려워지는 결과를 초래합니다.
둘째, 테스트가 너무 힘들어져요! (테스팅의 어려움)
프로그램을 만들 때 '단위 테스트(Unit Test)'라는 것을 통해 각 기능이 제대로 작동하는지 확인하는데요.
전역 변수는 이 단위 테스트를 매우 어렵게 만듭니다.
왜냐하면 전역 변수의 상태는 프로그램 실행 중에 계속 변할 수 있어서, 테스트할 때마다 다른 결과를 낳거나 예상치 못한 부작용을 일으킬 수 있기 때문입니다.
마치 여러 사람이 동시에 사용하는 물건을 테스트하는 것처럼, 정확한 테스트 환경을 만들기가 까다로워지는 것이죠.
셋째, 여러 작업이 동시에 실행될 때 문제가 생길 수 있어요! (동시성 문제)
요즘 프로그램들은 여러 작업을 동시에 처리하는 경우가 많은데요(이를 '동시성 프로그래밍'이라고 합니다).
만약 여러 작업이 하나의 전역 변수에 동시에 접근해서 값을 읽거나 바꾸려고 한다면 어떻게 될까요?.
마치 여러 사람이 동시에 하나의 문서를 수정하려고 할 때처럼, 데이터가 꼬이거나 예상치 못한 결과가 발생할 수 있습니다.
이런 현상을 '경쟁 상태(Race Condition)'라고 부르는데, 전역 변수는 바로 이 경쟁 상태를 유발하는 주범 중 하나가 될 수 있습니다.
전역 변수, 똑똑하게 사용하는 방법은 없을까요? (모범 사례)
그렇다면 전역 변수는 아예 사용하지 말아야 하는 걸까요? 꼭 그렇지만은 않습니다.
다음과 같은 모범 사례들을 잘 지킨다면, 전역 변수의 위험성을 최소화하면서 꼭 필요한 경우에만 현명하게 활용할 수 있습니다.
첫째, 정말 필요할 때만, 아주 조금만 사용하세요!
가장 중요한 원칙입니다.
전역 변수는 가급적 사용하지 않는 것이 가장 좋습니다.
대부분의 경우, 함수에 필요한 데이터는 매개변수를 통해 전달하는 것이 프로그램의 구조를 더 명확하고 안전하게 만드는 방법입니다.
정말 어쩔 수 없이 전역적인 상태 관리가 필요한 경우가 아니라면, 전역 변수 사용은 최대한 자제하는 것이 좋습니다.
둘째, 소중한 전역 변수, 꽁꽁 숨겨서 보호하세요! (캡슐화)
만약 전역 변수를 꼭 사용해야 한다면, 이 변수에 아무나 함부로 접근해서 값을 바꾸지 못하도록 '캡슐화(Encapsulation)'하는 것을 고려해볼 수 있습니다.
마치 귀중품을 안전한 금고에 보관하는 것처럼, 전역 변수를 특정 구조체(Struct) 안에 숨기거나, 값을 가져오고(Getter) 설정하는(Setter) 함수를 통해서만 접근하도록 제한하는 방법입니다.
이렇게 하면 전역 변수의 사용을 좀 더 통제하고 관리하기 쉬워집니다.
셋째, 동시 접속은 금물! 순서를 지켜주세요! (동기화)
여러 작업이 동시에 실행되는 프로그램에서 전역 변수를 사용해야 한다면, 반드시 '동기화(Synchronization)' 장치를 사용해서 보호해야 합니다.
뮤텍스(Mutex)와 같은 동기화 도구를 사용하면, 한 번에 하나의 작업만이 전역 변수에 접근하도록 순서를 정해줄 수 있습니다.
이렇게 하면 여러 작업이 동시에 전역 변수를 건드려서 발생하는 경쟁 상태를 예방하고 데이터의 일관성을 지킬 수 있습니다.
마무리하며: 전역 변수, 알고 쓰면 약, 모르고 쓰면 독!
지금까지 고(Go) 언어에서 전역 변수를 사용하는 방법에 대해 함께 알아봤습니다.
전역 변수는 분명 여러 함수에서 데이터를 쉽게 공유할 수 있다는 편리함을 제공하지만, 동시에 프로그램의 유지보수성을 해치고 예기치 않은 문제를 일으킬 수 있는 잠재적인 위험도 안고 있는데요.
따라서 전역 변수를 사용할 때는 그 장단점을 명확히 이해하고, 정말 필요한 경우에만, 그리고 위에서 언급한 모범 사례들을 철저히 지키면서 신중하게 사용하는 것이 중요합니다.
마치 강력한 힘을 가진 도구일수록 조심해서 다뤄야 하는 것처럼 말이죠!
'Go' 카테고리의 다른 글
고(Go) 언어의 'goto' 문, 과연 필요악일까? 제대로 알고 사용하기 위한 모든 것! (0) | 2025.05.30 |
---|---|
고(Go) 개발자를 위한 필수템! 데이터베이스 마이그레이션, '구스(Goose)'로 쉽고 빠르게! (핵심 기능 총정리) (0) | 2025.05.30 |
고(Go) 슬라이스 복사, 이것만 알면 끝! copy와 append 완벽 활용법 (초보자 필독) (0) | 2025.05.30 |
고(Go) 언어 시간 다루기 완전 정복: time.Parse 함수, 이제는 마스터해볼까요? (0) | 2025.05.30 |
Go 언어 파일 쓰기 마스터 가이드: os, bufio 패키지로 원하는 내용 마음껏 저장하기! (고등학생 눈높이 완벽 해설) (0) | 2025.05.28 |