Go - 구조체: 초보자 가이드

안녕하세요, 미래의 프로그래머 여러분! 오늘 우리는 Go 언어의 구조체 세계로 흥미로운 여정을 떠납니다. coding을 전혀 해보지 않았다면 걱정하지 마세요 - 저는 친절한 가이드로서, 이 주제를 단계별로 탐구해 나갈 것입니다. 그럼 커피(또는 차, 당신이 좋아하는 음료를) 한 잔을 마시면서, 시작해 보겠습니다!

Go - Structures

Go에서의 구조체는 무엇인가요?

시작하기 전에 구조체가 무엇인지 이해해 보겠습니다. 디지털 주소록을 만들고 있다고 상상해 보세요. 각 연락처에 이름, 전화번호, 이메일 주소 등 다양한 정보를 저장해야 합니다. Go에서의 구조체는 이러한 관련 데이터를 단일 이름 아래 그룹화할 수 있게 해줍니다. 마치 당신의 특정 필요에 맞춘 맞춤형 데이터 타입을 만드는 것과 같습니다.

이제 코드로 손을 더러 만들어 보겠습니다!

구조체 정의하기

Go에서 구조체를 정의하려면 type 키워드 뒤에 구조체 이름과 struct 키워드를 사용합니다. 디지털 주소록을 위한 구조체를 다음과 같이 정의할 수 있습니다:

type Contact struct {
Name        string
PhoneNumber string
Email       string
}

이 예제에서 우리는 Contact이라는 이름의 구조체를 만들었으며, 세 개의 필드 Name, PhoneNumber, Email을 모두 string 타입으로 가집니다.

이를 간단히 설명하자면:

  • type은 Go에게 우리가 새로운 타입을 정의하고 있다고 알립니다.
  • Contact은 우리가 구조체에 부여한 이름입니다.
  • struct은 이 타입이 구조체임을 나타냅니다.
  • 중괄호 안에서 우리는 필드를 나열하며, 각 필드는 자신의 타입을 가집니다.

구조체 멤버 접근하기

이제 우리가 정의한 구조체를 인스턴스화하고 그 멤버에 접근해 보겠습니다:

func main() {
myFriend := Contact{
Name:        "Alice",
PhoneNumber: "123-456-7890",
Email:       "[email protected]",
}

fmt.Println("Name:", myFriend.Name)
fmt.Println("Phone:", myFriend.PhoneNumber)
fmt.Println("Email:", myFriend.Email)
}

이 코드에서 벌어지고 있는 일은 다음과 같습니다:

  1. 우리는 새로운 ContactmyFriend를 만듭니다.
  2. 그 필드에 특정 값을 초기화합니다.
  3. 점 표기법(myFriend.Name 등)을 사용하여 각 필드에 접근하고 인쇄합니다.

이 코드를 실행하면 Alice의 연락처 정보가 인쇄됩니다. 이쁘지 않나요?

구조체를 함수 인수로 사용하기

구조체를 함수와 함께 사용하면 더욱 강력해집니다. 연락처 정보를 인쇄하는 함수를 만들어 보겠습니다:

func printContact(c Contact) {
fmt.Printf("Name: %s\nPhone: %s\nEmail: %s\n", c.Name, c.PhoneNumber, c.Email)
}

func main() {
myFriend := Contact{
Name:        "Bob",
PhoneNumber: "098-765-4321",
Email:       "[email protected]",
}

printContact(myFriend)
}

이 예제에서:

  • 우리는 printContact 함수를 정의하고, 그것은 Contact를 인수로 받습니다.
  • main() 함수에서 우리는 Bob의 새로운 Contact를 만듭니다.
  • myFriendprintContact에 전달하여 Bob의 정보를 인쇄합니다.

이 접근 방식은 코드를 재사용하고 데이터를 효율적으로 처리하는 데 도움이 됩니다.

포인터로 구조체 사용하기

이제 포인터에 대해 이야기해 보겠습니다. 포인터는 다른 변수의 메모리 주소를 저장하는 변수입니다. 구조체와 함께 사용할 때 특히 유용합니다. 원본 데이터를 수정하고 싶을 때 특히 그렇습니다.

다음은 예제입니다:

func updateEmail(c *Contact, newEmail string) {
c.Email = newEmail
}

func main() {
myFriend := Contact{
Name:        "Charlie",
PhoneNumber: "111-222-3333",
Email:       "[email protected]",
}

fmt.Println("Before update:", myFriend.Email)
updateEmail(&myFriend, "[email protected]")
fmt.Println("After update:", myFriend.Email)
}

이를 간단히 설명하자면:

  1. 우리는 updateEmail 함수를 정의하고, 그것은 Contact의 포인터와 새로운 이메일 주소를 인수로 받습니다.
  2. main() 함수에서 우리는 Charlie의 Contact를 만듭니다.
  3. 우리는 Charlie의 원래 이메일을 인쇄합니다.
  4. 우리는 updateEmail을 호출하고, myFriend의 주소와 새로운 이메일을 전달합니다.
  5. 우리는 Charlie의 이메일을 다시 인쇄하여 변경 사항을 확인합니다.

myFriend 앞의 &myFriend의 메모리 주소를 가져오며, 이는 updateEmail의 포인터에 필요합니다.

포인터를 사용하면 원본 Contact을 직접 수정할 수 있어 복사본을 다루지 않습니다.

Go에서의 메서드

다음은 구조체와 함께 사용되는 일부 일반 메서드 목록입니다:

메서드 설명 예제
정의 구조체에 메서드 정의 func (c Contact) FullName() string
리시버 메서드와 관련된 구조체 (c Contact) 위의 예제
포인터 리시버 메서드가 구조체를 수정할 수 있게 하기 func (c *Contact) UpdateEmail(newEmail string)
메서드 호출 구조체에 메서드 호출 myFriend.FullName()

결론

축하합니다! 지금까지 Go의 구조체 세계로 첫 걸음을 뗐습니다. 우리는 구조체를 정의하고, 그 멤버에 접근하며, 함수와 함께 사용하고, 포인터를 사용하는 방법을 배웠습니다.

프로그래밍을 배우는 것은 새로운 언어를 배우는 것과 같아서, 연습과 인내가 필요합니다. 모든 것이 바로 이해되지 않는다면 실망하지 마세요. 이 개념들을 실험하고 자신만의 구조체를 만들어 보세요. 그리고 가장 중요한 것은, 즐겁게 해야 합니다!

제 경험상, 학습 과정을 즐기는 학생들이 최고의 프로그래머가 되는 경향이 있습니다. 도전을 받아들이고, 승리를 축하하고, 계속 코딩을 하세요!

다음에 만날 때까지, 행복한 Go를 기원합니다!

Credits: Image by storyset