데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      (go-05) Go Struct

      seungkyua 22.10.26
      594 6 2

      Slice 와 Map 은 값을 여러개 가질 수 있는 타입이다. 그러나 선언한 타입과 같은 타입만 저장해야 하는 문제가 있다. 또한 class 와 같이 다양한 멤버 변수를 가질 수 없다.

      그래서 Go 에서는 다양한 값을 가질 수 있도록 Struct 타입을 지원한다.

      Struct

      struct 의 를 만들려면 type 키워드, struct명, struct 키워드로 만든다. 그리고 그 안에 다양한 변수를 포함할 수 있으며 {} 로 묶어주면 된다.

      type 으로 struct 를 선언했으면 그 자체가 하나의 type 이 된다. 그럼 var 로 새로운 만든 type을 활용하여 변수 선언을 할 수 있다.


      아래와 같이 name 과 age 를 필드로 갖는 person 이라는 새로운 타입을 선언하고 jina 와 jamie 라는 변수를 만들 수 있다.

      변수 선언만 한 struct 내의 필드들은 zero 값을 갖는다.

      person 타입의 변수를 초기화 할 때는 {} 로 초기화 할 수 도 있다.

      package main
      
      import "fmt"
      
      func main() {
      	type person struct {
      		name string
      		age  int
      	}
      
      	var jina person
      	fmt.Println(jina)
      
      	jamie := person{}
      	fmt.Println(jamie)
      }
      
      --- output ---
      { 0}
      { 0}

      혹은 값을 지정하여 초기화 할 수 있다.

      값을 지정하여 초기화할 때는 json 타입으로 변수: 값 으로 지정하거나 값 으로 지정할 수 있다. 변수 사이는 , 로 구분하며, 마지막 변수 끝에도 , 를 넣어야 한다.

      Go 에서는 타입을 선언할 때는 { 앞에 공백을 넣지만, 값을 초기화할 때는 { 앞에 공백을 넣지 않는다. 또한 타입을 선언할 때는 필드 사이에 , 가 없지만, 값을 초기화 할 때는 필드값 사이에 , 를 넣는다.

      jina := person{
      	name: "Jina",
      	age:  21,
      }
      fmt.Println(jina)
      
      jamie := person{
      	"Jamie",
      	18,
      }
      fmt.Println(jamie)
      
      --- output ---
      {Jina 21}
      {Jamie 18}

      초기화는 아래와 같이 할 수 도 있다.

      단, jina[”age”] 와 같이 인덱싱을 통한 접근은 지원하지 않는다.

      var jina person
      jina.name = "Jina"
      jina.age = 21
      // jina["age"] = 21  // 인덱싱은 지원하지 않음
      
      fmt.Println(jina.name)
      
      --- output ---
      Jina

      Anonymous struct

      type 이 없는 struct 도 가능하다.

      이 때는 type 키워드를 쓰지 않는다.

      아래와 같이 바로 jina 라는 변수를 struct 형태로 지정하고 . 을 통해 값을 지정할 수 있다. 혹은 {} 를 사용하여 jamie 변수를 선언하면서 초기 값을 지정할 수 있다.

      var jina struct {
      		name string
      		age  int
      }
      
      jina.name = "Jina"
      jina.age = 21
      fmt.Println(jina)
      
      jamie := struct {
      	name string
      	age  int
      }{
      	name: "Jamie",
      	age:  18,
      }
      fmt.Println(jamie)
      
      --- output ---
      {Jina 21}
      {Jamie 18}

      Struct 비교

      go 에서는 type 이 같으면 대입(=), 비교(==) 를 할 수 있다. 하지만 type 이 다르면 비교나 대입을 할 수 없다.

      하지만 type 을 convert 하여 맞춰 준다면 대입, 비교가 가능하다.

      jina 와 jina2 는 type 이 같고 필드 값도 같다. 그래서 비교를 하면 true 값이 나온다.

      하지만 jamie 는 jina 와 type 이 같지만 필드 값이 달라서 비교를 하면 false 값이 나온다.

      jina := person{
      	name: "Jina",
      	age:  21,
      }
      
      jina2 := person{
      	name: "Jina",
      	age:  21,
      }
      fmt.Println(jina == jina2)
      
      jamie := person{
      	name: "Jamie",
      	age:  18,
      }
      fmt.Println(jina == jamie)
      
      --- output ---
      true
      false

      새로운 anotherPerson type 을 만들어서 살펴보자.

      아래와 같이 jina 는 person type 이고 jamie 는 anotherPerson type 이므로 서로 type 이 달라서 비교나 대입을 하면 에러가 난다.

      
      type anotherPerson struct {
      	name string
      	age  int
      }
      
      jina := person{
      	name: "Jina",
      	age:  21,
      }
      fmt.Println(jina)
      
      jamie := anotherPerson{
      	name: "Jamie",
      	age:  18,
      }
      
      fmt.Println(jina == jamie)
      
      --- output ---
      ./main.go:88:19: invalid operation: jina == jamie (mismatched types person and anotherPerson)

      이번에는 jamie 를 person type 으로 바꾸는 type converson 을 하여 비교하여 보자.

      타입 변환도 잘 되고 값도 정상적으로 대입되는 것을 알 수 있다.

      type anotherPerson struct {
      	name string
      	age  int
      }
      
      jina := person{
      	name: "Jina",
      	age:  21,
      }
      fmt.Println(jina)
      
      jamie := anotherPerson{
      	name: "Jamie",
      	age:  18,
      }
      
      jina = person(jamie)
      fmt.Println(jina)
      
      --- output ---
      {Jina 21}
      {Jamie 18}

      한가지 중요한 점은 struct 사이에 타입 변환은 타입, 필드명, 필드 순서, 필드 갯수 가 모두 동일해야 가능하다.

      그럼 type 으로 선언된 struct 와 anonymous struct 는 타입을 제외한 필드명, 필드 순서, 필드 갯수 가 같다면 대입이나 비교, 타입 변환이 가능할까?

      정답은 가능하다이다.

      jina := person{
      	name: "Jina",
      	age:  21,
      }
      fmt.Println(jina)
      
      var jamie struct {
      	name string
      	age  int
      }
      
      jamie = jina
      fmt.Println(jina == jamie)
      
      --- output ---
      {Jina 21}
      true
      jamie := struct {
      	name string
      	age  int
      }{
      	name: "Jamie",
      	age:  18,
      }
      
      var jina person
      
      jina = person(jamie)
      fmt.Println(jina)
      fmt.Println(jina == jamie)
      
      --- output --
      {Jamie 18}
      true

      사실 person(jamie) 로 타입 변환을 하지 않아도 정상적으로 동작한다.

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      seungkyua 님의 최신 블로그

      더보기
      동영상 기고하기