🔥 연습문제 - IPAddr 타입에 fmt.Stringer 인터페이스 구현하기

290자
4분

Go 언어에서는 사용자 정의 타입에 fmt.Stringer 인터페이스를 구현하여 해당 타입의 값을 문자열로 출력할 수 있습니다. 이번 예제에서는 IP 주소를 나타내는 IPAddr 타입에 fmt.Stringer 인터페이스를 구현하여 IP 주소를 점으로 구분된 쿼드 형식으로 출력해 보겠습니다.

먼저, IPAddr 타입을 정의합니다. IPAddr은 4바이트 배열로 구성되어 있습니다.

type IPAddr [4]byte
 
go

다음으로, IPAddr 타입에 String() string 메서드를 추가하여 fmt.Stringer 인터페이스를 구현합니다. 이 메서드는 IP 주소를 점으로 구분된 쿼드 형식의 문자열로 반환합니다.

func (ip IPAddr) String() string {
    // IP 주소의 각 바이트를 문자열로 변환하여 점으로 구분된 형식으로 반환합니다.
    return fmt.Sprintf("%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3])
}
 
go

이제 main 함수에서 IPAddr 값을 출력해 보겠습니다. hosts 맵을 정의하고, 각 호스트 이름에 해당하는 IP 주소를 할당합니다. 그리고 for 루프를 사용하여 호스트 이름과 IP 주소를 출력합니다.

func main() {
    hosts := map[string]IPAddr{
        "loopback":  {127, 0, 0, 1},
        "googleDNS": {8, 8, 8, 8},
    }
    for name, ip := range hosts {
        fmt.Printf("%v: %v\n", name, ip)
    }
}
 
go

위 코드를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.

loopback: 127.0.0.1
googleDNS: 8.8.8.8
text

fmt.Printf에서 %v 포맷 지정자를 사용하여 IPAddr 값을 출력할 때, String() string 메서드가 자동으로 호출되어 IP 주소를 점으로 구분된 쿼드 형식으로 출력합니다.

이렇게 fmt.Stringer 인터페이스를 구현하면 사용자 정의 타입의 값을 원하는 형식으로 출력할 수 있습니다. 이는 코드의 가독성과 디버깅을 향상시키는 데 도움을 줍니다.

전체 코드를 정리하면 다음과 같습니다.

package main
 
import "fmt"
 
type IPAddr [4]byte
 
func (ip IPAddr) String() string {
    return fmt.Sprintf("%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3])
}
 
func main() {
    hosts := map[string]IPAddr{
        "loopback":  {127, 0, 0, 1},
        "googleDNS": {8, 8, 8, 8},
    }
    for name, ip := range hosts {
        fmt.Printf("%v: %v\n", name, ip)
    }
}
 
go

이제 여러분도 fmt.Stringer 인터페이스를 활용하여 사용자 정의 타입을 더욱 유연하게 다룰 수 있게 되었습니다. 코드의 가독성과 유지보수성을 높이는 데 도움이 되길 바랍니다!