기상학

기상학

학습 연습 문제

소개

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 인터페이스를 구현하도록 만드는 거예요.

1. 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

2. 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

3. 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

4. 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

5. 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
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Go Exercism

기상학 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Go 트랙을 개념 34개연습 문제 166개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.