구조체에 메서드 정의하기
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)이며, greet를 Person 타입의 메서드로 만듭니다. 변수 p는 메서드가 호출되는 Person의 인스턴스를 나타내며, 이는 다른 언어의 this와 유사합니다.
그런 다음 Person 인스턴스에서 점 표기법(dot notation)을 사용하여 메서드를 호출할 수 있으며, 이를 통해 구조체에 해당 데이터와 관련된 작업을 수행할 수 있는 기능을 부여할 수 있습니다.
챌린지
쉬움이 챌린지에서는 간단한 도서 관리 시스템을 만들면서 구조체(struct)에 메서드를 정의하는 연습을 하게 됩니다. Book 구조체를 생성하고, 책의 정보를 표시할 수 있는 메서드들을 정의해 보세요.
중요 참고 사항: 책 제목과 저자 이름에는 공백이 포함될 수 있으므로, 입력의 전체 줄을 읽기 위해 bufio.Scanner를 사용해야 합니다. fmt.Scanln 함수는 첫 번째 공백에서 읽기를 중단하므로, 여러 단어로 된 제목이나 저자 이름을 제대로 처리하지 못합니다. bufio.NewScanner(os.Stdin)를 사용하고 scanner.Scan()을 호출한 뒤 scanner.Text()를 호출하여 전체 줄을 읽으세요.
세 가지 입력을 받게 됩니다:
- 책 제목을 나타내는 문자열 (예:
"The Go Programming Language") - 저자 이름을 나타내는 문자열 (예:
"Alan Donovan") - 페이지 수를 나타내는 문자열 (예:
"380")
여러분의 과제는 다음과 같습니다:
- 세 개의 필드를 가진
Book구조체를 정의합니다:Title(string),Author(string),Pages(int) "Title: [title], Author: [author], Pages: [pages]"형식으로 책 정보를 출력하는 값 리시버(value receiver)를 가진displayInfo메서드를 생성합니다."[title] by [author]"형식의 문자열을 반환하는 값 리시버를 가진getDescription메서드를 생성합니다.bufio.Scanner를 사용하여 입력 줄을 올바르게 읽습니다:- 스캐너 생성:
scanner := bufio.NewScanner(os.Stdin) - 각 입력 줄에 대해:
scanner.Scan()을 호출한 후scanner.Text()를 호출 - 이렇게 하면 공백이 포함된 제목과 저자 이름을 정확하게 읽을 수 있습니다.
- 스캐너 생성:
- 입력값을 파싱하여
Book인스턴스를 생성합니다. displayInfo메서드를 호출하여 책 정보를 출력합니다.getDescription메서드를 호출하고 반환된 설명을 출력합니다.
메서드는 리시버 변수를 사용하여 구조체 필드에 접근하고 각각의 작업을 수행해야 합니다. 값 리시버를 가진 메서드는 구조체 인스턴스의 복사본을 가지고 작업한다는 점을 기억하세요.
직접 해보기
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 인스턴스를 생성하고 메서드를 호출하세요
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.