C#의 속성은 클래스의 멤버로, 클래스 내부의 데이터에 접근할 수 있게 해줘요. 호출하는 쪽에서는 그 데이터를 설정하거나 가져올(get) 수 있어요. 속성은 자동 구현 속성일 수도 있고, 백킹 필드를 가질 수도 있어요. 속성은 set 접근자와 get 접근자 중 하나 또는 둘 다로 구성돼요. 다른 언어에서는 "mutator"가 대략 set 접근자에, "accessor"가 대략 get 접근자에 해당하기도 하지만, 문법의 구성 자체는 완전히 달라요.
속성을 설정할 때에는 입력값을 검증하거나, 형식을 다듬거나, 그 밖의 방식으로 조작할 수 있고, 실제로 클래스 안의 코드에서 접근할 수 있는 프로그래밍적 작업이라면 무엇이든 실행할 수 있어요.
마찬가지로 속성을 가져올 때에도 데이터를 계산하거나 형식을 다듬을 수 있고, 이때도 클래스에서 사용할 수 있는 프로그래밍적 작업이라면 무엇이든 실행할 수 있어요.
속성은 다른 클래스 멤버와 마찬가지로 접근 제한자(public, private 등)를 가져요. 다만 set 접근자는 get 접근자와 독립적인 접근 수준을 가질 수 있고, 그 반대도 마찬가지예요. 속성이 두 접근자를 모두 가질 필요는 없고, 하나만 가질 수도 있어요(get 또는 set 중 하나).
속성을 표현하는 기본 문법은 두 가지 형태가 있어요.
private int myField;
public int MyProperty
{
get { return myField; }
set { myField = value; }
}
public int MyProperty { get; private set; } = 42;
초기화는 선택 사항이에요.
이 연습 문제에서는 킬로그램을 단위로 사용하는 저울을 모델링해요.
여섯 개의 과제가 있고, 각 과제에서는 속성을 하나 이상 구현해야 해요.
다양한 요구를 반영하기 위해, 저울마다 정밀도(소수점 아래 자릿수)를 지정할 수 있어요.
WeighingMachine 클래스에, 생성자의 precision 인자로 값이 설정되는 get 전용 Precision 속성을 구현해요:
var wm = new WeighingMachine(precision: 3);
// => wm.Precision == 3
WeighingMachine.Weight 속성을 get과 set이 모두 가능하도록 구현해요:
var wm = new WeighingMachine(precision: 3);
wm.Weight = 60.5;
// => wm.Weight == 60.5
무게는 당연히 음수가 될 수 없어요.
WeighingMachine.Weight 속성에 유효성 검사를 추가해서, 음수 무게를 설정하려고 하면 ArgumentOutOfRangeException 예외를 던지게 해요:
var wm = new WeighingMachine(precision: 3);
wm.Weight = -10; // Throws an ArgumentOutOfRangeException
영점 조정 값은 어떤 값이든 될 수 있어요(음수이거나, 표시되는 무게를 음수로 만드는 값이어도 괜찮아요).
WeighingMachine.TareAdjustment 속성을 영점 조정 값을 설정할 수 있도록 구현해요:
var wm = new WeighingMachine(precision: 3);
wm.TareAdjustment = -10.6;
// => wm.TareAdjustment == -10.6
철저히 테스트해 본 결과, 제조상의 문제로 모든 저울이 무게를 5만큼 과대평가하는 경향이 있는 것 같아요.
WeighingMachine.TareAdjustment 속성의 기본값을 5로 바꿔요.
var wm = new WeighingMachine(precision: 3);
// => wm.TareAdjustment == 5.0
WeighingMachine.DisplayWeight 속성을 구현해요. 이 속성은 영점 조정을 적용한 뒤의 무게를, 올바른 정밀도로 맞추고 단위를 붙여서 보여 주는 문자열을 반환해야 해요.
참고로:
display-weight = input-weight - tare-adjustment
var wm = new WeighingMachine(precision: 3);
wm.Weight = 60.567;
wm.TareAdjustment = 10;
// => wm.DisplayWeight == "50.567 kg"
Exercism에 가입하고 C# 트랙을 개념 62개연습 문제 178개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.