참조 클래스 정의
Coddy R 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 37번째.
참조 클래스(RC)는 Java나 Python처럼 제자리에서 변경되는 객체를 위한 R의 시스템입니다. setRefClass()는 형식이 지정된 필드를 가진 클래스를 선언하고 생성기를 반환합니다. $new()는 객체를 생성하며, $는 해당 필드를 읽고 변경합니다:
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
a <- Account$new(owner = "Ada", balance = 100)
a$balance <- a$balance + 50
cat(a$owner, a$balance)출력:
Ada 150RC 객체는 환경과 같은 참조입니다. 이를 다른 변수에 할당하거나 함수에 전달해도 복사되지 않으므로, 어떤 이름을 통해 변경하더라도 하나의 객체가 변경됩니다:
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
pay_fee <- function(acc) acc$balance <- acc$balance - 5
a <- Account$new(owner = "Ada", balance = 100)
b <- a
b$balance <- 60
pay_fee(a)
cat(a$balance, b$balance)출력:
55 55필드는 타입이 지정됩니다. 잘못된 클래스의 값을 할당하면 거부되며, 필드는 기존 값을 유지합니다:
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
a <- Account$new(owner = "Ada", balance = 100)
msg <- tryCatch({ a$balance <- "lots"; "changed" }, error = function(e) conditionMessage(e))
cat(msg, "\n")
cat(a$balance, "\n")출력:
invalid assignment for reference class field ‘balance’, should be from class “numeric” or a subclass (was class “character”)
100 생성기는 클래스를 설명합니다. Account$fields()는 필드와 해당 형식을 나열합니다. show 메서드 없이 출력된 객체는 필드를 나열하며, 값이 지정되지 않은 필드는 비어 있습니다:
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
print(Account$fields())
Account$new(owner = "Bo")출력:
owner balance
"character" "numeric"
Reference class object of class "Account"
Field "owner":
[1] "Bo"
Field "balance":
numeric(0)챌린지
쉬움Book 참조 클래스를 Book.R에 선언하고, title과 author(문자형), pages(수치형) 필드를 포함하며 생성기를 Book에 유지하세요. 그런 다음 책의 페이지 수에 n을 제자리에서 더하고 유용한 값을 반환하지 않는 add_pages(book, n)을 작성하세요.
제공된 코드는 title;author;pages를 읽고, 책을 생성한 다음, 이를 두 번째 변수에 할당하고, 그 두 번째 이름을 통해 나머지 숫자들을 더한 뒤, 원래 책과 필드 이름을 출력합니다.
여러분의 코드는 Book.R에 작성합니다. main.R에는 제공된 입력/출력 코드가 들어 있으며 수정할 수 없습니다.
직접 해보기
source("Book.R")
# 제공된 입력/출력 코드: 그대로 유지하세요
input <- suppressWarnings(readLines(file("stdin")))
p <- strsplit(input[1], ";")[[1]]
b <- Book$new(title = p[1], author = p[2], pages = as.numeric(p[3]))
alias <- b
for (n in as.numeric(input[-1])) add_pages(alias, n)
cat(b$title, " by ", b$author, ": ", b$pages, " pages\n", sep = "")
cat("fields: ", paste(names(Book$fields()), collapse = ", "), "\n", sep = "")
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 R 컴파일러