값 리시버
Coddy GO 여정의 로직 & 흐름 섹션에 포함된 레슨 — 68개 중 7번째.
값 수신기(value receiver)를 사용하여 메서드를 정의하면, 메서드는 원본이 아닌 구조체 인스턴스의 복사본에서 작동합니다. 즉, 메서드 내부에서 수신기에 가해진 모든 변경 사항은 원본 구조체 변수에 영향을 미치지 않습니다.
type Counter struct {
Value int
}
func (c Counter) increment() {
c.Value++ // 원본이 아닌 복사본을 수정합니다
}이 예제에서 increment 메서드는 값 수신기 (c Counter)를 가집니다. Counter 인스턴스에서 이 메서드를 호출하면, Go는 구조체의 복사본을 생성하여 메서드에 전달합니다. 메서드 내부에서 c.Value에 가해지는 모든 변경 사항은 이 복사본에만 영향을 미칩니다.
값 리시버(Value receivers)는 메서드가 구조체(struct)를 수정하지 않고 데이터를 읽기만 하면 될 때 유용합니다. 원본 데이터가 변경되지 않음을 보장하므로 사용하기에 안전하며, 코드를 더 예측 가능하게 만들고 의도치 않은 부작용을 방지합니다.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
챌린지
쉬움이 챌린지에서는 간단한 온도 모니터링 시스템을 만들며 값 리시버(value receiver)를 사용하는 연습을 하게 됩니다. Sensor 구조체를 생성하고, 값 리시버가 구조체의 복사본과 어떻게 작동하는지 보여주는 메서드들을 정의합니다.
세 가지 입력을 받게 됩니다:
- 센서 ID를 나타내는 문자열 (예:
"TEMP001") - 현재 온도 판독값을 나타내는 문자열 (예:
"23.5") - 온도 조정 값을 나타내는 문자열 (예:
"2.0")
여러분의 과제는 다음과 같습니다:
- 두 개의 필드
ID(string)와Temperature(float64)를 가진Sensor구조체를 정의합니다. "Sensor [ID]: [temperature]°C"형식으로 센서 정보를 출력하는 값 리시버 메서드displayReading을 생성합니다.- 온도에 조정 값을 더하고
"Adjusted reading: [new_temperature]°C"를 출력하는 값 리시버 메서드adjustTemperature를 생성합니다. - 입력값을 파싱하여
Sensor인스턴스를 생성합니다. displayReading메서드를 호출하여 원래 온도를 표시합니다.- 조정 값과 함께
adjustTemperature메서드를 호출합니다. displayReading메서드를 다시 호출하여 원래 구조체가 변경되지 않고 그대로 남아 있음을 증명합니다.
이 챌린지는 값 리시버가 있는 메서드가 구조체의 복사본에서 작동하므로, adjustTemperature 메서드를 호출한 후에도 원래 구조체의 온도 값은 변경되지 않고 유지됨을 보여줍니다. 온도 값은 소수점 첫째 자리까지 표시되어야 합니다.
치트 시트
값 수신기(Value receiver)는 원본이 아닌 구조체 인스턴스의 복사본에서 작동합니다. 메서드 내부에서 발생한 변경 사항은 원본 구조체에 영향을 주지 않습니다.
type Counter struct {
Value int
}
func (c Counter) increment() {
c.Value++ // 이것은 원본이 아닌 복사본을 수정합니다
}값 수신기는 메서드가 원본 구조체를 수정하지 않고 데이터만 읽어야 할 때 유용하며, 코드를 더 예측 가능하게 만들고 의도하지 않은 부작용을 방지합니다.
직접 해보기
package main
import (
"fmt"
"strconv"
)
// TODO: 여기에 Sensor 구조체를 정의하세요
// TODO: 여기에 값 수신기를 사용하는 displayReading 메서드를 정의하세요
// TODO: 여기에 값 수신기를 사용하는 adjustTemperature 메서드를 정의하세요
func main() {
// 입력 읽기
var sensorID string
var tempStr string
var adjustStr string
fmt.Scanln(&sensorID)
fmt.Scanln(&tempStr)
fmt.Scanln(&adjustStr)
// 온도 및 조정 값 파싱
temperature, _ := strconv.ParseFloat(tempStr, 64)
adjustment, _ := strconv.ParseFloat(adjustStr, 64)
// TODO: Sensor 인스턴스를 생성하고 필요한 메서드들을 호출하세요
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.