ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Golang] 구조체 (struct)
    언어/Golang 2017. 2. 15. 20:03

    구조체는 필드들을 묶어놓은 것으로 다른 언어들의 구조체, 클래스, 레코드 등과 비슷한 역할을 합니다. 구조체를 이용하면 더 복잡한 자료형을 정의할 수 있습니다. 자료를 네트워크를 통하여 전송하거나 파일에 저장하고 불러오는 경우에는 직렬화 및 역직렬화 기법을 활용해야 합니다. JSON은 이런 직렬화 및 역직렬화 형식 중에 하나로, 복잡한 구조체를 어떻게 JSON 형태로 직렬화하고 역직렬화할 수 있는지도 확인해봅니다.

    구조체란?

    필드들의 모음 혹은 묶음을 구조체라고 합니다. 명명된 구성요소들을 필드라고 합니다. 배열이 서로 같은 자료형의 자료들을 묶어놓은 것이라면 구조체는 서로 다른 자료형의 자료들도 묶을 수 있습니다.

    선언

    var task = struct {
            title string
            done bool
            due *time.Time
        }{"laundry", false, nil}

    구조체는 위와 같이 선언과 동시에 값을 넣을 수 있습니다. task란 구조체는 title이란 이름의 string 타입, done 이름의 bool 타입, due 이름의 *time.Time 타입이 존재하고 title에는 "laundry" 값을, done 에는 false 값을 due 에는 nil 값을 선언했습니다.


    아래에서 구조체를 분해해 가면서 설명하겠습니다.

    type Task struct {
            title string
            done bool
            due *time.Time
        }

    자료형은 struct {...} 부분입니다. 위는 명명된 구조체로 Task란 구조체를 타입으로 선언했습니다.


    선언을 먼저 한 다음, 그 후에 값을 설정할 수 있습니다.

    tempTask := Task{}
    tempTask.title = "제목"


    아래와 같이 Task 변수를 선언할 수 있습니다.

    var tempTask Task


    순서대로 값을 담아서 정의할 수 있습니다.

    var tempTask = Task{"laundry", false, nil}


    아래와 같이 원하는 필드만 값을 넣을 수 있습니다. 넣지 않은 필드들은 기본값으로 설정됩니다. 기본값은 정수는 0, bool은 false, 문자열은 빈 문자열 등입니다.

    var tempTask = Task{title: "laundry"}
    var tempTask = Task{title: "laundry", done: true}


    만약 한 줄이 아닌 여러 줄로 표현하고 싶다면 아래와 같이 표현합니다. 주의할 점은 필드 마지막에 쉼표(,)를 붙여야 합니다. 쉼표가 없을 경우, 세미콜론(;)이 붙은 것으로 인식되어 오류가 발생합니다.

    var tempTask = Task{
            title: "laundry", 
            done: true,
        }


    Go 내장함수인 new()를 사용하여 모든 필드를 zero value로 초기화하고 Task 객체의 포인터(*Task)를 반환할 수도 있습니다. 반환된 객체는 포인터지만 Go 내부적으로 알아서 처리하기 때문에 해당 구조체의 값에 접근할 때엔 .을 동일하게 사용합니다. 

    tempTask := new(Task)
    tempTask.title = "제목"


    이러한 구조체를 다른 함수의 파라미터로 전달하면 해당 구조체의 포인터 값이 전달되는 것이 아닌 객체를 복사한 값 형태로 전달되기 때문에 다른 함수에서 해당 구조체를 받고 수정을 원한다면 포인터를 넘겨야 하므로 new()로 선언하는 것이 좋습니다.

    생성자 선언

    구조체가 선언될 때, 내부의 필드에 초기값을 선언하고 싶으면 아래와 같이 선언하면 됩니다.

    package main
     
    type Article struct {
        title string
    	related map[int]string
    }
     
    //생성자 함수 정의
    func newArticle() *Article {
        article := newArticle{}
        article.title = map[int]string{}
    	article.related = map[int]string{}
        return &article //포인터 전달
    }
     
    func main() {
        article := newArticle() // 생성자 호출
        article.data[1] = "연관기사제목1"
    }


    댓글