
면접장에서 마주하는 당혹스러운 순간
기술 면접장에 앉아 면접관의 질문을 기다리는 그 긴장된 공기를 기억하시나요? “Go 언어에서 변수와 상수의 차이점은 무엇이며, 어떤 상황에서 각각을 사용해야 하나요?”라는 질문이 던져졌을 때, 머릿속이 하얗게 변하며 단순한 정의만 맴도는 경험을 누구나 한 번쯤은 겪게 돼요.
단순히 “변수는 바꿀 수 있고 상수는 못 바꾼다”라고 대답하는 것만으로는 부족해요. 면접관은 여러분이 Go 언어의 설계 철학을 이해하고 있는지, 그리고 Go 변수 면접에서 요구하는 깊이 있는 메모리 구조나 컴파일 타임의 동작 방식을 알고 있는지를 확인하고 싶어 해요. 준비되지 않은 상태에서 마주하는 이런 질문은 실력과는 별개로 큰 압박감으로 다가오기 마련이에요.
이 글은 바로 그런 당혹감을 자신감으로 바꾸기 위해 준비했어요. 입문 개발자가 흔히 저지르는 실수부터, 실무에서 변수와 상수를 어떻게 전략적으로 선택하는지, 그리고 면접관의 의도를 꿰뚫는 모범 답안까지 모두 담았어요. 이 내용을 차근차근 따라오시면, 기술 면접에서 훨씬 더 전문적인 인상을 남길 수 있을 거예요.
이 글을 통해 여러분은 다음 내용을 확실히 얻어갈 수 있어요.
- Go 언어만의 독특한 변수 선언 방식과 그 차이점
- 상수(Constant)가 가진 강력한 타입 시스템의 이해
- 면접에서 반드시 나오는 핵심 질문과 논리적인 답변 구성법
- 실전 코드에서 자주 발생하는 변수 관련 오류와 예방책
면접 준비를 위한 기초 지식과 체크리스트
본격적인 심화 개념으로 들어가기 전에, 우리가 반드시 머릿속에 정리해 두어야 할 기초 지식들이 있어요. Go 프로그래밍은 다른 언어에 비해 매우 엄격한 규칙을 가지고 있기 때문에, 이 규칙을 무시하면 컴파일 단계에서 바로 오류를 마주하게 돼요. 면접관은 여러분이 이 엄격함을 ‘불편함’이 아닌 ‘안전장치’로 이해하고 있는지 확인하려 할 거예요.
먼저, 변수와 상수를 구분하는 기준을 명확히 세워야 해요. 단순히 값이 바뀌느냐 아니냐를 넘어, 메모리에 할당되는 시점과 컴파일러가 이를 어떻게 처리하는지가 핵심이에요. 변수는 프로그램 실행 중에 값이 바뀔 수 있는 저장 공간인 반면, 상수는 프로그램이 빌드되는 시점에 이미 그 값이 결정되어 버리는 약속과도 같아요.
Go는 정적 타입 언어(Statically Typed Language)예요. 이는 모든 변수의 타입이 컴파일 시점에 결정되어야 함을 의미해요. 따라서 변수를 선언할 때 타입을 명시하거나, 컴파일러가 타입을 추론할 수 있는 문법을 정확히 사용하는 것이 매우 중요해요.
면접 질문에 답변하기 전, 스스로 다음 기준들을 체크해 보세요. 내가 어떤 상황에서 어떤 선언 방식을 선택해야 하는지 논리적으로 설명할 수 있어야 해요.
| 변수 (var) | 상수 (const) | |
|---|---|---|
| 값의 변경 가능성 | 런타임 중 자유롭게 변경 가능 | 선언 후 절대 변경 불가 |
| 결정 시점 | 프로그램 실행 중(Runtime) | 컴파일 시점(Compile-time) |
| 주요 용도 | 사용자 입력, 계산 결과 저장 | 설정값, 수학적 상수, 고정된 식별자 |
| 선언 방식 | var 또는 := 사용 | const만 사용 가능 |
이 표를 단순히 외우기보다는, 왜 컴파일 타임에 결정되는 상수가 성능상 유리한지, 그리고 왜 변수는 실행 중에 메모리 주소를 참조해야 하는지를 연결해서 생각하는 연습이 필요해요. 이런 깊이 있는 사고 과정이 면접에서 여러분을 빛나게 해줄 거예요.
Go 변수와 상수의 핵심 메커니즘 탐구
이제 본격적으로 Go 프로그래밍의 심장부로 들어가 볼게요. 면접관이 여러분의 실력을 검증하기 위해 던질 수 있는 구체적인 주제들을 5가지 단계로 나누어 깊이 있게 다뤄볼게요. 각 단계는 단순한 문법 설명을 넘어, Go 언어가 왜 이런 방식을 택했는지에 대한 철학을 담고 있어요.
STEP 1. 선언의 미학, var와 := 완벽 구분하기
Go에서는 변수를 선언하는 두 가지 주요 방법이 있어요. 바로 var 키워드를 사용하는 방식과 단축 선언(Short Variable Declaration) 방식이에요. 이 둘의 차이를 정확히 아는 것은 면접의 기본이에요.
첫째, var는 타입을 명시적으로 지정하거나, 타입 추론을 맡길 때 사용해요. 가장 큰 특징은 패키지 레벨(함수 밖)에서도 사용할 수 있다는 점이에요. 프로그램 전체에서 공유되는 전역 변수를 선언할 때는 반드시 이 방식을 써야 해요.
둘째, :=는 함수 내부에서만 사용할 수 있는 매우 편리한 방식이에요. 타입을 명시하지 않아도 우측의 값을 보고 컴파일러가 타입을 자동으로 결정해 주죠. 하지만 주의할 점이 있어요. 이 방식은 새로운 변수를 ‘생성’할 때만 유효하며, 이미 존재하는 변수에 값을 다시 대입할 때는 사용할 수 없어요. 만약 함수 밖에서 :=를 사용하려 한다면 컴파일 에러를 마주하게 될 거예요.
STEP 2. 코드의 경계, 스코프와 가시성(Visibility) 이해하기
변수가 어디까지 영향을 미칠 수 있는지를 결정하는 ‘스코프(Scope)’와, 다른 패키지에서 이 변수를 볼 수 있는지를 결정하는 ‘가시성’은 Go의 설계 핵심이에요. Go는 다른 언어처럼 public이나 private 같은 키워드를 사용하지 않아요.
대신 아주 단순한 규칙을 사용해요. 바로 첫 글자가 대문자인가 소문자인가예요. 변수나 함수의 이름이 대문자로 시작하면 해당 패키지 외부에서도 접근할 수 있는 ‘Exported’ 상태가 되고, 소문자로 시작하면 해당 패키지 내부에서만 접근 가능한 ‘Unexported’ 상태가 돼요. 이는 코드를 읽는 사람에게 이 변수가 외부용인지 내부용인지를 즉각적으로 알려주는 아주 직관적인 설계 방식이에요.
STEP 3. 변경 불가능한 약속, 상수의 깊이 있는 이해
상수는 단순한 ‘읽기 전용 변수’ 그 이상이에요. Go의 상수는 Untyped Constant(타입이 지정되지 않은 상수)라는 독특한 특징을 가지고 있어요. 이것이 왜 중요할까요? 만약 우리가 const Pi = 3.14라고 선언하면, 이 Pi는 특정 타입에 갇히지 않은 상태로 존재해요.
이 덕분에 Pi를 float32 변수에 넣을 수도 있고, float64 변수에 넣을 수도 있어요. 만약 상수가 처음부터 특정 타입으로 고정되었다면, 매번 타입을 맞춰주는 형 변환(Casting) 과정을 거쳐야 했을 거예요. 상수는 컴파일 타임에 값이 결정되므로 런타임 오버헤드가 전혀 없으며, 코드의 안정성을 극대화하는 역할을 수행해요.
STEP 4. 안전한 프로그래밍의 시작, 제로 값(Zero Value)의 비밀
Go 언어를 처음 접하는 사람들이 가장 놀라는 부분 중 하나가 바로 제로 값(Zero Value) 개념이에요. 다른 언어에서는 변수를 선언하고 초기화하지 않으면 쓰레기 값이 들어가거나 에러가 발생하지만, Go는 모든 타입에 대해 미리 정해진 기본값을 자동으로 부여해요.
예를 들어, 정수형(int)은 0, 불리언(bool)은 false, 문자열(string)은 ""(빈 문자열)이 기본값이에요. 이는 프로그래머가 실수로 초기화되지 않은 변수를 사용하여 발생할 수 있는 치명적인 버그를 원천 차단하려는 Go의 철학이 반영된 결과예요. 면접에서 “Go에서 초기화되지 않은 변수의 동작 방식”에 대해 질문받는다면, 반드시 이 ‘제로 값’이라는 용어를 사용하여 답변하세요.
STEP 5. 초보자가 가장 많이 하는 실수, 변수 가리기(Shadowing)
마지막으로, 실전에서 가장 위험한 변수 가리기(Shadowing) 현상을 살펴볼게요. 이는 동일한 이름의 변수가 서로 다른 스코프에서 선언될 때, 바깥쪽 변수가 안쪽 변수에 의해 가려지는 현상을 말해요.
특히 if 문이나 for 문 안에서 :=를 사용하여 실수로 새로운 변수를 만들어버리는 경우가 대표적이에요. 개발자는 당연히 기존 변수의 값이 바뀔 것이라고 기대하지만, 실제로는 해당 블록 안에서만 유효한 새로운 변수가 생성될 뿐이에요. 이로 인해 논리적 오류가 발생하며, 이를 찾아내는 데 엄청난 시간을 허비하게 되죠. 면접에서 이 개념을 언급하며 “실무에서는 이를 방지하기 위해 변수 이름을 명확하게 짓거나, 선언 시 주의를 기울인다”라고 덧붙인다면 최고의 답변이 될 거예요.
Go의 설계자들은 단순함을 지향해요. 변수 선언 방식이 두 가지뿐인 이유, 가시성을 대문자로 결정하는 이유 모두가 코드를 읽기 쉽게 만들고 유지보수 비용을 낮추기 위한 고민의 결과물임을 기억하세요.
자주 하는 실수와 해결법 및 FAQ
실전 코딩을 하다 보면 이론적으로는 알지만, 막상 타이핑을 할 때 실수를 저지르곤 해요. 면접에서도 이러한 실수를 언급하며 어떻게 해결했는지를 말하는 것은 아주 좋은 전략이에요.
자주 하는 실수와 해결법
❌ 사용하지 않은 변수 에러
Go는 선언만 하고 사용하지 않은 변수가 있으면 컴파일을 허용하지 않아요.
👉 왜 발생하는가: 불필요한 메모리 낭비와 코드의 가독성을 떨어뜨리는 것을 방지하기 위한 Go의 엄격한 규칙이에요.
✅ 해결법: 변수가 정말 필요한지 다시 확인하거나, 디버깅 중이라면 잠시 사용하거나 삭제해야 해요.
❌ 패키지 레벨에서의 단축 선언 사용
함수 밖에서 :=를 사용하여 변수를 선언하려고 하면 에러가 발생해요.
👉 왜 발생하는가: :=는 함수 내부의 로컬 스코프에서만 작동하도록 설계되었기 때문이에요.
✅ 해결법: 패키지 수준의 전역 변수는 반드시 var 키워드를 사용하여 선언하세요.
❌ 상수에 변수처럼 값을 할당하려는 시도const로 선언한 값에 새로운 값을 대입하려고 하면 컴파일 에러가 나요.
👉 왜 발생하는가: 상수의 본질은 ‘불변성’이기 때문이에요.
✅ 해결법: 값이 변해야 하는 상황이라면 처음부터 var를 사용해야 해요.
❌ 변수 가리기(Shadowing)로 인한 논리 오류
함수 내부 블록에서 동일한 이름으로 :=를 사용하여 기존 값을 덮어쓰는 실수를 해요.
👉 왜 발생하는가: 새로운 스코프가 생성되면서 기존 변수와 이름이 겹치는 새 변수가 만들어지기 때문이에요.
✅ 해결법: 블록 내부에서 변수를 새로 만들지 말고, 기존 변수에 값을 대입할 때는 =를 사용하세요.
❌ 제로 값에 대한 오해
포인터 변수를 초기화하지 않고 바로 참조(dereference)하려고 해요.
👉 왜 발생하는가: 포인터의 제로 값은 nil인데, 이를 일반 값처럼 다루려 하기 때문이에요.
✅ 해결법: 포인터 사용 전에는 반드시 nil 체크를 하거나 적절한 메모리 할당을 먼저 진행하세요.
자주 묻는 질문
Q. var와 := 중 어떤 것을 사용하는 것이 더 좋은 관습인가요?
함수 내부에서 타입을 즉시 추론할 수 있는 간단한 경우에는 :=를 사용하는 것이 Go스러운(Idiomatic Go) 방식이에요. 하지만 함수의 매개변수나 전역 변수, 혹은 타입 명시가 명확히 필요한 경우에는 var를 사용하는 것이 원칙이에요.
Q. 상수를 선언할 때 타입을 반드시 명시해야 하나요?
아니요, 명시하지 않아도 돼요. 오히려 타입을 명시하지 않는 ‘Untyped Constant’로 선언하는 것이 더 유연하게 다양한 타입과 계산에 활용될 수 있어 권장되는 경우가 많아요.
Q. Go에서 변수의 스코프는 어떻게 결정되나요?
변수가 선언된 위치에 따라 결정돼요. 함수 내부에서 선언되면 해당 함수 내로, 블록(if, for 등) 내에서 선언되면 해당 블록 내로 제한돼요. 패키지 레벨에서 선언되면 패키지 전체에서 접근 가능해요.
Q. 제로 값(Zero Value)이 왜 프로그래밍에서 중요할까요?
프로그램의 예측 가능성을 높여주기 때문이에요. 초기화되지 않은 메모리 영역의 쓰레기 값 때문에 발생하는 무작위적인 버그를 방지하고, 모든 변수가 항상 안전한 기본 상태에서 시작하도록 보장해주기 때문이에요.
Q. 변수 이름을 지을 때 주의할 점이 있나요?
Go에서는 가시성을 결정하는 첫 글자의 대소문자가 매우 중요해요. 외부 패키지에서 사용해야 하는 변수라면 반드시 대문자로 시작해야 한다는 점을 잊지 마세요. 또한, 너무 긴 이름보다는 문맥상 명확하면서도 간결한 이름을 선호하는 것이 Go의 철학이에요.
실전 면접을 위한 최종 점검
지금까지 Go 언어의 변수와 상수에 대해 깊이 있게 살펴보았어요. 면접은 단순히 지식을 묻는 자리가 아니라, 여러분이 가진 논리적 사고의 흐름을 보여주는 자리라는 것을 기억하세요. 오늘 배운 내용을 바탕으로 스스로에게 질문을 던지고 답변하는 연습을 반복한다면, 어떤 까다로운 질문 앞에서도 당황하지 않을 거예요.
- 변수(var)는 실행 중 변경 가능, 상수(const)는 컴파일 시 결정 및 불변
- 패키지 레벨 선언은 var만 가능, 함수 내부는 := 활용 권장
- 가시성은 첫 글자의 대소문자로 결정 (Exported vs Unexported)
- 모든 타입에는 안전한 초기 상태인 ‘제로 값(Zero Value)’이 존재
- 변수 가리기(Shadowing)를 방지하기 위해 스코프 내 선언 주의
이제 여러분이 실천해야 할 단계는 다음과 같아요.
- 오늘 할 일: 위 요약 내용을 보지 않고 직접 빈 종이에 써보기
- 이번 주 할 일: Go Playground를 활용해 변수 가리기와 상수 타입 추론 예제 직접 코딩해보기
- 실행 직전 할 일: 면접 질문 리스트를 만들고 입 밖으로 소리 내어 답변 연습하기
기술 면접은 준비한 만큼 보입니다. 오늘 정리한 내용이 여러분의 합격에 작은 디딤돌이 되기를 진심으로 응원할게요. 더 깊이 있는 Go 프로그래밍 지식이 필요하다면 관련 시리즈 글도 함께 읽고 실력을 완성하세요.
관련하여 더 상세한 원리와 전체적인 구조를 알고 싶다면 Go 변수와 상수 완전 가이드 글을 참고해 보세요.