[Go] type alias와 named type

Goμ—μ„œλŠ” type에 μƒˆ 이름을 λΆ€μ—¬ν•˜λŠ” 것에 2κ°€μ§€ 방법이 μ œκ³΅λœλ‹€.

이 2κ°€μ§€ μ‹ νƒμŠ€λŠ” 일견 λΉ„μŠ·ν•΄λ³΄μ΄μ§€λ§Œ, μ™„μ „νžˆ λ‹€λ₯Έ κΈ°λŠ₯이닀.




type alias

type aliasλŠ” = μ—°μ‚°μžκ°€ κ°€μš΄λ° λ“€μ–΄κ°„λ‹€.
μ΄κ±°λŠ” μ •μ§ν•˜κ²Œ μ§„μ§œ λ³„μΉ­λ§Œ λ§Œλ“œλŠ” 것이고, 별칭과 원본 νƒ€μž…μ€ μ™„μ „νžˆ λ™μΌν•œ νƒ€μž…μ΄λ‹€.

κ·Έλž˜μ„œ κ·Έλƒ₯ 슀펠링만 λ‹€λ₯΄κ³  μ™„μ „νžˆ λ™μΌν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€.

package main

import "fmt"

type SomeType struct {
	Counter int
}

type A = SomeType // 이건 alias
type B SomeType   // 이건 μƒˆλ‘œμš΄ νƒ€μž…

func main() {
	someValue := SomeType{Counter: 1}

	var aValue A = someValue // μ™„μ „νžˆ 같은 νƒ€μž…μ΄λ―€λ‘œ ν• λ‹Ή κ°€λŠ₯
	fmt.Println(aValue.Counter)
}




named type

=λ₯Ό λΉΌλ©΄ named type μ‹ νƒμŠ€κ°€ λœλ‹€.
이건 λ‹¨μˆœνžˆ 별칭을 λ§Œλ“œλŠ”λ°λ§Œ κ·ΈμΉ˜λŠ”κ²Œ μ•„λ‹ˆλΌ μƒˆλ‘œμš΄ νƒ€μž…μ„ λ§Œλ“ λ‹€.

이게 무슨 μ†Œλ¦¬λ‚˜λ©΄

package main

import "fmt"

type SomeType struct {
	Counter int
}

type A = SomeType // 이건 alias
type B SomeType   // 이건 μƒˆλ‘œμš΄ νƒ€μž…

func main() {
	someValue := SomeType{Counter: 1}

	var bValue B = someValue // λ‹€λ₯Έ νƒ€μž…μ΄λ―€λ‘œ type check
	fmt.Println(bValue.Counter)
}

νƒ€μž…μ΄ 1:1둜 λ§€μΉ­λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것이닀.

이건 κΈ°μ‘΄ νƒ€μž…μ„ μž¬ν™œμš©ν•΄μ„œ μ‚¬μš©ν•  λ•Œ μœ μš©ν•˜λ‹€. νƒ€μž…μ²΄ν¬λ„ λΉ‘μ„Έκ²Œ λ˜λ‹ˆ μ‚¬μš©μ²˜λ₯Ό μ—„κ²©ν•˜κ²Œ μ œν•œν•˜κΈ°λ„ μ’‹λ‹€.

μƒν˜Έκ°„μ— λ³€ν™˜μ΄ ν•„μš”ν•˜λ‹€λ©΄ μ•„λž˜μ™€ 같이 μΊμŠ€νŒ…μ„ ν•˜λ©΄ λœλ‹€.

named type의 κ°€μž₯ 큰 μž₯점은 사싀, μƒˆλ‘œ μ€‘λ³΅μ •μ˜λœ νƒ€μž…μ— λŒ€ν•΄μ„œ λ©”μ„œλ“œλ₯Ό μΆ”κ°€ μ •μ˜ν•  수 μžˆλ‹€λŠ” 것이닀.

μ™ΈλΆ€ νŒ¨ν‚€μ§€μ— λŒ€ν•΄μ„œλ„ λ©”μ„œλ“œ μΆ”κ°€κ°€ κ°€λŠ₯ν•  λΏλ”λŸ¬

μ›λž˜λŠ” λ˜μ§€ μ•ŠλŠ” 슬라이슀 같은 νƒ€μž…μ— λŒ€ν•΄μ„œλ„ named type μ •μ˜κ°€ 된 μƒνƒœμ—μ„œλŠ” λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•  수 μžˆλ‹€.

λ‚΄ κ²½ν—˜μƒ, type aliasλ³΄λ‹€λŠ” named type이 훨씬 μ ν•©ν•œ κ²½μš°κ°€ λ§Žμ•˜λ‹€.