"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
👨💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.
Go 에서 인터페이스(Interface) 란 무엇이며, 어떻게 활용할 수 있는지 간략히 알아보았습니다.
질문 >
Go 에서 인터페이스(Interface) 란 무엇이며, 어떻게 활용할 수 있나요?
답변 >
Go에서 인터페이스(Interface)는 메서드의 집합을 정의하는 타입으로, 객체 지향 프로그래밍의 다형성(polymorphism)을 지원하는 핵심 기능입니다. 인터페이스는 특정 타입이 어떤 동작을 수행할 수 있는지를 정의하며, 이를 구현하는 타입은 해당 메서드를 반드시 제공해야 합니다.
인터페이스의 주요 특징
- 구조와 구현의 분리: 인터페이스는 메서드의 서명을 정의할 뿐, 실제 구현은 정의하지 않습니다.
- 암묵적 구현: Go에서는 명시적으로 "인터페이스를 구현한다"고 선언할 필요가 없습니다. 타입이 인터페이스에 정의된 메서드를 모두 구현하면 자동으로 해당 인터페이스를 만족합니다.
- 유연성: 다양한 타입을 수용하여 함수나 구조체의 재사용성을 높여줍니다.
인터페이스 정의
인터페이스는 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)
인터페이스로 동작을 추상화하여 확장 가능성을 높입니다.
주의 사항
- 메서드 구현 확인: 인터페이스를 만족하려면 정의된 모든 메서드를 구현해야 합니다.
- 빈 인터페이스 남용: interface{}를 너무 자주 사용하면 타입 안정성이 떨어지고, 코드의 가독성이 낮아질 수 있습니다.
- 구현 관계의 암묵성: 명시적으로 "구현한다"는 선언이 없으므로, 코드베이스가 커질수록 구현 여부를 파악하기 어려울 수 있습니다.
Go의 인터페이스는 강력한 유연성과 간결함을 제공하며, Go 스타일의 다형성을 구현하는 데 매우 유용한 도구입니다. 이를 적절히 활용하면 코드의 재사용성과 확장성을 크게 높일 수 있습니다.
🎬 유튜브 채널 🎬
위로그@WiLog
📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌
www.youtube.com
🎬 치지직 채널 🎬
위로그 채널 - CHZZK
지금, 스트리밍이 시작됩니다. 치지직-
chzzk.naver.com
'프로그래밍' 카테고리의 다른 글
👨💻 [Go] Go 에서 제네릭 프로그래밍 이란 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.03 |
---|---|
👨💻 [Go] Go 에서 타입 제한 이란 무엇이며, 어떻게 활용할 수 있나요? (1) | 2025.01.03 |
👨💻 [Go] Go 에서 컨텍스트(Context) 란 무엇이며, 어떻게 활용할 수 있나요? (2) | 2025.01.03 |
👨💻 [Unreal] 언리얼 엔진에서 Progress Bar 란 무엇이며, 어떻게 활용할 수 있나요? (1) | 2025.01.03 |
👨💻 [Unreal] 언리얼 엔진에서 Widget 이란 무엇이며, 어떻게 활용할 수 있나요? (1) | 2025.01.03 |