Menu
Coddy logo textTech

구조체에 메서드 정의하기

Coddy GO 여정의 로직 & 흐름 섹션에 포함된 레슨 — 68개 중 6번째.

Go에서 메서드는 특정 타입에 속하는 함수입니다. 독립적으로 존재하는 일반 함수와 달리, 메서드는 구조체(struct)에 연결되어 사용자 정의 데이터 타입에 대한 동작을 정의할 수 있게 해줍니다.

메서드를 정의하려면 func 키워드와 메서드 이름 사이에 리시버(receiver)를 배치합니다. 리시버는 메서드가 어떤 타입에 속하는지를 지정합니다.

type Person struct {
    Name string
    Age  int
}

func (p Person) greet() {
    fmt.Printf("Hello, my name is %s\n", p.Name)
}

이 예제에서 (p Person)은 수신자(receiver)이며, greetPerson 타입의 메서드로 만듭니다. 변수 p는 메서드가 호출되는 Person의 인스턴스를 나타내며, 이는 다른 언어의 this와 유사합니다.

그런 다음 Person 인스턴스에서 점 표기법(dot notation)을 사용하여 메서드를 호출할 수 있으며, 이를 통해 구조체에 해당 데이터와 관련된 작업을 수행할 수 있는 기능을 부여할 수 있습니다.

quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

challenge icon

챌린지

쉬움

이 챌린지에서는 간단한 도서 관리 시스템을 만들면서 구조체(struct)에 메서드를 정의하는 연습을 하게 됩니다. Book 구조체를 생성하고, 책의 정보를 표시할 수 있는 메서드들을 정의해 보세요.

중요 참고 사항: 책 제목과 저자 이름에는 공백이 포함될 수 있으므로, 입력의 전체 줄을 읽기 위해 bufio.Scanner를 사용해야 합니다. fmt.Scanln 함수는 첫 번째 공백에서 읽기를 중단하므로, 여러 단어로 된 제목이나 저자 이름을 제대로 처리하지 못합니다. bufio.NewScanner(os.Stdin)를 사용하고 scanner.Scan()을 호출한 뒤 scanner.Text()를 호출하여 전체 줄을 읽으세요.

세 가지 입력을 받게 됩니다:

  • 책 제목을 나타내는 문자열 (예: "The Go Programming Language")
  • 저자 이름을 나타내는 문자열 (예: "Alan Donovan")
  • 페이지 수를 나타내는 문자열 (예: "380")

여러분의 과제는 다음과 같습니다:

  1. 세 개의 필드를 가진 Book 구조체를 정의합니다: Title (string), Author (string), Pages (int)
  2. "Title: [title], Author: [author], Pages: [pages]" 형식으로 책 정보를 출력하는 값 리시버(value receiver)를 가진 displayInfo 메서드를 생성합니다.
  3. "[title] by [author]" 형식의 문자열을 반환하는 값 리시버를 가진 getDescription 메서드를 생성합니다.
  4. bufio.Scanner를 사용하여 입력 줄을 올바르게 읽습니다:
    • 스캐너 생성: scanner := bufio.NewScanner(os.Stdin)
    • 각 입력 줄에 대해: scanner.Scan()을 호출한 후 scanner.Text()를 호출
    • 이렇게 하면 공백이 포함된 제목과 저자 이름을 정확하게 읽을 수 있습니다.
  5. 입력값을 파싱하여 Book 인스턴스를 생성합니다.
  6. displayInfo 메서드를 호출하여 책 정보를 출력합니다.
  7. getDescription 메서드를 호출하고 반환된 설명을 출력합니다.

메서드는 리시버 변수를 사용하여 구조체 필드에 접근하고 각각의 작업을 수행해야 합니다. 값 리시버를 가진 메서드는 구조체 인스턴스의 복사본을 가지고 작업한다는 점을 기억하세요.

치트 시트

Go의 메서드는 특정 타입에 속하는 함수입니다. 이들은 func 키워드와 메서드 이름 사이에 리시버(receiver)를 사용하여 정의됩니다:

type Person struct {
    Name string
    Age  int
}

func (p Person) greet() {
    fmt.Printf("Hello, my name is %s\n", p.Name)
}

리시버 (p Person)greetPerson 타입의 메서드로 만듭니다. 변수 p는 메서드가 호출되는 인스턴스를 나타냅니다.

메서드는 구조체 인스턴스에서 점 표기법(dot notation)을 사용하여 호출되며, 이를 통해 구조체가 자신의 데이터와 관련된 동작을 수행할 수 있게 합니다.

직접 해보기

package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
)

// TODO: 여기에 Book 구조체를 정의하세요

// TODO: 여기에 displayInfo 메서드를 정의하세요

// TODO: 여기에 getDescription 메서드를 정의하세요

func main() {
    // 입력 라인을 읽기 위한 스캐너 생성
    scanner := bufio.NewScanner(os.Stdin)
    
    // 제목 읽기
    scanner.Scan()
    title := scanner.Text()
    
    // 저자 읽기
    scanner.Scan()
    author := scanner.Text()
    
    // 페이지 수 읽기
    scanner.Scan()
    pagesStr := scanner.Text()
    
    // 페이지 문자열을 정수로 변환
    pages, _ := strconv.Atoi(pagesStr)
    
    // TODO: Book 인스턴스를 생성하고 메서드를 호출하세요
    
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

로직 & 흐름의 모든 레슨