본문 바로가기
IT 초보코딩의 세계/Go 언어

Go언어의 구조체(포인터, Struct) 1장

by 조이럭키7 2023. 3. 30.
반응형

◆ 포인터

메모리 참조를 저장하는 자료형

var 변수명 *자료형

nil(null)로 초기화

package main

import "fmt"

func main() {
  var numPtr *int
   fmt.Println(numPtr)
}

 new(자료형)으로 메모리를 할당

package main

import "fmt"
func main() {
  var numPtr *int = new(int)
   fmt.Println(numPtr)
}

*포인터변수를 이용해서 할당받은 메모리를 참조

package main

import "fmt"
func main() {
  var numPtr *int = new(int)
  *numPtr = 10
   fmt.Println(numPtr)
  fmt.Println(*numPtr)
}

기존 데이터의 참조를 하고자 하는 경우는 &데이터를 이용

package main

import "fmt"
func main() {
  i := 10
  var numPtr *int = &i
   fmt.Println(numPtr)
  fmt.Println(*numPtr)
}

call by value & call by reference

함수의 매개변수로 참조형 데이터를 전달하면 call by reference

package main

import "fmt"

func callByValue(n int) {
  n = 2
  fmt.Println(n)
}

func callByReference(n * int) {
  *n = 2
  fmt.Println(*n)
}

func main() {
  var n int = 1
  callByValue(n)
  fmt.Println(n)

  callByReference(&n)
  fmt.Println(n)
}

◆ Struct(구조체)

여러 데이터의 집합

구조체에 속한 필드 이름이 소문자로 시작하면 다른 패키지에서 접근할 수 없음

선언

type myStruct struct{
  intField int
  stringField string
  sliceField []int
}

구조체 초기화

var s1 = myStruct{
  intField: 3,
  stringField: "three",
  sliceField : []int{1,2,3},
}

var s2 = myStruct{3,"three",[]int{1,2,3}}

var s3 = myStruct{}
s3.intField = 3
s3.stringField = "three"
s3.sliceField = [] int {1, 2, 3}

구조체 포인터

package main

import "fmt"

type myStruct struct{
  intField int
  stringField string
  sliceField []int
}

func main() {
  var sPtr = &myStruct{
  intField:3,
  stringField:"three",
  sliceField: []int{1,2,3},
  }
  fmt.Println(sPtr)

  var s = &myStruct{}
  s.intField = 3
  s.stringField = "three"
  s.sliceField = []int{1,2,3}
  fmt.Println(s)

  var ins = new(myStruct)
  ins.intField = 3
  ins.stringField = "three"
  ins.sliceField = []int{1,2,3}
  fmt.Println(ins)
}

생성자와 유사한 방식

package main

import "fmt"

type Rectangle struct {
  width  int
  height int
}

func NewRectangle(width, height int) *Rectangle {
  return &Rectangle{width, height} // 구조체 인스턴스를 생성한 뒤 포인터를 리턴
}

func main() {
  rect := NewRectangle(20, 10)
  fmt.Println(rect) // &{20 10}
}

타입에 연결하는 함수

func (리시버이름 * 구조체타입 또는 구조체타입) 함수이름(매개변수)리턴타입{}

package main

import "fmt"

type Rectangle struct {
  width  int
  height int
}

func (rect *Rectangle) getWidth() int {
  return rect.width
}

func (rect *Rectangle) getHeight() int {
  return rect.height
}

func main() {
  rect := Rectangle{20, 10}
  fmt.Println(rect.getWidth())
}

다음포스팅에서는 메서드와 임베디드 그리고 인터페이스에 대해서 알아보도록 하자

반응형

댓글