Menu
CoddyTech

참조 클래스 정의

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 150

RC 객체는 환경처럼 참조입니다. 이를 다른 변수에 할당하거나 함수에 전달해도 복사되지 않으므로, 어떤 이름을 통해 변경하든 하나의 객체가 변경됩니다:

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)
challenge icon

챌린지

쉬움

Book.R에서 필드 title과 author(character), pages(numeric)를 가진 Reference Class Book을 선언하고, 생성기는 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 = "")
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 R 컴파일러