『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트입니다.
사실 인터페이스는 중간에 빠져서 내용을 다 이해하지 못했습니다.
그래서 다른 블로그/깃허브/검색 등을 참고하였습니다.
인터페이스(Interface)
interface : 구조체(struct)가 필드의 집합체라면, interface는 메서드의 집합체이다.
interface는 타입이 구현해야 하는 메서드 원형들을 정의한다.
package main
import (
"fmt"
)
//type 정의
type Tire struct {
price float64
location int
stat bool
}
//1.인터페이스는 type문을 사용하여 정의한다
type Car interface {
setTire() float64
}
//2.인터페이스 구현
//Car 인터페이스에 있는 메서드에 대해 구현을 하면, 해당 인터페이스에 대한 구현을 하는 것이다.
func (t Tire) setTire() float64 {
//보통은 뭔가 동작이 있겠지요.
return t.price
}
func showCar(cars ...Car) {
for _, s := range cars {
a := s.setTire()
fmt.Println(a)
}
}
func main() {
//3. 인터페이스 사용
tire := Tire{100000, 1, true}
showCar(tire)
}
/*
프로그래밍 회사 A,B,C가 있다. A회사는 B회사가 만든 프로그램을 사용한다.
B회사는 데이터베이스 관련 프로그램을 제작한다. 프로그램은 Get(),Set() 두 메서드를 제공한다.
A회사는 B 회사제품의 성능을 C 회사의 제품과 비교해보고 싶다.
*/
func TotalTime(db Database) int {
db.Get()
db.Set()
}
func Compare() {
BDB := &BDatabase{} //B회사의 데이터베이스
CDB := &CDatabase{} //C회사의 데이터베이스
if TotalTime(BDB) > TotalTime(CDB){
fmt.Println("B 회사 제품이 더 빠릅니다.")
} else {
fmt.Println("C회사제품이 더 빠릅니다.")
}
인터페이스 사이즈
인스턴스 메모리주소 + 타입정보(가리키고 있는 인스던스의 타입)
package main
import (
"fmt"
"unsafe"
)
type Stringer struct{
name String
}
type User struct {
Name String
Age int
}
func main() {
var stringer1 Stringer
fmt.Printf("type:%T size:%d\n", stringer1, unsafe.Sizeof(stringer1))
studnet := &Student{"AAA"}
stringer1 = student
fmt.Printf("type:%T size:%d\n", stringer1, unsafe.Sizeof(stringer1))
user := User{"BBB",20}
stringer2 = user
fmt.Printf("type:%T size:%d\n", stringer2, unsafe.Sizeof(stringer2))
}
인터페이스 기능
포함된 인터페이스 : 다른 인터페이스를 포함할 수 있다.
빈 인터페이스(empty interface) : interface{], 메소드가 필요 없는 인터페이스는 즉, 모든 타입이 가능하다는 것이다.
package main
import "fmt"
func PrintVal(va interface{}){
//타입에 따라 스위치 동작
switch t:= v.(type){
case int:
fmt.Printf("v is int %d\n", int(t))
case float64:
fmt.Printf("v is float64 %d\n", float64(t))
case string:
fmt.Printf("v is string %d\n", string(t))
default:
fmt.Printf("Not supperted type %T:%v\n" ,t,t)
}
type Student struct {
Age int
}
func main(){
PrintVal(30)
PrintVal(3.14)
PrintVal("서른살")
PrintVal(Student{5})
}
package main
type Attacker interface {
Attack()
}
func main() {
var att Attacker
att.Attack() //nil !ERROR!
}
참고
https://www.youtube.com/c/TuckerProgramming/videos
Tucker Programming
Tucker 의 프로그래밍 강좌 채널입니다. 질문은 댓글로 남겨주시면 답변 드리겠습니다.
www.youtube.com
'Programming Language > go' 카테고리의 다른 글
Go 언어 프로그래밍 - 자료구조 - 1 (0) | 2021.07.26 |
---|---|
Go 언어 프로그래밍 - 함수 고급편 (0) | 2021.07.21 |
Go 언어 프로그래밍 - 숫자맞추기 게임 (0) | 2021.07.19 |
Go 언어 프로그래밍 - 문자열, 모듈과 패키지 (0) | 2021.07.16 |
Go 언어 프로그래밍 - 조건문과 반복문 (구조체, 포인터) (0) | 2021.07.14 |