05 struct와 slice

Go language course for beginners


구조체

Go에는 struct라고 불리는 구조체 타입이 있습니다.

구조체는 여러 필드들의 집합입니다.

에를 들어 Person 구조체는 이름과 나이를 가지고 있습니다.

type Person struct {
    Name string
    Age  int
}
type 구조체이름 struct {
    필드1 타입
    필드2 타입
    필드3 타입
}

구조체는 struct 키워드를 사용하여 정의할 수 있습니다.

구조체의 인스턴스를 생성하려면 구조체이름{ 필드1: 값1, 필드2: 값2, ... } 형태로 생성합니다.

만약 구조체의 필드를 생략하면 해당 필드는 Zero Value로 초기화됩니다.

구조체의 필드를 모두 사용하는 경우에는 필드명을 생략하고 값을 직접 지정할 수 있습니다.

p := Person{"Lemon Mint", 2}

Zero Value로 초기화된 구조체를 생성하려면 구조체이름{} 형태로 생성합니다.

p := Person{}

구조체의 필드는 ".필드명" 형태로 접근할 수 있습니다.

type Person struct {
    Name string
    Age  int
}

func main() {
    p := Person{Name: "Lemon Mint", Age: 2}
    fmt.Println(p.Name)
    fmt.Println(p.Age)
}

슬라이스

Go에서의 슬라이스는 크기(cap)와 길이정보(len)를 가진 배열입니다.

여기서 크기(cap)는 슬라이스에 저장할 수 있는 최대 개수입니다.

길이(len)는 슬라이스에 저장된 개수입니다.

또한 반드시 슬라이스의 길이(len)은 슬라이스의 크기(cap)보다 작거나 같아야 합니다.

슬라이스는 make, 슬라이스 리터럴 또는 배열 또는 슬라이스의 슬라이싱(slicing)을 통해 생성할 수 있습니다.

슬라이스 리터럴

슬라이스 리터럴은 슬라이스의 값의 나열로 슬라이스를 생성합니다.

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

make

make 함수를 사용하여 슬라이스를 생성할 수 있습니다.

s := make([]int, 5)

슬라이스의 타입은 "[]원소타입"이며, 길이가 10인 슬라이스를 생성하려면 make([]원소타입, 10) 형태로 생성합니다.

또한 make를 사용할 때 슬라이스의 크기와 길이를 다르게 지정할 수 있습니다.

이 경우에는 make([]원소타입, 길이, 크기) 형태로 생성합니다.

슬라이싱

슬라이스나 배열은 슬라이싱을 통해 자신의 부분 슬라이스를 생성할 수 있습니다.

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

heads := s[:3]
mid := s[1:4]
tails := s[3:]

fmt.Println(heads)
fmt.Println(mid)
fmt.Println(tails)

// [1 2 3]
// [2 3 4]
// [4 5]

이렇게 생성된 부분 슬라이스는 부모 슬라이스를 참조하고 있습니다.

따라서 부모 슬라이스의 값이 변경되면 부분 슬라이스의 해당 부분도 변경됩니다.

append

Go에는 슬라이스의 길이 관리를 위한 append 함수가 제공됩니다.

append 함수는 현재 슬라이스에 원소를 추가할 공간이 있는지 확인하고 없다면 이전 슬라이스의 내용을 복사하여 새로운 슬라이스를 생성합니다.

그 후 새로운 슬라이스에 원소를 추가하고 새로운 슬라이스를 반환합니다.

원소를 추가할 공간이 남아 있다면 원소가 추가된 기존 슬라이스를 반환합니다.

슬라이스에 원소를 추가하려면 append(슬라이스, 원소1, 원소2, ...) 형태로 호출합니다.

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

s = append(s, 6, 7, 8)

fmt.Println(s)

// [1 2 3 4 5 6 7 8]

슬라이스 원소의 접근

슬라이스의 원소들은 일반적인 배열처럼 인덱스를 사용하여 접근할 수 있습니다.

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

fmt.Println(s[0])
// 1

또한 전 포스트에서 다룬것처럼 for문을 사용하여 슬라이스를 순회할 수 있습니다.

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

for i, v := range s {
    fmt.Println(i, v)
}

// 0 1
// 1 2
// 2 3
// 3 4
// 4 5

What's next?

다음 포스트에서는 맵에 대해 알아보겠습니다.