저울

저울

학습 연습 문제

소개

속성

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;

초기화는 선택 사항이에요.

지침

이 연습 문제에서는 킬로그램을 단위로 사용하는 저울을 모델링해요.

여섯 개의 과제가 있고, 각 과제에서는 속성을 하나 이상 구현해야 해요.

1. 저울에 정밀도를 설정할 수 있게 하기

다양한 요구를 반영하기 위해, 저울마다 정밀도(소수점 아래 자릿수)를 지정할 수 있어요. WeighingMachine 클래스에, 생성자의 precision 인자로 값이 설정되는 get 전용 Precision 속성을 구현해요:

var wm = new WeighingMachine(precision: 3);

//  => wm.Precision == 3

2. 저울에 무게를 설정할 수 있게 하기

WeighingMachine.Weight 속성을 get과 set이 모두 가능하도록 구현해요:

var wm = new WeighingMachine(precision: 3);
wm.Weight = 60.5;

//  => wm.Weight == 60.5

3. 음수 무게 입력을 거부하기

무게는 당연히 음수가 될 수 없어요. WeighingMachine.Weight 속성에 유효성 검사를 추가해서, 음수 무게를 설정하려고 하면 ArgumentOutOfRangeException 예외를 던지게 해요:

var wm = new WeighingMachine(precision: 3);
wm.Weight = -10; // Throws an ArgumentOutOfRangeException

4. 저울에 영점 조정을 적용할 수 있게 하기

영점 조정 값은 어떤 값이든 될 수 있어요(음수이거나, 표시되는 무게를 음수로 만드는 값이어도 괜찮아요). WeighingMachine.TareAdjustment 속성을 영점 조정 값을 설정할 수 있도록 구현해요:

var wm = new WeighingMachine(precision: 3);
wm.TareAdjustment = -10.6;

// => wm.TareAdjustment == -10.6

5. 저울에 기본 영점 조정 값을 설정하기

철저히 테스트해 본 결과, 제조상의 문제로 모든 저울이 무게를 5만큼 과대평가하는 경향이 있는 것 같아요. WeighingMachine.TareAdjustment 속성의 기본값을 5로 바꿔요.

var wm = new WeighingMachine(precision: 3);

// => wm.TareAdjustment == 5.0

6. 무게를 읽어 올 수 있게 하기

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"
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
C# Exercism

저울 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 C# 트랙을 개념 62개연습 문제 178개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.