트랙
/
C#
C#
/
연습 문제
/
텔레메트리 구축
텔레메트리 구축

텔레메트리 구축

학습 연습 문제

소개

매개변수

이 연습 문제에서는 C#에서 메서드 매개변수의 세부 사항과 그 사용법에 대해 다뤄요.

매개변수는 호출하는 메서드에서 호출되는 메서드로 정보를 전달해요.

  • 매개변수의 동작은 ref와 out 같은 한정자를 사용하여 수정할 수 있어요.

  • out 한정자가 있는 매개변수는 호출된 메서드에서 호출자로 값을 다시 전달해요. 이 매개변수는 초기화하지 않고 호출된 메서드에 전달할 수 있으며, 어떤 경우든 호출된 메서드 내에서는 진입 시점에 초기화되지 않은 것처럼 취급돼요. 매개변수 한정자에 관한 동작과 규칙은 예제(아래 참조)와 컴파일러 메시지를 통해 가장 쉽게 이해할 수 있어요.

void Foo(out int val)
{
    val = 42;
}
void Bar(int val)
{
    val = 42;
}

int importantValue = 1729;
Foo(out importantValue);
var result = importantValue == 42;
// => true

importantValue = 1729;
Bar(importantValue);
result = importantValue == 1729;
// => true
  • out 매개변수는 호출된 메서드 안에서 반드시 할당해야 해요.

  • ref 한정자가 있는 매개변수는 호출된 메서드로 값을 전달해요. 메서드가 반환되면 호출자는 호출된 메서드가 해당 매개변수에 수행한 모든 업데이트를 확인할 수 있어요.

void Foo(ref int val)
{
    val *= 7;
}

int importantValue = 6;
Foo(ref importantValue);
return importantValue;
// => 42
  • ref 매개변수는 변수여야 해요. 호출된 메서드가 호출자가 보는 그대로의 매개변수를 직접 다루기 때문이에요.
  • out과 ref 한정자는 호출된 메서드 시그니처와 호출 지점 모두에서 필요해요.

지침

classes 연습 문제에서 시작한 원격 조종 자동차 프로젝트가 잘 진행됐어요(축하해요!). 그리고 최근 여러 후원 계약 덕분에 개선 작업에 쓸 예산도 생겼어요.

예산의 일부는 텔레메트리를 제공하는 데 쓰이고 있어요.

후원사들의 마음을 붙잡아 두기 위해, 자동차가 트랙을 돌 때 후원사 이름을 표시하는 패널이 차에 설치됐어요.

이 멋진 신기술이 도입되면서 자동차의 배터리 수명이 크게 줄었다는 점도 눈치챘을 거예요.

1. 원격 조종 자동차가 후원사 이름을 표시하도록 만들기

하나 이상의 후원사 이름을 받아 자동차에 저장하도록 SetSponsors()를 구현해요.

SetSponsors() 메서드의 인자는 null이 아님이 보장돼요.

선택한 후원사를 표시하도록 DisplaySponsor()를 구현해요. 처음 전달된 후원사의 sponsorNum은 0이고, 두 번째는 1, 그다음은 이런 식이에요.

var car = RemoteControlCar.Buy();
car.SetSponsors("Exercism", "Walker Industries", "Acme Co.");
var sp2 = car.DisplaySponsor(sponsorNum: 1);
// => "Walker Industries"

2. 자동차의 텔레메트리 데이터 가져오기

RemoteControlCar.GetTelemetryData() 메서드를 구현해요.

GetTelemetryData()는 배터리 잔량과 미터 단위 주행 거리를 out 매개변수를 통해 사용할 수 있게 해야 해요.

serialNum 인자가 이전에 받은 값보다 작으면 GetTelemetryData()는 false를 반환해야 해요. (여러 텔레메트리 노드가 관련된 문제가 있어요.) 이 경우 serialNum은 이전 serialNum 중 가장 높은 값으로 설정되고, 배터리 잔량과 주행 거리(미터)는 모두 -1로 설정돼요. 호출이 성공하면 serialNum은 그대로 유지돼요.

var car = RemoteControlCar.Buy();
car.Drive();
car.Drive();
int serialNum = 4;
car.GetTelemetryData(ref serialNum, out int batteryPercentage, out int distanceDrivenInMeters);
// => true, 4L, 80, 4

serialNum = 1;
car.GetTelemetryData(ref serialNum, out batteryPercentage, out distanceDrivenInMeters);
// => false, 4L, -1, -1

3. 텔레메트리 시스템이 미터당 배터리 사용량을 가져올 수 있도록 기능 추가하기

TelemetryClient.GetBatteryUsagePerMeter() 메서드를 구현해요.

이 메서드는 RemoteControlCar.GetTelemetryData()를 호출해요. GetTelemetryData()가 false를 반환하거나 자동차가 주행하지 않았다면, 이 루틴은 "no data"를 반환해야 해요. GetTelemetryData()가 true를 반환하면 "usage-per-meter=BATTERY-USAGE-PER-METER" 형식의 메시지를 반환해야 해요. 여기서 계산은 (100 - 현재 배터리 잔량)을 지금까지 주행한 거리(미터)로 나눈 값이에요.

var car = RemoteControlCar.Buy();
car.Drive();
car.Drive();
var tc = new TelemetryClient(car);
int serialNum = 4;
tc.GetBatteryUsagePerMeter(serialNum);
// => "usage-per-meter=5"

serialNum = 1;
tc.GetBatteryUsagePerMeter(serialNum);
// => "no data"
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
C# Exercism

텔레메트리 구축 문제를 시작해 볼 준비가 됐나요?

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