Stringer는 값의 문자열 형식을 정의하기 위한 인터페이스예요.
이 인터페이스는 단 하나의 String 메서드로 이루어져 있어요.
type Stringer interface {
String() string
}
이 인터페이스를 구현하려는 타입에는, 그 타입을 사람이 읽기 좋은 문자열로 표현해 주는 String() 메서드가 있어야 해요.
fmt 패키지(그리고 다른 여러 패키지)는 값을 형식에 맞춰 출력할 때 이 메서드를 찾아요.
여러 단위로 측정한 지리적 거리를 다루는 애플리케이션을 만들고 있다고 가정해 봐요.
DistanceUnit과 Distance 타입을 다음과 같이 정의했어요.
type DistanceUnit int
const (
Kilometer DistanceUnit = 0
Mile DistanceUnit = 1
)
type Distance struct {
number float64
unit DistanceUnit
}
위 예시에서 Kilometer와 Mile은 DistanceUnit 타입의 상수예요.
이 타입들은 String 메서드가 없어서 Stringer 인터페이스를 구현하지 않아요.
그래서 fmt 함수들은 Distance 값을 Go의 "기본 형식"으로 출력해요.
mileUnit := Mile
fmt.Sprint(mileUnit)
// => 1
// The result is '1' because that is the underlying value of the 'Mile' constant (see constant declarations above)
dist := Distance{number: 790.7, unit: Kilometer}
fmt.Sprint(dist)
// => {790.7 0}
// not a very useful output!
출력을 더 알아보기 쉽게 만들기 위해, DistanceUnit과 Distance 타입 각각에 String 메서드를 추가해서 Stringer 인터페이스를 구현해요.
func (sc DistanceUnit) String() string {
units := []string{"km", "mi"}
return units[sc]
}
func (d Distance) String() string {
return fmt.Sprintf("%v %v", d.number, d.unit)
}
fmt 패키지 함수들은 Distance 값을 형식에 맞출 때 이 메서드들을 호출해요.
kmUnit := Kilometer
kmUnit.String()
// => km
mileUnit := Mile
mileUnit.String()
// => mi
dist := Distance{
number: 790.7,
unit: Kilometer,
}
dist.String()
// => 790.7 km
여러분의 팀은 기상 애플리케이션을 만들고 있어요.
팀은 기상 데이터를 나타내는 다양한 타입과 상수로 API를 정의했어요. meteorology.go 파일을 참고하세요.
여러분이 할 일은 모든 타입에 알맞은 String 메서드를 추가해서 Stringer 인터페이스를 구현하도록 만드는 거예요.
TemperatureUnit 타입에 Stringer 인터페이스 구현하기몇 차례 논의 끝에 팀은 온도의 단위를 Celsius 또는 Fahrenheit로 정했어요.
값은 아래 예시와 같은 형식으로 만들어야 해요.
TemperatureUnit 타입에 String 메서드를 추가해서 Stringer 인터페이스를 구현해 봐요.
이 메서드는 온도 단위가 Celsius이면 "°C" 문자열을, Fahrenheit이면 "°F" 문자열을 반환해야 해요.
celsiusUnit := Celsius
fahrenheitUnit := Fahrenheit
celsiusUnit.String()
// => °C
fahrenheitUnit.String()
// => °F
fmt.Sprint(celsiusUnit)
// Output: °C
Temperature 타입에 Stringer 인터페이스 구현하기온도 값은 정수와 온도 단위로 이루어져 있어요. 이 값들도 아래 예시와 같은 형식으로 만들어야 해요.
그렇게 하려면 Temperature 타입에 String 메서드를 추가해서 Stringer 인터페이스를 구현해요.
이 메서드는 온도의 숫자 값과 온도 단위를 공백으로 구분한 문자열을 반환해야 해요. <temperature> <unit>:
celsiusTemp := Temperature{
degree: 21,
unit: Celsius,
}
celsiusTemp.String()
// => 21 °C
fmt.Sprint(celsiusTemp)
// Output: 21 °C
fahrenheitTemp := Temperature{
degree: 75,
unit: Fahrenheit,
}
fahrenheitTemp.String()
// => 75 °F
fmt.Sprint(fahrenheitTemp)
// Output: 75 °F
SpeedUnit 타입에 Stringer 인터페이스 구현하기긴 논의 끝에 팀은 풍속의 단위를 KmPerHour 또는 MilesPerHour로 정했어요.
값은 아래 예시와 같은 형식으로 만들어야 해요.
그렇게 하려면 SpeedUnit 타입에 String 메서드를 추가해서 Stringer 인터페이스를 구현해요.
이 메서드는 속도 단위가 시속 킬로미터면 "km/h" 문자열을, 시속 마일이면 "mph" 문자열을 반환해야 해요.
mphUnit := MilesPerHour
mphUnit.String()
// => mph
fmt.Sprint(mphUnit)
// Output: mph
kmhUnit := KmPerHour
kmhUnit.String()
// => km/h
fmt.Sprint(kmhUnit)
// Output: km/h
Speed 타입에 Stringer 인터페이스 구현하기풍속 값은 정수와 속도 단위로 이루어져 있어요. 이 값들도 아래 예시와 같은 형식으로 만들어야 해요.
그렇게 하려면 Speed 타입에 String 메서드를 추가해서 Stringer 인터페이스를 구현해요.
이 메서드는 속도의 숫자 값과 속도 단위를 공백으로 구분한 문자열을 반환해야 해요. <speed> <unit>:
windSpeedNow := Speed{
magnitude: 18,
unit: KmPerHour,
}
windSpeedNow.String()
// => 18 km/h
fmt.Sprintf(windSpeedNow)
// Output: 18 km/h
windSpeedYesterday := Speed{
magnitude: 22,
unit: MilesPerHour,
}
windSpeedYesterday.String()
// => 22 mph
fmt.Sprint(windSpeedYesterday)
// Output: 22 mph
MeteorologyData 타입에 Stringer 인터페이스 구현하기기상 데이터는 위치, 온도, 풍향, 풍속, 습도를 나타내요. 이 데이터는 아래 예시와 같은 형식으로 만들어야 해요.
그렇게 하려면 MeteorologyData 타입에 String 메서드를 추가해서 Stringer 인터페이스를 구현해요.
이 메서드는 기상 데이터를 다음 형식으로 반환해야 해요.
<location>: <temperature>, Wind <wind_direction> at <wind_speed>, <humidity>% Humidity
sfData := MeteorologyData{
location: "San Francisco",
temperature: Temperature{
degree: 57,
unit: Fahrenheit
},
windDirection: "NW",
windSpeed: Speed{
magnitude: 19,
unit: MilesPerHour
},
humidity: 60
}
sfData.String()
// => San Francisco: 57 °F, Wind NW at 19 mph, 60% Humidity
fmt.Sprint(sfData)
// Output: San Francisco: 57 °F, Wind NW at 19 mph, 60% Humidity
Exercism에 가입하고 Go 트랙을 개념 34개연습 문제 166개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.