🔥 연습문제 - IPAddr 타입에 fmt.Stringer 인터페이스 구현하기
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
인터페이스를 활용하여 사용자 정의 타입을 더욱 유연하게 다룰 수 있게 되었습니다. 코드의 가독성과 유지보수성을 높이는 데 도움이 되길 바랍니다!