공장 센서

공장 센서

학습 연습 문제

소개

오류

프로그램이나 코드에 뭔가 잘못되었거나 예상치 못한 일이 있을 때는 오류를 보고하는 게 유용해요.

오류는 JavaScript 객체예요.

이 객체의 주요 속성은 message예요.

const error = new Error('Oops, something went wrong');

console.log(error.message);
// => "Oops, something went wrong"

throw 문법을 사용하면 오류를 던질 수 있어요.

throw new Error('Oops');

오류가 던져지면 현재 실행이 중단되고, 호출 스택의 첫 번째 catch 블록에서 다시 시작해요.

try {
  throw new Error('Oops');
} catch (error) {
  console.log(error.message);
  // => "Oops"
}

상속

상속은 클래스 사이에 부모-자식 관계를 만드는 방법이에요. 자식 클래스(때로는 _서브클래스_라고도 해요)는 부모 클래스(때로는 _슈퍼클래스_라고도 해요)가 정의한 동작과 데이터에 접근할 수 있어요.

class Pet {
  constructor(name) {
    this.name = name;
  }

  introduce() {
    console.log(`This is my pet, ${this.name}.`);
  }
}

class Dog extends Pet {}

const dog = new Dog('Otis');
dog.introduce();
// => This is my pet, Otis.

자식 클래스 선언에 있는 extends 키워드는 프로토타입 체인을 통해 부모 클래스와의 관계를 맺어요.

자식의 생성자로 만들어진 객체는 프로토타입 체인에 부모 클래스의 프로토타입을 가지게 되어, 부모가 정의한 모든 메서드나 데이터에 접근할 수 있어요.

const dog = new Dog('Otis');

Dog.prototype.isPrototypeOf(dog); // => true
Pet.prototype.isPrototypeOf(dog); // => true
Pet.prototype.isPrototypeOf(Dog.prototype); // => true

Pet.prototype.hasOwnProperty('introduce'); // => true
Dog.prototype.hasOwnProperty('introduce'); // => false
dog.hasOwnProperty('introduce'); // => false

JavaScript의 모든 클래스와 마찬가지로, 서브클래스는 extends 키워드를 사용해 Error를 상속해서 사용자 정의 오류를 만들 수 있어요. instanceof 문법은 잡은 오류가 Error의 특정 서브클래스의 인스턴스인지 확인해요.

class CustomError extends Error {}

try {
  // ... Code that may throw an error
} catch (error) {
  if (error instanceof CustomError) {
    console.log('The error thrown is an instance of the CustomError');
  }
}

지침

Elena는 신문 공장의 새 품질 관리자예요. 회사에 막 합류한 Elena는 공장의 몇 가지 공정을 살펴보며 무엇을 개선할 수 있을지 알아보기로 했어요. 그런데 기술자들이 품질 검사를 손으로 직접 많이 하고 있다는 걸 알게 됐어요. 자동화할 좋은 기회가 보였던 Elena는 프리랜서 개발자인 여러분에게 몇몇 기계를 모니터링하는 소프트웨어를 만들어 달라고 부탁해요.

1. 방의 습도 수준 모니터링하기

첫 번째 임무는 생산실의 습도 수준을 모니터링하는 소프트웨어를 작성하는 거예요. 회사 소프트웨어에 이미 연결된 센서가 있어서 방의 습도 백분율을 주기적으로 반환해요.

습도 백분율이 너무 높으면 오류를 던지는 함수를 소프트웨어에 구현해야 해요. 함수의 이름은 checkHumidityLevel이고, 습도 백분율을 매개변수로 받아야 해요.

백분율이 70%를 넘으면 오류를 던져야 해요. 메시지는 중요하지 않아요.

checkHumidityLevel(60);
// => undefined
checkHumidityLevel(100);
// Throws an error

2. 과열 감지하기

Elena는 첫 작업에 아주 만족해서, 이번에는 기계의 온도를 모니터링하는 일을 맡아 달라고 해요. 기술자 Greg와 이야기하던 중, 기계의 온도가 500°C를 넘으면 기술자들이 과열을 걱정하기 시작한다는 걸 알게 돼요.

기계에는 내부 온도를 측정하는 센서가 달려 있어요. 그런데 이 센서는 매우 민감해서 자주 고장 나요. 이럴 때는 기술자들이 센서를 교체해야 해요.

여러분이 할 일은 온도를 매개변수로 받아서, 센서가 고장 났거나 기계가 과열되기 시작하면 오류를 던지는 reportOverheating 함수를 구현하는 거예요. 나중에 오류에 따라 다르게 대응해야 한다는 걸 알고 있으니, 두 종류의 오류를 구분할 방법이 필요해요. 오류 메시지에 의존할 수도 있지만, 그러면 메시지가 바뀔 때 코드가 깨져서 불안정해져요. 그래서 제대로 구분하려면 서로 다른 오류 클래스의 인스턴스를 던져야 해요.

  • 센서가 고장 나면 온도가 null이 돼요. 이 경우에는 ArgumentError를 던져야 해요.
  • 모든 게 정상일 때 온도가 500°C를 넘으면 OverheatingError를 던져야 해요. 이 오류 클래스는 온도를 인자로 받아 인스턴스가 만들어져요. 던지는 OverheatingError에 temperature 프로퍼티가 붙어 있는지 꼭 확인해요.
reportOverheating(null);
// Throws an ArgumentError
reportOverheating(800);
// Throws an OverheatingError

3. 기계 모니터링하기

이제 기계가 오류를 감지할 수 있으니, 그 오류에 여러 방식으로 대응하는 함수를 구현할 거예요.

  • 센서가 고장 났다면 기술자에게 알려야 해요.
  • 온도가 너무 높으면, 온도가 600°C를 넘을 때는 기계를 끄고, 그보다 낮을 때는 경고등을 켜요.
  • 다른 오류가 발생하면 그대로 다시 던져요.

인자 actions를 받는 monitorTheMachine 함수를 구현해요.

actions는 프로퍼티 4개를 가진 객체예요.

프로퍼티 설명
check _함수_예요. 기계의 온도를 확인해요. 여러 가지 오류를 던질 수 있어요.
alertDeadSensor _함수_예요. 온도 센서가 고장 났다고 기술자에게 알려요.
alertOverheating _함수_예요. 기계의 경고등을 켜요.
shutdown _함수_예요. 기계를 꺼요.

monitorTheMachine(actions) 함수는 내부적으로 check()를 호출해야 해요. 호출이 정상적으로 통과되면 함수는 아무것도 반환하지 않아요. throw로 오류가 던져지면, 오류에 따라 다르게 동작해야 해요.

예외 기대 동작
ArgumentError alertDeadSensor 함수를 호출해요.
OverheatingError 과열 프로토콜을 실행해요.
(그 외의 모든 것) 오류를 다시 던져요

과열 프로토콜 온도가 600°C보다 낮으면 alertOverheating 함수를 호출해서 경고등을 켜요. 온도가 600°C를 넘으면 상황이 심각하니 shutdown 함수를 호출해요.

monitorTheMachine({
  check,
  alertDeadSensor,
  alertOverheating,
  shutdown,
});
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
JavaScript Exercism

공장 센서 문제를 시작해 볼 준비가 됐나요?

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