2012년 4월 29일 일요일

Interface

Interface

if something can do this, then it can be used here.

만약, Sequence type 이 Len(), Less(i, j int) bool, Swap(i, j int) 기능을 할 수 있다면,
그렇다면 Sequence type 은 sort.Sort() 함수호출에 사용할 수 있다.

Interface 는 어떤기능을 수행하기위한 요구사항, 필요조건을 기술하는 기능이다.

어떤기능을 서술하기위해, C++ 처럼 멤버함수형태로 기술한다면,
유사한 코드를 반복해서 작성해야하거나,
상속체계를 반복해서 수정해야하는 상황이 생길수 밖에 없다.

Interface 는 객체로부터 함수를 분리할 수 있게 해주는 장치로 이해하기로 한다.

함수 이름 앞에 붙어있는 "(s Sequence) funcName" 는
C++ 에서 "Sequence::funcName( Sequence & s)" 정도의 의미로 이해하기로 한다.


Interface 는 GO 언어의 주요한 뼈대에 해당한다는 사실을 느낄 수가 있다.

함수와 함수, 함수와 package, 코드와 프로그램 논리가 Interface 를 통해서 연결되는 것이리라고 예상해볼 수 있다.



package main
import "fmt"
import "sort"


func main() {

a := [...] int { 333, 222, 111 }

var b Sequence = a[0:3]

fmt.Println( "a:", a)
fmt.Println( "b:", b)

sort.Sort(b)

fmt.Println( "b:", b)
}


type Sequence []int


// Methods required by sort.Interface
func (s Sequence) Len() int {
return len(s)
}


func (s Sequence) Less(i, j int) bool {
return s[i] < s[j]
}


func (s Sequence) Swap(i, j int) {
s[i], s[j] = s[j], s[i]
}


func (s Sequence) String() string {
str := "["
for i, elem := range s {
if i > 0 {
str += " "
}
str += fmt.Sprint(elem)
}
return str + "]"
}