PHpullh
학습 라이브러리/Go/타입 별칭 & 타입 정의

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 float64type Fahrenheit float64는 서로 다른 타입입니다. 직접 대입하면 컴파일 에러가 나며, 명시적 변환이 필요합니다.

자주 묻는 질문

타입 별칭 & 타입 정의란 무엇인가요?

기존 타입을 기반으로 새 타입을 만들어 타입 안전성을 높입니다.

타입 별칭 & 타입 정의 학습 시 주의할 점은 무엇인가요?

type Celsius float64 와 type Fahrenheit float64 는 서로 다른 타입입니다. 직접 대입하면 컴파일 에러가 나며, 명시적 변환이 필요합니다.