구조체에 메서드 정의하기
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메서드를 호출하고 반환된 설명을 출력합니다.
메서드는 리시버 변수를 사용하여 구조체 필드에 접근하고 각각의 작업을 수행해야 합니다. 값 리시버를 가진 메서드는 구조체 인스턴스의 복사본을 가지고 작업한다는 점을 기억하세요.
치트 시트
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)은 greet를 Person 타입의 메서드로 만듭니다. 변수 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 인스턴스를 생성하고 메서드를 호출하세요
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.