본문 바로가기
프로그래밍

👨‍💻 [Go] Go 에서 인터페이스(Interface) 란 무엇이며, 어떻게 활용할 수 있나요?

by 밝음의기둥 2025. 1. 3.
반응형

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


👨‍💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.

Go 에서 인터페이스(Interface) 란 무엇이며, 어떻게 활용할 수 있는지 간략히 알아보았습니다.


질문 >

Go 에서 인터페이스(Interface) 란 무엇이며, 어떻게 활용할 수 있나요?

답변 >

Go에서 인터페이스(Interface)는 메서드의 집합을 정의하는 타입으로, 객체 지향 프로그래밍의 다형성(polymorphism)을 지원하는 핵심 기능입니다. 인터페이스는 특정 타입이 어떤 동작을 수행할 수 있는지를 정의하며, 이를 구현하는 타입은 해당 메서드를 반드시 제공해야 합니다.


인터페이스의 주요 특징

  1. 구조와 구현의 분리: 인터페이스는 메서드의 서명을 정의할 뿐, 실제 구현은 정의하지 않습니다.
  2. 암묵적 구현: Go에서는 명시적으로 "인터페이스를 구현한다"고 선언할 필요가 없습니다. 타입이 인터페이스에 정의된 메서드를 모두 구현하면 자동으로 해당 인터페이스를 만족합니다.
  3. 유연성: 다양한 타입을 수용하여 함수나 구조체의 재사용성을 높여줍니다.

인터페이스 정의

인터페이스는 type 키워드를 사용해 정의합니다.

type 인터페이스명 interface {
    메서드명1(매개변수) 반환값
    메서드명2(매개변수) 반환값
}


인터페이스 기본 예제

1. 기본 인터페이스 정의 및 사용

package main

import "fmt"

// 인터페이스 정의
type Shape interface {
    Area() float64
}

// 구조체 정의 및 메서드 구현
type Circle struct {
    Radius float64
}

func (c Circle) Area() float64 {
    return 3.14 * c.Radius * c.Radius
}

type Rectangle struct {
    Width, Height float64
}

func (r Rectangle) Area() float64 {
    return r.Width * r.Height
}

func main() {
    // 인터페이스 사용
    var s Shape

    s = Circle{Radius: 5}
    fmt.Printf("원 면적: %.2f\\n", s.Area())

    s = Rectangle{Width: 4, Height: 6}
    fmt.Printf("사각형 면적: %.2f\\n", s.Area())
}

실행 결과:

원 면적: 78.50
사각형 면적: 24.00


빈 인터페이스 (interface{})

interface{}는 메서드를 정의하지 않는 빈 인터페이스로, 모든 타입을 저장할 수 있습니다.

package main

import "fmt"

func printValue(value interface{}) {
    fmt.Println(value)
}

func main() {
    printValue(42)       // 정수
    printValue("Hello")  // 문자열
    printValue(3.14)     // 실수
}

실행 결과:

42
Hello
3.14


인터페이스를 활용한 다형성

인터페이스를 사용하면 서로 다른 타입을 동일한 함수에서 처리할 수 있습니다.

package main

import "fmt"

// 인터페이스 정의
type Animal interface {
    Speak() string
}

// 구조체 정의 및 인터페이스 구현
type Dog struct{}
func (d Dog) Speak() string { return "멍멍" }

type Cat struct{}
func (c Cat) Speak() string { return "야옹" }

func makeSound(a Animal) {
    fmt.Println(a.Speak())
}

func main() {
    dog := Dog{}
    cat := Cat{}

    makeSound(dog)
    makeSound(cat)
}

실행 결과:

멍멍
야옹


타입 어설션(Type Assertion)

인터페이스 변수의 실제 타입을 확인하거나 변환하는 방법입니다.

1. 기본 타입 어설션

func main() {
    var value interface{} = "Hello"

    str, ok := value.(string)
    if ok {
        fmt.Println("값:", str)
    } else {
        fmt.Println("string이 아님")
    }
}

2. 타입 스위치(Type Switch)

다양한 타입에 대해 분기 처리합니다.

func describe(v interface{}) {
    switch v.(type) {
    case int:
        fmt.Println("정수형:", v)
    case string:
        fmt.Println("문자열:", v)
    case float64:
        fmt.Println("실수형:", v)
    default:
        fmt.Println("알 수 없는 타입")
    }
}

func main() {
    describe(42)
    describe("Go")
    describe(3.14)
}


인터페이스를 활용한 디자인 패턴

1. 의존성 주입(Dependency Injection)

인터페이스를 사용하여 다양한 구현체를 주입 가능하도록 설계합니다.

type Logger interface {
    Log(message string)
}

type ConsoleLogger struct{}
func (cl ConsoleLogger) Log(message string) {
    fmt.Println("콘솔 로그:", message)
}

func doWork(logger Logger) {
    logger.Log("작업 시작")
    // 작업 수행
    logger.Log("작업 완료")
}

func main() {
    logger := ConsoleLogger{}
    doWork(logger)
}

2. 플러그블 아키텍처(Pluggable Architecture)

인터페이스로 동작을 추상화하여 확장 가능성을 높입니다.


주의 사항

  1. 메서드 구현 확인: 인터페이스를 만족하려면 정의된 모든 메서드를 구현해야 합니다.
  2. 빈 인터페이스 남용: interface{}를 너무 자주 사용하면 타입 안정성이 떨어지고, 코드의 가독성이 낮아질 수 있습니다.
  3. 구현 관계의 암묵성: 명시적으로 "구현한다"는 선언이 없으므로, 코드베이스가 커질수록 구현 여부를 파악하기 어려울 수 있습니다.

Go의 인터페이스는 강력한 유연성과 간결함을 제공하며, Go 스타일의 다형성을 구현하는 데 매우 유용한 도구입니다. 이를 적절히 활용하면 코드의 재사용성과 확장성을 크게 높일 수 있습니다.



🎬 유튜브 채널 🎬

 

위로그@WiLog

📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌

www.youtube.com

🎬 치지직 채널 🎬

 

위로그 채널 - CHZZK

지금, 스트리밍이 시작됩니다. 치지직-

chzzk.naver.com


반응형