변수

변수 (Variables)

변수는 값을 담아 두는 저장 공간이에요. 그런데 아무 값이나 막 담을 수는 없고, 그 변수의 타입(type)이 허용하는 값들만 담을 수 있어요. 어떤 값이 허용되는지는 바로 그 변수의 타입이 정해 주는 거죠.

출처: Go Specification

본문

변수는 하나의 (value)을 담는 저장 공간이에요. 담을 수 있는 값의 범위는 그 변수의 *타입*에 의해 결정됩니다.

이름 있는 변수를 위한 저장 공간은 두 가지 방법으로 확보돼요. 하나는 *변수 선언*이고, 다른 하나는 함수의 매개변수와 결과값을 위한 것인데, 이때는 *함수 선언*이나 *함수 리터럴*의 시그니처가 그 역할을 해요.

런타임에 변수를 만들고 싶을 때는 내장 함수 *new*를 호출하거나, *복합 리터럴*의 주소를 취하면 돼요. 이렇게 만들어진 변수는 이름이 없어요. 그래서 이런 익명 변수는 (암시적인) *포인터 간접 참조*를 통해서만 접근할 수 있어요.

배열, 슬라이스, 구조체 타입처럼 구조화된 변수는 각각의 요소와 필드를 따로 *주소 지정*할 수 있어요. 이 구조화된 변수의 요소 하나하나가 그 자체로 변수처럼 동작하는 셈이죠.

변수의 정적 타입(static type, 줄여서 그냥 타입)은 선언에서 주어진 타입, new 호출이나 복합 리터럴에서 제공된 타입, 또는 구조화된 변수의 요소 타입 중 하나예요.

인터페이스 타입의 변수에는 여기에 더해서 별개의 동적 타입(dynamic type)이 있어요. 이 동적 타입은 런타임에 그 변수에 할당된 값의 (인터페이스가 아닌) 타입을 말하는데, 다만 그 값이 타입이 없는 사전 선언 식별자 nil인 경우는 제외해요. 동적 타입은 실행 중에 바뀔 수 있지만, 인터페이스 변수에 저장되는 값은 언제나 그 변수의 정적 타입에 *할당 가능*해야 해요.

var x interface{}  // x is nil and has static type interface{}
var v *T           // v has value nil, static type *T
x = 42             // x has value 42 and dynamic type int
x = v              // x has value (*T)(nil) and dynamic type *T

변수의 값은 그 변수를 *표현식*에서 참조함으로써 가져와요. 그 값은 변수에 가장 최근에 *할당*된 값이에요. 아직 값을 한 번도 할당하지 않았다면, 그 변수의 값은 해당 타입의 *제로 값*이 됩니다.

더 알아보기

  • 변수가 어떻게 생겨나는지가 궁금하다면 **변수 선언**을, 함수를 통해 만들어진다면 **함수 선언**과 **함수 리터럴**을 살펴봐요.
  • 값이 담기려면 타입이 정해져 있어야 하죠. 타입이란 무엇인지는 **Types**에서 확인할 수 있어요.
  • 값을 할당하기 전에 변수는 어떤 값을 갖는지, 그 '처음 값'에 대한 이야기가 **제로 값**에 담겨 있어요.
  • 인터페이스 변수에 어떤 값이든 들어갈 수 있는 이유, 그 할당 가능성의 기준은 **할당 가능성**에서 다룹니다.