Go 기본 타입과 루프문[1]

int와 uint의 차이

int는 signed로, 부호가 있다. 즉 8비트 int의 경우 -127 ~ +127까지를 포괄한다.

한편 uint는 unsigned, 즉 부호가 없다. 8비트 기준으로 0부터 255까지를 포괄한다.

복소수?

Go는 복소수를 기본 타입으로 제공한다. complex 타입이다.

복소수는 알다시피 실수부와 허수부가 존재한다.

var c1 complex64
c1 = 12 + 1i

루프문

Go에는 while이 없다. for로 모든걸 사용한다.

for i := 0; i < 100; i++ {
// do something
}

while true는 아래와 같이 쓴다.

for {

}

break나 continue는 존재한다.

한편 range 키워드를 사용하면 편리하다.

arr := [5]int{0, 1, 2, 3, 4}
for idx, val := range arr {
    // do something
}

range는 배열을 순회하며 index, value 쌍을 리턴한다. 만약 사용하고 싶지 않은 값이 있다면 _ 언더바를 이용해 받아주면 된다.

배열

배열은 이렇게 만든다.

[배열의크기]배열의타입{원소, 원소, 원소...}

느껴졌겠지만, 배열의 길이는 고정이다.

한편 Go에서 배열은 인기가 없다.

  1. 배열은 정의하고 나면 길이를 변경할 수 없다.
  2. 함수의 매개변수로 배열을 넘기면, 복사된 배열이 전달된다. 따라서 큰 배열을 전달하면 복사 과정에서 속도가 느려진다. 또, 함수 내부에서 인자로 받은 배열을 변경하여도 원본 배열은 변하지 않는다 (복사본만 수정되고 함수가 끝나면 메모리에서 해제됨)

그래서 보통은 배열보다는 슬라이스(slice)를 즐겨 쓰게 된다.

슬라이스

슬라이스는 내부적으로 배열을 사용한다. 배열의 장점은 가져오고, 배열의 단점은 개선했다.

  1. 슬라이스는 길이가 가변적이다. 물론 내부적으로는 정의된 것보다 길이가 길어지면 더 큰 길이의 배열을 생성하고, 값을 옮겨담는다. 하지만 개발자가 직접 이 과정을 할 필요가 없이 길이를 가변적으로 쓸 수 있다.
  2. 슬라이스를 함수의 매개변수로 넘기면, 참조 값으로 전달된다. 즉, 슬라이스 변수의 메모리 주소가 전달된다. 함수 내부에서 수정한 내용은 전달된 슬라이스 원본에 그대로 반영된다. 또, 크기가 큰 슬라이스를 인자로 넘겨도 복사과정이 없어서 상대적으로 성능상 디메리트가 적다.

슬라이스는 리터럴과 make를 이용해 각각 생성할 수 있다.

literal := []int{1, 2, 3, 4, 5}

made := make([]int, 5) // 길이가 5인 슬라이스를 생성한다.

literal[1:3] // 슬라이스는 이렇게 원소를 가져올 수 있다. 이 부분은 파이썬과 비슷하다. 리슬라이싱(re-slicing)이라 한다.

원본 슬라이스와 리슬라이싱한 슬라이스는 동일한 메모리 주소를 참조한다. (복사본을 만들지는 않는다) 리슬라이싱을 일부만 하더라도 원본 슬라이스가 계속 메모리에 적재되어 있게 된다.

슬라이스에는 capacity와 length라는 서로 다른 두 속성이 존재한다. capacity는 해당 슬라이스에 부여되어 있는 공간의 크기다. 공간의 크기만큼 원소가 들어있을 필요는 없다. 공간의 크기를 초과해 원소를 삽입하면, Go가 알아서 공간을 2배로 늘린다.

길이는 공간에 담긴 원소의 개수이다. {1, 2, 3, empty, empty}라면 길이는 3 공간은 5다.

슬라이스는 자동으로 초기화된다. int 타입이라면 0이 기본값이고, bool이라면 false가 기본값, string이라면 ""가 기본값이 된다.

한편 2차원 이상의 슬라이스에서 원소는 슬라이스고, 기본값은 nil이다.

슬라이스에 원소를 추가할 때는 append를 이용한다.

t := make([]int, 5)
t = append(t, 2)

바이트 슬라이스

byte 슬라이스, 즉 byte 타입의 슬라이스다.

s := make([]byte, 5)

바이트 슬라이스는 주로 문자열을 저장하는 데 사용된다. 문자열(string)과 바이트 슬라이스는 상호 변환이 간편하다.


내용이 길어질 것 같아, map 부터는 다음에 이어서 정리한다.