2012년 5월 1일 화요일

interface

출처: http://tour.golang.org/#52



interface 는 method 의 집합으로 표현한다.
interface type 변수에는 해당 method 를 가지고 있는 value 만 저장할 수 있다.

interface type 변수에 해당 함수객체나 함수포인터를 저장하는것이 아니다.
그 함수객체가 구현되어있는 변수값을 저장한다.


하나의 type 은 여러개의 interface 를 구현할 수 있다.
interface 때문에 C++ 의 상속, 객체 포인터 등을 쓸 필요가 없다.

함수를 정의할때, 파라메터로 객체의 타입을 지정하지 않고,
interface 타입을 지정하는 것을 눈여겨 보아야 한다.
GO 는 C++ 과는 다르다.


struct, method, interface.
이 세가지로 OOP 기능을 충분히 구현할 수 있다는 사실을 알 수 있다.
상속은 필요없다는 얘기다!
class heirachy 를 만들 필요가 없다.

GO 에서는 type, method 가 interface 로 느슨하게 연결되어 있다.

이것은 컴파일러가 암시적으로 표현된 코드로부터,
type, method 간의 의존관계를 자동적으로 처리해주기 때문에 가능한 일이다.

"연결관계를 상속을 통해서 엄격하게 표현하지 않고, 
                interface 를 통해서 느슨하게 표현함으로써,
       코드 변경작업(디자인변경작업)의 고통을 줄일수 있다"
는 사실을 그들은 알았던것이다.


하나의 type 이 여러개의 interface 를 구현할 수 있다는 말은,
C++ 의 다중상속 기능과 같은 기능을 발휘할 수 있다는 의미로 해석하기로 한다.



package main


import (
"fmt"
"math"
)


type Abser interface {
Abs() float64
}




func main() {
var a Abser
f := MyFloat( -math.Sqrt2)
v := Vertex{3, 4}

a = f
fmt.Println(a.Abs())

a = &v
// a = v
fmt.Println(a.Abs())
}


type MyFloat float64


func ( f MyFloat) Abs() float64 {
if f < 0 {
return float64(-f)
}
return float64(f)
}


type Vertex struct {
X, Y float64
}


func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}






D:\DEV\PP\work_4\src>go run hello68.go
1.4142135623730951
5