이쁜 럭키 C언어 Go에는 C언어 에서 처럼 class와 상속이 없다.
그럼 어떻게 하냐?
구조체를 활용한 Struct Composition을 이용해 객체지향을 야매로 따라한다고 볼 수 있다.
애초에 객체지향은 설계 방법론이지 언어에 종속되는 개념은 아니니깐...
먼저 오늘은 struct와 interface 의 사용법을 보는 것이 목적이다.
객체지향으로 하는 방법은 다음에 할 예정이다.
선업 방법은 간단하다.
나이와 이름을 가지는 struct를 선언한다고 생각해보자
type Person struct{
name string
old int
}
초기화도 아래와 같이 하면 된다.
var p = Person{
name : "hamji",
old : 1,
}
줄넘김을 해줄 땐 , 표시를 해주는게 보기도 좋다.
안하면 컴파일러에 걸릴 것이다.
기본적인 자료형 뿐만 아니라 다른 구조체 역시 필드로 사용할 수도 있다.
예를들어 Person에 자신의 생일을 저장하고 싶다고 생각해보자.
type Person struct{
name string
old int
birth time.Time
}
이럴 경우 초기화 할 때 다른 것과 똑같이
var p = Person{
name : "hamji",
old : 1,
birth : time.Time(<날짜~~~>),
}
이런식으로 해주면 된다.
interface 는 메서드의 집합채로 type이 구현해야하는 메서드의 원형을 정의하는 역할을 해준다.
인터페이스는 보통 ~er 로 이름을 끝내준다.
예를 들어 사람이니까 자기소개
와 달리기
라는 함수가 메서드들을 모아놓은 인터페이스가 있다고 쳐보자
type Life interface{
introduce()
run()
}
인터페이스를 구현하기 위해서 해당 타입이 인터페이스를 구현하면 되니깐 지금은 2개의 함수만 구현하면 된다.
func (p Person) introduce() {
fmt.Println("나는 사람 이름은 " + p.name)
}
func (p Person) run() {
fmt.Println("나는 사람 달린다.")
}
같은 인터페이스를 구현하였다면 duck typing 역시 가능하다.
지금은 한번 토끼 Bunny라는 구조체를 이용해 만들어 보겟다.
덕타이핑이 뭔지 궁금하다면 구글에...
Bunny
구조체
type Bunny struct {
speed int64
}
func (b Bunny) introduce() {
fmt.Println("안녕하세요 토끼입니다 저는 시속" + strconv.FormatInt(b.speed, 10) + "km로 달립니다.")
}
func (b Bunny) run() {
fmt.Println("달립니다")
}
인터페이스를 파라미터로 받음
func SaySomething(l Life) {
l.introduce()
l.run()
}
~/dev/GO/struct go run main.go
나는 사람 이름은 hamji
나는 사람 달린다.
안녕하세요 토끼입니다 저는 시속10km로 달립니다.
달립니다
~/dev/GO/struct
가끔 빈 인터페이스들이 있는데 이는 어떠한 타입도 담을 수 있는 컨테이너 역할을 한다고 생각하자
아무거나 다 담긴다.
func main() {
var i interface{}
i = 1
i = "asdasd"
fmt.Println(i)
}
~/dev/GO/struct go run main.go
asdasd
~/dev/GO/struct
보면 이랫다 저랬다 된다.