GO · 기초 문법
타입 별칭 & 타입 정의
기존 타입을 기반으로 새 타입을 만들어 타입 안전성을 높입니다.
기초 문법중급type-definitiontype-aliastype-safetyStringer
핵심 설명
기존 타입을 기반으로 새 타입을 만들어 타입 안전성을 높입니다.
Go code
package main
import "fmt"
// 타입 정의 — 새 타입 (메서드 추가 가능)
type Celsius float64
type Fahrenheit float64
type UserID int
type ProductID int
// 타입에 메서드 추가
func (c Celsius) ToFahrenheit() Fahrenheit {
return Fahrenheit(c*9/5 + 32)
}
func (f Fahrenheit) ToCelsius() Celsius {
return Celsius((f - 32) * 5 / 9)
}
// 컴파일 타임 타입 안전성
func findOrder(uid UserID, pid ProductID) string {
return fmt.Sprintf("user:%d, product:%d", uid, pid)
}
// 타입 별칭 — 완전히 동일한 타입
type MyInt = int // 메서드 추가 불가
// Stringer 구현
func (uid UserID) String() string {
return fmt.Sprintf("UID(%d)", int(uid))
}
func main() {
boiling := Celsius(100)
fmt.Printf("%.1f°C = %.1f°F
", boiling, boiling.ToFahrenheit())
body := Fahrenheit(98.6)
fmt.Printf("%.1f°F = %.2f°C
", body, body.ToCelsius())
// 타입 안전성
order := findOrder(UserID(1), ProductID(42))
fmt.Println(order)
// findOrder(42, 1) // 컴파일 에러!
// findOrder(ProductID(42), UserID(1)) // 컴파일 에러!
uid := UserID(123)
fmt.Println(uid) // UID(123) — Stringer 호출
}학습 팁
원시 타입을 직접 사용하는 것보다 type UserID int처럼 의미 있는 타입을 정의하면 실수로 ID를 바꿔 넣는 버그를 컴파일 타임에 잡을 수 있습니다.
주의할 점
type Celsius float64와 type Fahrenheit float64는 서로 다른 타입입니다. 직접 대입하면 컴파일 에러가 나며, 명시적 변환이 필요합니다.
자주 묻는 질문
타입 별칭 & 타입 정의란 무엇인가요?
기존 타입을 기반으로 새 타입을 만들어 타입 안전성을 높입니다.
타입 별칭 & 타입 정의 학습 시 주의할 점은 무엇인가요?
type Celsius float64 와 type Fahrenheit float64 는 서로 다른 타입입니다. 직접 대입하면 컴파일 에러가 나며, 명시적 변환이 필요합니다.
Continue Learning
Go 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.