백엔드/Go := Golang

[ Golang ] 인터페이스와 제네릭

잡캐헨리 2024. 9. 11. 23:32

인터페이스

인터페이스는 Go에서 메서드 집합을 정의한 것으로, 해당 메서드를 구현한 모든 타입과 호환될 수 있다.

인터페이스의 구현

type TestInterface interface {
	save(string) // 리턴타입이 없는 경우
	get() // 리턴타입, 파라미터 모두 있는 경우
	put() // 리턴타입, 파라미터 모두 없는 경우
    }

 

Go 인터페이스는 Go에서 객체지향을 구현하는 방법으로, 인터페이스를 embed 해 사용한다.

다양한 타입이 같은 인터페이스를 구현함으로써, 해당 인터페이스를 매개변수로 받는 함수는 여러 타입과 호환될 수 있다 

 

Generic

Go 1.18에서 도입된 제네릭은 여러 타입에서 동작할 수 있는 일반화된 함수데이터 구조를 작성하는 방법이다.

package main

import "fmt"

// 제네릭 함수 정의
func Print[T any](value T) {
    fmt.Println(value)
}

func main() {
    Print(42)     // int 타입
    Print("Go")   // string 타입
    Print(3.14)   // float64 타입
}

 

인터페이스와 제네릭을 혼합

package main

import "fmt"

// 인터페이스 정의
type Stringer interface {
    String() string
}

// 제네릭 함수에 인터페이스를 제약으로 사용
func PrintString[T Stringer](s T) {
    fmt.Println(s.String())
}

// 타입 정의
type Person struct {
    Name string
}

// 인터페이스 메서드 구현
func (p Person) String() string {
    return p.Name
}

func main() {
    p := Person{Name: "Alice"}
    PrintString(p)  // 출력: Alice
}