Menu
Coddy logo textTech

값 리시버

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)를 수정하지 않고 데이터를 읽기만 하면 될 때 유용합니다. 원본 데이터가 변경되지 않음을 보장하므로 사용하기에 안전하며, 코드를 더 예측 가능하게 만들고 의도치 않은 부작용을 방지합니다.

quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

challenge icon

챌린지

쉬움

이 챌린지에서는 간단한 온도 모니터링 시스템을 만들며 값 리시버(value receiver)를 사용하는 연습을 하게 됩니다. Sensor 구조체를 생성하고, 값 리시버가 구조체의 복사본과 어떻게 작동하는지 보여주는 메서드들을 정의합니다.

세 가지 입력을 받게 됩니다:

  • 센서 ID를 나타내는 문자열 (예: "TEMP001")
  • 현재 온도 판독값을 나타내는 문자열 (예: "23.5")
  • 온도 조정 값을 나타내는 문자열 (예: "2.0")

여러분의 과제는 다음과 같습니다:

  1. 두 개의 필드 ID (string)와 Temperature (float64)를 가진 Sensor 구조체를 정의합니다.
  2. "Sensor [ID]: [temperature]°C" 형식으로 센서 정보를 출력하는 값 리시버 메서드 displayReading을 생성합니다.
  3. 온도에 조정 값을 더하고 "Adjusted reading: [new_temperature]°C"를 출력하는 값 리시버 메서드 adjustTemperature를 생성합니다.
  4. 입력값을 파싱하여 Sensor 인스턴스를 생성합니다.
  5. displayReading 메서드를 호출하여 원래 온도를 표시합니다.
  6. 조정 값과 함께 adjustTemperature 메서드를 호출합니다.
  7. 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 인스턴스를 생성하고 필요한 메서드들을 호출하세요
    
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

로직 & 흐름의 모든 레슨