요약 - 연락처
Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 107개 중 18번째.
챌린지
쉬움이번 장에서 배운 사용자 정의 타입, 중첩 구조체, 구조체 태그, 그리고 제로 값(zero values) 개념을 모두 활용하여 연락처 관리 시스템을 구축해 봅시다.
코드는 다음 두 개의 파일로 구성됩니다:
contact.go: 의미 있는 사용자 정의 타입과 적절한 JSON 포맷을 사용하여 연락처 데이터 모델을 정의합니다:- 코드의 가독성을 높이기 위해
string을 기반으로 하는 사용자 정의 타입Phone과Email을 생성합니다. Street,City,Country필드를 가진Address구조체를 정의하고, 각 필드에 적절한 JSON 태그를 추가합니다.Name(string),Phone(사용자 정의 Phone 타입),Email(사용자 정의 Email 타입), 그리고Address(중첩 구조체)를 포함하는Contact구조체를 정의합니다.phone과email필드가 비어 있을 경우 JSON 결과에서 제외되도록 JSON 태그를 사용하세요.
- 코드의 가독성을 높이기 위해
main.go: 입력으로부터 연락처 정보를 읽어Contact인스턴스를 생성하고, 이를 포맷팅된 JSON으로 출력합니다. 일부 연락처는 정보가 누락될 수 있으며, 이 경우 제로 값과omitempty가 이를 적절히 처리하도록 합니다.
다음과 같은 입력이 제공됩니다:
- Line 1: 연락처 이름
- Line 2: 전화번호 (비어 있을 수 있음)
- Line 3: 이메일 주소 (비어 있을 수 있음)
- Line 4: 도로명 주소
- Line 5: 도시
- Line 6: 국가
json.MarshalIndent를 사용하고 들여쓰기는 공백 두 개로 설정하세요. 결과 JSON 문자열을 출력합니다.
예를 들어, 이름이 Alice Smith이고 전화번호는 없으며, 이메일은 alice@example.com, 주소는 123 Main St, 도시 Boston, 국가 USA인 연락처가 주어지면 출력은 다음과 같아야 합니다:
{
"name": "Alice Smith",
"email": "alice@example.com",
"address": {
"street": "123 Main St",
"city": "Boston",
"country": "USA"
}
}전화번호가 비어 있기 때문에 phone 필드가 전혀 나타나지 않는 것을 확인하세요. 이것이 바로 omitempty 태그의 역할입니다!
직접 해보기
package main
import (
"bufio"
"encoding/json"
"fmt"
"os"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// 이름 읽기
scanner.Scan()
name := scanner.Text()
// 전화번호 읽기 (비어있을 수 있음)
scanner.Scan()
phone := scanner.Text()
// 이메일 읽기 (비어있을 수 있음)
scanner.Scan()
email := scanner.Text()
// 도로명 주소 읽기
scanner.Scan()
street := scanner.Text()
// 도시 읽기
scanner.Scan()
city := scanner.Text()
// 국가 읽기
scanner.Scan()
country := scanner.Text()
// TODO: 입력값을 사용하여 Contact 인스턴스 생성
// 각 필드에 커스텀 타입인 Phone과 Email을 사용하세요
// street, city, country를 포함하는 중첩된 Address 구조체를 생성하세요
// TODO: json.MarshalIndent를 사용하여 contact를 JSON으로 변환
// 접두사(prefix)로 ""를 사용하고, 들여쓰기(indent)로 " "(공백 두 개)를 사용하세요
// TODO: JSON 문자열 출력
_ = name
_ = phone
_ = email
_ = street
_ = city
_ = country
}
객체 지향 프로그래밍의 모든 레슨
8에러 처리와 OOP
error 인터페이스사용자 정의 에러 타입에러 래핑 (fmt.Errorf)센티넬 에러errors.Is()와 errors.As()Panic, Defer, Recover요약 - 파일 파서