Doodly IT

[Go 묘공단 스터디] 인터페이스 본문

프로그래밍/Go

[Go 묘공단 스터디] 인터페이스

DoodlyKim 2023. 11. 29. 21:25

1) 인터페이스 선언

인터페이스는 메서드 구현을 포함한 구체화된 객체가 아닌 추상화된 객체로 상호작용을 할 수 있다.

인터페이스는 type 키워드와 interface키워드 사이에 인터페이스 명을 쓴 채로 정의한다.

인터페이스도 구조체이기 때문에 type키워드를 쓰게 된다.

type DuckInterface interface{
Fly()
Walk(distance int) int
}

 

 

2) 인터페이스 사용

package main

import (
	"fmt"
)

type Stringer interface {
	String() string
}

type Student struct {
	Name string
	Age  int
}

func (s Student) String() string {
	return fmt.Sprintf("안녕! 나는 %d 살 %s 라고 해!", s.Age, s.Name)

}

func main() {

	student := Student{"철수", 12}
	var stringer Stringer

	stringer = student

	fmt.Println("%s\n", stringer.String())

}

 

위에 Stringer 인터페이스안에 String()이란 메서드가 존재한다. String 메서드는 Student  타입의 인자를 입력받는다. 

이때 Main 함수는 String()함수를 사용하지 않고 Interface에 정의되어있는것 만으로도 String 메서드를 이용할 수 있다. 즉 main의 student는 interface안에 있는 String 메서드를 사용하고 String 메서드는 전달받은 student 구조체 s에 따라 문장을 출력하게 된다.

 

3) 덕 파이핑

Go는 다른언어와 달리 인터페이스 구현 여부를 명시적으로 선언하는 것이 아닌 인터페이스에서 정의한 메서드 포함 여부로 판단한다. 

 

4) 인터페이스의 기능

 

1. 인터페이스를 포함하는 인터페이스

type Reader interface{
Read() ( n int , err error)
Close() error
}

type Writer interface{
Write()(n int, err error)
Close() error
}

type ReadWriter interface{
 Reader
 Writer
 }

 

ReadWriter 인터페이스는 Reader와 Writer 인터페이스를 포함한다. Reader와 Writer는 각각 Close() 메서드를 가진다.

ReadWriter 인터페이스는 이때 중복되지않고 하나의 Close() 메서드를 가지게 된다.

 

2. 빈 인터페이스

메서드를 가지고 있지 않는 인터페이스는 모든 값을 인자로 받을 수 있다.

 

3. 인터페이스의 기본값은 nil이다.

인터페이스가 정의되지 않는 메소드에 접근할 때 인터페이스의 기본값은 nil이다.