구조체 Map
Coddy GO 여정의 로직 & 흐름 섹션에 포함된 레슨 — 68개 중 26번째.
맵의 값으로 구조체를 저장하면 맵은 매우 강력해집니다. 이 패턴을 사용하면 의미 있는 키를 사용하여 복잡하고 구조화된 데이터를 정리함으로써 쉽게 조회하고 검색할 수 있습니다.
구조체를 맵의 값으로 사용하면, 기본적으로 각 키가 전체 데이터 레코드를 가리키는 컬렉션을 생성하게 됩니다. 이러한 맵을 선언하고 초기화하는 방법은 다음과 같습니다:
type Student struct {
ID int
Grade string
}
students := map[string]Student{
"Alice": {ID: 101, Grade: "A"},
"Bob": {ID: 102, Grade: "B"},
}다른 맵 작업과 마찬가지로 맵을 통해 구조체 데이터에 접근하고 작업할 수 있습니다. 학생의 정보를 가져오려면 학생의 이름을 키로 사용하면 됩니다:
alice := students["Alice"]
fmt.Println(alice.ID) // 출력: 101
fmt.Println(alice.Grade) // 출력: A이 패턴은 사용자 프로필, 제품 카탈로그 또는 구성 설정과 같이 구조화된 데이터와 빠른 키 기반 액세스가 모두 필요한 관련 데이터 컬렉션을 저장하기 위해 Go 애플리케이션에서 매우 흔히 사용됩니다.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
챌린지
쉬움구조체를 값으로 사용하는 맵을 활용하여 학생 성적 관리 시스템을 만드세요. 이 챌린지는 효율적인 조회 및 검색을 위해 의미 있는 키를 사용하여 복잡한 학생 데이터를 구성하는 방법을 보여줍니다.
두 개의 입력을 받게 됩니다:
- 학생 수를 나타내는 문자열 (예:
"4") - 다음 형식의 학생 데이터를 포함하는 문자열:
"name1:id1:grade1,name2:id2:grade2,name3:id3:grade3"(예:"Alice:101:A,Bob:102:B,Charlie:103:C,Diana:104:A")
수행해야 할 작업은 다음과 같습니다:
- 다음 필드를 가진
Student구조체를 정의합니다:ID(int) - 학생의 ID 번호Grade(string) - 학생의 문자 성적
- 키는 학생 이름(string)이고 값은
Student구조체인 맵을 생성합니다. - 두 번째 입력에서 학생 데이터를 파싱합니다:
- 입력 문자열을 쉼표로 분리하여 개별 학생 항목을 얻습니다.
- 각 항목을 콜론으로 분리하여 이름, ID, 성적을 구분합니다.
- ID 문자열을 정수로 변환합니다.
Student구조체를 생성하고 이름을 키로 하여 맵에 추가합니다.
- 모든 학생을 이름의 알파벳 순서대로 다음 형식으로 표시합니다:
"[name]: ID [id], Grade [grade]" - 성적 통계를 계산하고 표시합니다:
- 각 성적(A, B, C, D, F)별 학생 수를 셉니다.
- 데이터에 존재하는 각 성적의 개수를 다음 형식으로 표시합니다:
"Grade [grade]: [count] students" - 성적을 알파벳 순서(A, B, C, D, F)로 표시합니다.
- ID가 가장 높은 학생을 찾아 다음 형식으로 표시합니다:
"Highest ID: [name] ([id])" - 총 학생 수를 표시합니다:
"Total students: [count]"
ID 문자열을 정수로 변환하려면 strconv 패키지를 사용하고, 학생 이름을 알파벳 순으로 정렬하려면 sort 패키지를 사용하세요. 이 챌린지는 구조체 값을 가진 맵이 의미 있는 식별자를 사용하여 복잡한 데이터 컬렉션을 구성하고 액세스하는 효율적인 방법을 어떻게 제공하는지 보여줍니다.
치트 시트
맵은 구조체를 값으로 저장할 수 있어, 각 키가 전체 데이터 레코드를 가리키는 컬렉션을 생성할 수 있습니다:
type Student struct {
ID int
Grade string
}
students := map[string]Student{
"Alice": {ID: 101, Grade: "A"},
"Bob": {ID: 102, Grade: "B"},
}키를 사용하여 맵을 통해 구조체 데이터에 접근합니다:
alice := students["Alice"]
fmt.Println(alice.ID) // 출력: 101
fmt.Println(alice.Grade) // 출력: A이 패턴은 사용자 프로필, 제품 카탈로그 또는 구성 설정과 같이 구조화된 데이터와 빠른 키 기반 접근이 모두 필요한 관련 데이터 컬렉션을 저장하는 데 일반적으로 사용됩니다.
직접 해보기
package main
import (
"fmt"
)
func main() {
// 입력 읽기
var numStudentsStr string
var studentData string
fmt.Scanln(&numStudentsStr)
fmt.Scanln(&studentData)
// TODO: 여기에 Student 구조체 정의
// TODO: 학생들을 저장할 맵 생성 (이름을 키로, Student 구조체를 값으로)
// TODO: 학생 데이터를 파싱하고 맵에 채우기
// TODO: 모든 학생을 이름순(알파벳순)으로 표시
// TODO: 성적 통계 계산 및 표시
// TODO: ID가 가장 높은 학생을 찾아 표시
// TODO: 총 학생 수 표시
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.