[go] 구조체(struct)와 인터페이스(interface)의 관계

구조체와 인터페이스는 Go 언어에서 주요한 개념 중 하나입니다. 구조체는 데이터를 담는 커스텀 데이터 타입이며, 인터페이스는 구조체나 다른 타입에 대한 행위를 정의하는 추상화된 개념입니다. 이들은 함께 사용되어 유연하고 확장 가능한 코드를 작성하는 데 도움을 줍니다.

구조체(struct)

구조체는 관련 있는 데이터의 집합을 표현하기 위해 사용됩니다. 예를 들어, 너비와 높이를 나타내는 데이터가 필요하다면, 다음과 같이 구조체를 정의할 수 있습니다.

type Rectangle struct {
    width  int
    height int
}

위의 예제는 Rectangle이라는 구조체를 정의하고, widthheight라는 두 개의 필드가 있는 것을 보여줍니다.

구조체는 필드에 데이터를 저장하는 용도로 사용되며, 필드에 접근하기 위해서는 . 연산자를 사용합니다.

rect := Rectangle{width: 10, height: 5}
fmt.Println(rect.width)  // 출력: 10
fmt.Println(rect.height) // 출력: 5

인터페이스(interface)

인터페이스는 메서드들의 집합으로, 구조체나 다른 타입에 대한 행위를 정의하는 데 사용됩니다. 인터페이스는 다른 타입을 추상화하며, 해당 타입이 특정한 행위를 보장하는 것을 의미합니다.

인터페이스는 메서드 시그니처들의 집합으로 정의됩니다. 이 때, 메서드 시그니처란 메서드의 이름, 매개변수, 반환 타입을 나타냅니다. 예를 들어, 다음과 같이 Shape 인터페이스를 정의할 수 있습니다.

type Shape interface {
    Area() float64
    Perimeter() float64
}

위의 예제는 Shape이라는 인터페이스를 정의하고, Area()Perimeter()라는 두 개의 메서드를 포함시킨 것을 보여줍니다.

인터페이스는 구조체나 다른 타입이 인터페이스를 구현할 때 사용됩니다. 구현하는 타입은 해당 인터페이스에 정의된 모든 메서드를 구현해야 합니다.

구조체와 인터페이스의 관계

구조체와 인터페이스는 서로 협력하여 유연하고 확장 가능한 코드를 작성하는 데 도움을 줍니다.

구조체는 데이터를 담는 용도로 사용되며, 필요한 속성을 정의하여 사용자 정의 타입을 생성하는 데 유용합니다. 인터페이스는 특정한 기능을 보장하고, 다른 타입들을 그 기능에 맞게 추상화하며, 코드의 유연성과 확장성을 높여줍니다.

구조체가 인터페이스를 구현할 때, 해당 구조체가 인터페이스에 정의된 메서드들을 모두 구현해야 합니다. 이를 통해 해당 구조체는 인터페이스와 호환 가능하며, 다형성의 개념을 사용하여 해당 인터페이스를 사용하는 다른 코드들과 함께 작동할 수 있습니다.

이를 통해 코드의 유연성과 재사용성이 높아지며, 다양한 구조체들이 동일한 인터페이스를 구현함으로써 코드의 일관성을 유지하는 데 도움을 줍니다.

결론

구조체와 인터페이스는 Go 언어에서 중요한 개념이며, 함께 사용하여 유연하고 확장 가능한 코드를 작성하는 데 도움을 줍니다. 구조체는 데이터를 담는 용도로 사용되며, 필드를 통해 데이터를 접근합니다. 인터페이스는 특정한 기능을 보장하며, 다른 타입들을 추상화하고 코드의 유연성을 높여줍니다. 이들은 함께 사용하여 다형성을 구현하고 코드의 일관성을 유지하는 데 도움을 줍니다.

참고 자료: