백킹 필드
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)를 생성합니다. 명시적 백킹 필드는 동일한 저장 공간을 제공하면서 동작에 대한 완전한 제어권을 부여합니다.
챌린지
쉬움데이터가 저장되고 검색될 때 데이터를 검증하고 변환하기 위해 지원 필드(backing fields)를 사용하는 온도 센서 시스템을 구축해 보겠습니다.
코드를 구성하기 위해 두 개의 파일을 생성합니다:
TemperatureSensor.cs:Sensors네임스페이스 안에TemperatureSensor클래스를 정의합니다. 이 센서는 섭씨 온도를 측정하지만, 측정값이 유효한 범위 내에 있는지 확인해야 합니다. 지원 필드를 사용하여 다음을 구현하세요:- 지원 필드
_location을 사용하는Location속성(string). 위치를 설정할 때 값이 null이거나 비어 있으면 대신"Unknown"을 저장합니다. - 지원 필드
_temperature를 사용하는Temperature속성(double). 온도를 설정할 때 값을-50과150사이로 제한합니다(-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)"
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.