Programming Language/go

Go 언어 프로그래밍 - 인터페이스

김크리 2021. 7. 21. 21:59

『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!
}

 

참고

Tucker의 Go언어 프로그래밍 - Go가 온당

https://www.youtube.com/c/TuckerProgramming/videos

 

Tucker Programming

Tucker 의 프로그래밍 강좌 채널입니다. 질문은 댓글로 남겨주시면 답변 드리겠습니다.

www.youtube.com

http://golang.site/