Menu
Coddy logo textTech

백킹 필드

Coddy C# 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 70개 중 17번째.

자동 구현 프로퍼티는 편리하지만, 때로는 프로퍼티가 값을 저장하거나 검색하는 방식을 더 세밀하게 제어해야 할 때가 있습니다. 이럴 때 백킹 필드(backing fields)가 사용됩니다. 백킹 필드는 프로퍼티의 실제 데이터를 저장하는 private 필드입니다.

public class Product
{
    private decimal _price;  // 백킹 필드
    
    public decimal Price
    {
        get { return _price; }
        set { _price = value; }
    }
}

이것은 자동 구현 프로퍼티(auto-properties)에 비해 추가적인 작업처럼 보일 수 있지만, 백킹 필드(backing fields)를 사용하면 로직을 추가할 수 있습니다. 예를 들어, 데이터를 저장하기 전에 유효성을 검사할 수 있습니다:

public class Product
{
    private decimal _price;
    
    public decimal Price
    {
        get => _price;
        set => _price = value < 0 ? 0 : value;
    }
}

이제 음수 가격은 자동으로 0이 됩니다. 또한 데이터를 읽거나 쓸 때 데이터를 변환하거나, 변경 사항을 기록하거나, 다른 작업을 트리거할 수도 있습니다.

백킹 필드(backing field) 명명 규칙은 일반적으로 속성(property)과 구분하기 위해 언더스코어 접두사(_price) 또는 소문자(price)를 사용합니다.

public decimal Price { get; set; }와 같은 자동 구현 프로퍼티를 사용하면, 컴파일러는 실제로 사용자를 위해 숨겨진 백킹 필드(backing field)를 생성합니다. 명시적 백킹 필드는 동일한 저장 공간을 제공하면서 동작에 대한 완전한 제어권을 부여합니다.

challenge icon

챌린지

쉬움

데이터가 저장되고 검색될 때 데이터를 검증하고 변환하기 위해 지원 필드(backing fields)를 사용하는 온도 센서 시스템을 구축해 보겠습니다.

코드를 구성하기 위해 두 개의 파일을 생성합니다:

  • TemperatureSensor.cs: Sensors 네임스페이스 안에 TemperatureSensor 클래스를 정의합니다. 이 센서는 섭씨 온도를 측정하지만, 측정값이 유효한 범위 내에 있는지 확인해야 합니다. 지원 필드를 사용하여 다음을 구현하세요:
    • 지원 필드 _location을 사용하는 Location 속성(string). 위치를 설정할 때 값이 null이거나 비어 있으면 대신 "Unknown"을 저장합니다.
    • 지원 필드 _temperature를 사용하는 Temperature 속성(double). 온도를 설정할 때 값을 -50150 사이로 제한합니다(-50보다 작으면 -50을 저장하고, 150보다 크면 150을 저장합니다).
    • 공식 (celsius * 9 / 5) + 32를 사용하여 화씨 온도를 계산하고 반환하는 읽기 전용 속성 TemperatureFahrenheit. 이 속성은 지원 필드를 직접 사용해야 합니다.
    • 위치와 초기 온도 값을 받는 생성자.
  • Program.cs: 메인 파일에서 입력 값을 사용하여 센서를 생성하고 측정값을 표시합니다. 그런 다음 두 번째 입력 값으로 온도를 업데이트하고 업데이트된 측정값을 표시합니다.

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

  • 센서 위치
  • 초기 온도 측정값
  • 업데이트된 온도 측정값

출력은 다음 형식으로 인쇄하세요:

Sensor: {Location}
Temperature: {Temperature}C ({TemperatureFahrenheit}F)
Updated Temperature: {Temperature}C ({TemperatureFahrenheit}F)

예를 들어, 입력값이 Lab Room, 25, 200인 경우 출력은 다음과 같아야 합니다:

Sensor: Lab Room
Temperature: 25C (77F)
Updated Temperature: 150C (302F)

두 번째 측정값인 200이 최대 유효 온도를 초과하기 때문에 150으로 제한되는 방식에 주목하세요. 지원 필드를 통해 데이터가 저장되는 방식을 이처럼 제어할 수 있습니다!

치트 시트

백킹 필드(Backing field)는 속성(property)의 실제 데이터를 저장하는 프라이빗(private) 필드로, 값을 가져오거나 설정할 때 사용자 정의 로직을 추가할 수 있게 해줍니다.

기본 백킹 필드 구문

public class Product
{
    private decimal _price;  // Backing field
    
    public decimal Price
    {
        get { return _price; }
        set { _price = value; }
    }
}

식 본문(Expression-Bodied) 구문

public decimal Price
{
    get => _price;
    set => _price = value;
}

유효성 검사 로직 추가하기

백킹 필드를 사용하면 데이터를 저장하기 전에 유효성을 검사하거나 변환할 수 있습니다.

private decimal _price;

public decimal Price
{
    get => _price;
    set => _price = value < 0 ? 0 : value;  // Prevent negative prices
}

명명 규칙

백킹 필드는 일반적으로 속성 이름과 구분하기 위해 밑줄 접두사(_price)를 사용하거나 소문자(price)를 사용합니다.

자동 구현 속성 vs 백킹 필드

public decimal Price { get; set; }와 같은 자동 구현 속성은 숨겨진 백킹 필드를 자동으로 생성합니다. 명시적 백킹 필드는 동일한 저장 공간을 제공하면서 동작에 대한 완전한 제어권을 부여합니다.

직접 해보기

using System;
using Sensors;

class Program
{
    public static void Main(string[] args)
    {
        // 입력 읽기
        string location = Console.ReadLine();
        double initialTemp = Convert.ToDouble(Console.ReadLine());
        double updatedTemp = Convert.ToDouble(Console.ReadLine());

        // TODO: location 및 initial temperature를 사용하여 TemperatureSensor 생성

        // TODO: 센서의 location 및 초기 temperature 측정값 출력
        // 형식: "Sensor: {Location}"
        // 형식: "Temperature: {Temperature}C ({TemperatureFahrenheit}F)"

        // TODO: 센서의 temperature를 updated value로 업데이트

        // TODO: 업데이트된 temperature 측정값 출력
        // 형식: "Updated Temperature: {Temperature}C ({TemperatureFahrenheit}F)"
    }
}
quiz icon실력 점검

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

객체 지향 프로그래밍의 모든 레슨