1. 학습
  2. /
  3. 강의
  4. /
  5. R에서 S3와 R6로 배우는 Object-Oriented Programming

Connected

연습 문제

정전기

R6 클래스는 환경(environment)의 참조에 의한 복사(copy by reference) 동작을 활용해 객체 간에 필드를 공유할 수 있어요. 이를 설정하려면 shared라는 이름의 private 필드를 정의하세요. 이 필드는 여러 줄로 정의하며 다음을 수행해야 합니다.

  • 새로운 environment를 만듭니다.
  • 공유할 필드를 그 environment에 할당합니다.
  • 해당 environment를 반환합니다.

공유 필드는 활성 바인딩을 통해 접근해야 해요. 이는 지금까지 보신 다른 활성 바인딩과 동일하게 동작하지만, 필드를 가져오거나 설정할 때 private$shared$ 접두사를 사용한다는 점이 다릅니다.

R6Class(
  "Thing",
  private = list(
    shared = {
      e <- new.env()
      e$a_shared_field <- 123
      e
    }
  ),
  active = list(
    a_shared_field = function(value) {
      if(missing(value)) {
        private$shared$a_shared_field
      } else {
        private$shared$a_shared_field <- value
      }
    }
  )
)

활성 바인딩의 이름은 가져오거나 설정하려는 공유 필드의 이름과 반드시 같아야 합니다. 위 예시에서는 둘 다 a_shared_field예요.

지침

100 XP

MicrowaveOven 클래스의 일부가 미리 정의되어 있어요.

  • MicrowaveOven 클래스의 private 요소에서 shared라는 필드를 업데이트하세요.
    • 이 필드는 중괄호 {}로 감싼 세 줄의 코드여야 합니다.
    • 먼저 new.env()(docs)를 호출해 e라는 새 environment를 만들고, 그다음…
    • e에 safety_warning라는 변수를 할당하는데, 값은 "Warning. Do not try to cook metal objects."로 하세요. 그리고…
    • 마지막으로 그 environment를 반환하세요.
  • private로 공유되는 safety_warning 필드를 가져오거나 설정하는, safety_warning라는 이름의 활성 바인딩을 추가하세요.
    • 이는 active 요소 내부에 함수로 정의합니다.
    • 이 함수는 value라는 단일 인수를 받아요.
    • private$shared$safety_warning를 가져오거나 설정하도록 구현하세요.
  • 각각 a_microwave_oven과 another_microwave_oven라는 이름의 MicrowaveOven 객체 두 개를 생성하세요.
  • a_microwave_oven의 safety_warning 필드를 "Warning. If the food is too hot you may scald yourself."로 변경하세요.
  • 변경 사항을 확인하기 위해 another_microwave_oven의 safety_warning 필드를 확인하세요.