목차

Go 사용자 정의 타입 - struct

Go는 클래스와 상속 개념이 없다. 대신 구조체(struct) 로 객체 지향 타입을 정의하고, 구조체와 메서드를 연결하여 클래스처럼 사용한다.

  • 상태와 메소드를 분리해서 정의 (결합성 없음)
  • 사용자 정의 타입: 구조체, 인터페이스, 기본타입, 함수
import "fmt"

// 사용자 정의 타입(구조체)
type Car struct {
	name  string
	color string
	price int64
	tax   int64
}

//구조체 <-> 메소드 바인딩
func (c Car) Price() int64 {
	return c.price + c.tax
}

func main() {

	bmw := Car{name: "520d", price: 54500000, color: "white", tax: 545000}
	benz := Car{name: "220d", price: 74500000, color: "white", tax: 745000}

	bmwPrice := bmw.Price()
	benzPrice := benz.Price()

	fmt.Println("ex1 : ", &bmw)
	fmt.Println("ex1 : ", bmwPrice)
	fmt.Println("ex1 : ", bmw.Price())

	fmt.Println("ex1 : ", &benz)
	fmt.Println("ex1 : ", benzPrice)
	fmt.Println("ex1 : ", benz.Price())

}
import "fmt"

type cnt int

func main() {

	//예제1
	a := cnt(5)

	fmt.Println("ex1 : ", a)

	//예제2
	var b cnt = 15

	fmt.Println("ex2 : ", b)
	//testConvertT(b) //예외 발생 (중요!) 사용자 정의 타입 <-> 기본 타입 : 매개변수 전달 시에 변환해야 사용 가능 (cnt(5), int(5))
	testConvertT(int(b))

	testConvertD(b)
	testConvertD(cnt(10)) //사용 가능
	//testConvertD(int(b)) //예외 발생 (중요!) 사용자 정의 타입 <-> 기본 타입 : 매개변수 전달 시에 변환해야 사용 가능 (cnt(5), int(5))
}

func testConvertT(i int) {
	fmt.Println("ex 2 : (Default Type) : ", i)
}

func testConvertD(i cnt) {
	fmt.Println("ex 2 : (Custom Type) : ", i)
}