업무에 사용하는 Go 언어 2 – 변수와 상수

Go 언어에서 변수와 상수를 선언하는 방법을 알아보고 간단한 실습을 통해 변수와 상수를 사용해보도록 합시다.

본 시리즈는 독자가 컴퓨터 공학을 어느 정도 이해하고 있다고 가정하기에 넘어가고자 했지만,
편의를 위하여 컴퓨터 공학에서 변수와 상수의 의미를 약간만 다루어보겠습니다.

수학에서 변수라는 것은 말 그대로 변할 수 있는 라고 합니다.
이것이 확장되어 컴퓨터 공학에서는 변할 수 있는 데이터를 저장하는 저장소라고 합니다.

수학에서 상수라는 것은 말 그대로 변하지 않는 수라고 합니다.
이것이 확장되어 컴퓨터 공학에서는 변할 수 없는 데이터를 저장하는 저장소라고 합니다.

우리 컴퓨터 공학자들은 이 저장소에 이름을 붙여서 사용합니다.
왜냐하면, 데이터가 어느 위치의 메모리 주소에 저장되어 있는지 외우기에는 너무 귀찮기 때문이죠.

업무에 사용하는 Go 언어 썸네일
업무에 사용하는 Go 언어 썸네일

Go 언어 변수 선언 규칙

Go 언어에서 변수를 선언할 때 var 키워드를 사용하여 선언합니다.

var 변수이름 타입

참 특이합니다. 보통 대부분의 프로그래밍 언어를 보면 변수 타입 뒤에 변수 이름이 오는데 말이죠.
Go 언어의 철학 중에 중요하게 명시되는 부분은 ‘읽기 쉽고 명료한 코드를 작성‘하는 것입니다.

예시를 통해 살펴봅시다.
C언어의 경우 다음과 같이 정수형 변수를 선언합니다.

int x;

엔지니어는 이 구문을 보고 ‘변수 x는 정수다.’라는 것을 인식해야 합니다.
여기서 Go 언어의 아이디어는 int x라는 구문이 변수와 관련되어 있다는 지식이 있는 사람만 읽을 수 있다는 뜻입니다.
또한 코드와 엔지니어가 인식한 의미가 단어의 순서도 다르기 때문에 직관적으로 전달되지 않습니다.
즉, 구문을 외운 사람만 정확하게 이해할 수 있다가 되겠습니다.

Go언어의 경우는 다음과 같이 정수형 변수를 선언합니다.

var x int

엔지니어는 var 키워드를 보는 순간 변수라는 것을 인식합니다.
x라는 단어를 보는 순간 변수의 이름이 x라는 것을 인식합니다.
int 키워드를 보는 순간 정수라는 것을 인식합니다.

이것을 순서대로 나열만 하면 ‘변수 x는 정수다.’라는 문장이 완성되기 때문에 직관적입니다.
영어로 해도 ‘Variable x is integer.’가 되기 때문에 매우 직관적이고 명료하다고 할 수 있겠습니다.

필자의 경우 C언어를 제일 먼저 학습한 경우인데, 너무 당연하게 받아들였던 것을 되돌아보니 Go 언어의 철학은 말이 된다고 생각합니다.

문법은 문법이니 무엇이 좋고 나쁘냐는 없다고 생각합니다.
컴퓨터 공학에 속하는 것은 모두 아름다우니까요.

이전 글에서 우리는 Go 언어 프로젝트를 생성하고 hello world를 출력하는 간단한 프로그램을 만들어 보았습니다.
variables.go라는 파일을 생성하여 다음과 같이 작성해보고 실행해봅시다.

image 4
Go 언어 변수 선언 예시

5번째 줄과 같이 여러 개의 변수를 한 번에 선언할 수도 있습니다.
직접 타이핑해보고 실행을 해보셨다면 꼭 마음대로 변수명을 바꿔보고 실행해보도록 합시다.

위의 코드는 아주 간단한 예시일 뿐입니다. 실제 업무에서는 i, a, b, c와 같은 변수명은 사용하지 않도록 합니다.
왜냐하면, 동료가 코드를 봤을 때 어떤 용도로 사용되는 변수인지 모를 수 밖에 없습니다.

또한, vscode를 사용하시고 go와 관련된 extension을 사용하신다면 위와 같이 main함수에 빨간 줄이 나타날 수 있습니다.
이는 app.go라는 파일에도 main() 함수가 존재하기 때문인데요. 실제로 Go 언어 프로그램에는 main() 함수가 진입점이기 때문에 하나만 존재해야 하는 것이 맞습니다.

보통 go run 명령어를 통해 프로그램을 실행하게 되는데요. 컴퓨터 입장에서는 진입점이 여러 곳인데 어디인지 모르겠다는 뜻입니다. 다만, 우리는 패키지가 무엇인지 모듈이 무엇인지에 대해 학습하지 않았기 때문에 go run variables.go와 같이 파일명을 직접 명시하여 실행하는 것입니다.

갑자기 무슨 말인지 모르겠다면 우선 넘어가도 좋습니다.

약간의 여담

필자는 패키지와 모듈에 대해서 먼저 설명하고자 했다.
독자가 Go 언어의 매력보다는 Go 언어로 작성된 프로젝트를 실행하는 방법을 달달 외우게 될 것이라고 생각했다.
그 결과 독자의 흥미가 떨어질 것을 걱정하게 되었다.

Go 언어 변수 초기화

우리는 앞의 예시에서 변수의 이름과 타입만 지정해주었습니다.
변수 선언 시 초깃값을 지정해주고 싶다면 다음과 같이 작성할 수 있습니다.

var 변수이름 [타입] = 초깃값

이와 같이 초깃값을 지정해줄 때는 변수 타입은 생략하는 것이 가능합니다.
이 경우, 변수는 초깃값의 타입을 가지게 됩니다.

다음과 같이 코드를 작성하고 실습해봅시다.

image 5
Go 언어 변수 초기화 예시

결과를 살펴보면 변수 i와 j 모두 정상적으로 선언이 되었습니다.
9번째 줄과 같이 타입을 생략했을 때는 변수 j는 초깃값 1의 타입인 정수, int를 가지게 됩니다.

Go 언어 변수 기본 자료형

Go 언어에서 변수의 기본 자료형(타입)들은 다음과 같습니다.

  • 정수형
    • int (플랫폼에 따라 32비트/64비트)
    • int8, int16, int32, int64 (각 비트 수만큼 저장 가능)
    • 부호 없는 정수
      • uint (플랫폼에 따라 32비트/64비트)
      • uint8, uint16, uint32, uint64 (또한 각 비트 수만큼 저장 가능)
      • byte
      • uintptr (포인터를 저장할 때 사용)
  • 실수형
    • float32
    • float64 (Go 언어에서는 기본적으로 64비트를 권장)
  • 복소수형
    • complex64
    • complex128
  • 문자
    • rune (32비트 유니코드를 나타내는 타입)
  • 문자열
    • string (UTF-8 인코딩을 가지는 문자열)
  • 불리언
    • bool (참/true 또는 거짓/false을 나타내는 타입)

이 외에 추가적으로 포인터, 컬렉션, 인터페이스 등 여러 타입이 있는데 이들은 추후에 해당 내용을 다룰 때 다루도록 하겠습니다. 꼭 실습을 통해서 기본 자료형을 사용하는 변수를 선언하여 출력해보도록 합시다.

image 6
Go 언어 변수 기본 자료형 예시

예시와 같이 %T와 %v를 사용하여 타입과 값을 출력하여 확인해보도록 합시다.
참고로, math/cmplx 패키지는 복소수를 사용할 수 있게 해주는 패키지입니다.

약간의 여담

Go 언어에서는 8번째 줄부터 12번째 줄까지의 내용처럼 여러 줄에 걸쳐 한 번에 변수를 선언해도 된다.
필자의 경우 업무에서 한 번도 이 문법을 사용해본 적은 없으나 독자의 취향은 다를 수 있기에 소개했다.

Go 언어 짧은 변수 선언

Go 언어에선 변수를 선언할 때 짧은 코드로 선언할 수 있도록 허용합니다.

함수( ) {
    변수이름 := 초깃값
}

단, 초깃값이 확실히 결정되어 있는 변수에 대해서만 허용하기 때문에 초깃값을 필수로 적어주어야 합니다.
또한, 함수 밖에서의 모든 선언은 var, func 등의 키워드로 시작하기 때문에 짧은 변수 선언은 함수 내에서만 가능합니다.

image 7
Go 언어 짧은 변수 선언 예시

Go 언어에서 변수를 선언할 때 초깃값이 있다면 타입을 생략할 수 있었습니다.
그 경우 변수는 초깃값의 타입을 가지게 된다고 했었습니다.
짧은 변수 선언에서도 동일하게 변수는 초깃값의 타입을 가지게 됩니다.

위의 예시에서 변수 i의 타입은 정수가 되겠군요.

Go 언어 zero value

image 4
Go 언어 변수 선언 예시

Go 언어 변수 선언에서 살펴본 예시입니다.
다른 언어를 사용해본 독자라면 출력 결과에서 0과 false는 어디서 온 것인지 의문을 가졌을지도 모릅니다.
엔지니어라면 이런 의문을 가지는 것이 좋습니다.

Go 언어는 초깃값 없이 선언된 변수에 다음 중 해당되는 타입의 zero value를 저장하여 선언합니다.
– 숫자 관련 타입 : 0
– Boolean 관련 타입 : false
– String 관련 타입 : “” (Empty string)

Go 언어 변수 타입 변환

다음과 같이 코드를 작성하여 변수의 타입을 변환할 수 있습니다.

Go
타입()

실습을 통해 타입을 변환하고 다른 변수에 저장하여 확인해보도록 합시다.

image 8
Go 언어 변수 타입 변환 예시
Go
var i = 100
var f = float64(i)
var u = uint(i)

변수 i를 각 각 float64, uint 타입으로 변환하여 새로운 변수에 저장한 예시입니다.
위의 코드는 아래와 같이 간단히 작성해볼 수 있겠죠?

Go
i := 100
f := float64(i)
u := uint(f)

직접 코드를 수정하여 실행 후 확인해보도록 합시다.

Go 언어 상수

Go 언어에서 상수는 변수처럼 선언하되 const 키워드를 사용하면 됩니다.

Go
const 상수이름 [타입] = 초깃값

상수는 변할 수 없는 값이라는 의미이기 때문에 초깃값은 반드시 명시되어야 합니다.
타입은 초깃값과 함께 변수를 선언할 때와 같이 생략 가능합니다.

image 9
Go 언어 상수 예시

상수 value는 100이라고 선언하고 출력하는 코드 예시입니다. 만약, 상수 value의 값을 변경하려고 하면 어떻게 될까요?
한 번 직접 시도해보고 그 결과를 경험해보도록 합시다.

이번 글을 통해 Go 언어의 변수와 상수에 대해서 알아봤습니다.
앞으로의 내용은 입출력에 대해서 아주 간단하게 살펴보도록 하겠습니다.