가장 먼저 할 일
initialize()라는 특별한 public 메서드가 하나 있습니다(미국식 철자에 주의하세요). 이 메서드는 사용자가 직접 호출하지 않습니다. 대신 객체가 생성될 때, 즉 사용자가 new()를 호출할 때 자동으로 실행됩니다.
initialize()는 R6 객체를 만들 때 private 필드의 값을 설정할 수 있게 해줍니다. initialize() 함수의 패턴은 다음과 같습니다.
thing_factory <- R6Class(
"Thing",
private = list(
a_field = "a value",
another_field = 123
),
public = list(
initialize = function(a_field, another_field) {
if(!missing(a_field)) {
private$a_field <- a_field
}
if(!missing(another_field)) {
private$another_field <- another_field
}
}
)
)
missing()(docs)의 사용에 주목하세요. 이 함수는 함수 호출에서 인수가 전달되지 않았으면 TRUE를 반환합니다.
factory의 new() 메서드로 전달된 인수는 initialize()로 전달됩니다.
a_thing <- thing_factory$new(
a_field = "a different value",
another_field = 456
)
이 연습은 강의의 일부입니다
R에서 S3와 R6로 배우는 Object-Oriented Programming
연습 안내
전자레인지(factory)가 일부만 정의되어 있습니다.
initialize()라는 public 메서드를 추가하세요. 객체가 생성될 때 사용자가power_rating_watts와door_is_open필드를 설정할 수 있어야 합니다.- 인수 이름은
power_rating_watts와door_is_open이어야 합니다. initialize()메서드 본문에서는 각 인수에 대해, 해당 인수가missing()(docs)이 아니면 대응되는 private 필드를 설정하세요.
- 인수 이름은
- 전력 정격이
650와트이고 문이 열린 전자레인지 객체를 생성하세요.microwave_oven_factory의new()메서드를 호출하세요.new()에power_rating_watts = 650과door_is_open = TRUE인수를 전달하세요.- 결과를
a_microwave_oven에 할당하세요.
실습형 인터랙티브 연습
이 예제를 이 샘플 코드를 완성하여 풀어보세요.
# Add an initialize method
microwave_oven_factory <- R6Class(
"MicrowaveOven",
private = list(
power_rating_watts = 800,
door_is_open = FALSE
),
public = list(
cook = function(time_seconds) {
Sys.sleep(time_seconds)
print("Your food is cooked!")
},
open_door = function() {
private$door_is_open <- TRUE
},
close_door = function() {
private$door_is_open <- FALSE
},
# Add initialize() method here
___ = ___(___, ___) {
if(!missing(power_rating_watts)) {
private$power_rating_watts <- power_rating_watts
}
___
}
)
)
# Make a microwave
a_microwave_oven <- ___