Go에서 인터페이스는 객체가 할 수 있는 행위를 지정
어떤 것이 이것(this)을 할 수 있다는 것은 곧 여기(here)에서 사용될 수 있다는 것을 의미
Go에서 한 개 또는 두 개 메소드를 가진 인터페이스가 보편적이며, 인터페이스의 이름은 자신이 가진 메소드로부터 따오는 경우가 많음
하나의 타입은 다수의 인터페이스를 구현할 수 있음
type Sequence []int
// 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]
}
// Copy 메소드는 Sequence 의 복제본을 리턴하고 있어요.
func (s Sequence) Copy() Sequence {
copy := make(Sequence, 0, len(s))
return append(copy, s...)
}
// 출력을 위한 메소드예요.
// 반환하기 전에 요소들을 정렬하고 있네요.
func (s Sequence) String() string {
// 인자를 덮어쓰지 말고 복사본을 만들어요.
s = s.Copy()
sort.Sort(s)
str := "["
// 반복문이 O(N²)으로 동작하는데요.
// 이는 다음 예제에서 수정할거예요.
for i, elem := range s {
if i > 0 {
str += " "
}
str += fmt.Sprint(elem)
}
return str + "]"
}
func (s Sequence) String() string {
s = s.Copy()
sort.Sort(s)
return fmt.Sprint([]int(s))
}
위 메소드는 String메소드에서 Sprintf를 안전하게 호출하는 변환 기술의 한 예
Sequence와 []int의 경우 타입의 이름을 무시한다면 사실 똑같기 때문에 둘 사이의 변환은 적합함
변환은 새로운 값을 생성하는 것이 아닌 그 값이 새로운 타입을 가지는 것 처럼 동작하게 되는 것
Go에서는 타입을 변환해서 다른 세트의 메소드들을 사용할 수 있도록 하는 방법도 일반적으로 많이 사용함
Sequence 타입을 sort.IntSlice라는 타입으로 변환을 해주면 전체 코드가 아래 예처럼 줄어들게 됨
type Sequence []int
func (s Sequence) String() string {
s = s.Copy()
sort.IntSlice(s).Sort()
return fmt.Sprint([]int(s))
}