이 글은 Effective Go를 일부 번역한 글입니다.


인터페이스와 그 외 다른 유형들

인터페이스

Go의 인터페이스가 객체의 행동을 지정하는 방법은 이렇다. 무언가가 ‘이걸’ 할 수 있으면 ‘여기’에 쓸 수 있다. 우린 이미 여러 간단한 예제를 보았다. String 메서드로 자작 프린터를 만들 수 있었고, Write 메서드로 Fprintf가 출력할 수 있었다. Go 코드에선 메서드 두어 개만으로 인터페이스를 구성하는 게 일반적이다. 그리고 보통은 그 메서드 이름을 따 인터페이스 이름을 짓는다. Write로 구성된 io.Writer처럼 말이다.

유형 하나에 여러 인터페이스를 구현할 수 있다. 예를 들어, Len(), Less(i, j int) bool, Swap(i, j int)을 포함하는 sort.Interface를 구현한 모음(Collection)은 sort 패키지 루틴으로 정렬할 수 있다. 그리고 이 모음은 자체 형식자(Formatter)도 가질 수 있다. 여기 짜맞춘 예시인 Sequence가 둘 다 만족한다.

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]
}

// Method for printing - sorts the elements before printing.
func (s Sequence) String() string {
    sort.Sort(s)
    str := "["
    for i, elem := range s {
        if i > 0 {
            str += " "
        }
        str += fmt.Sprint(elem)
    }
    return str + "]"
}