Menu
Coddy logo textTech

S4 클래스 정의

Coddy R 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 22번째.

S4는 R의 공식 객체 시스템입니다. setClass()는 이름이 지정된 슬롯과 각 슬롯의 유형을 사용하여 클래스를 선언하고, new()는 객체를 생성합니다. @ 연산자는 슬롯을 읽습니다:

setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
cat(ada@name, "is", ada@age)

출력:

Ada is 36

setClass()는 생성기 함수도 반환합니다. 이를 이름(일반적으로 클래스 이름)에 할당하고 생성자처럼 호출하세요:

Person <- setClass("Person", slots = c(name = "character", age = "numeric"))
bo <- Person(name = "Bo", age = 7)
print(bo@age + 1)
print(is(bo, "Person"))

출력:

[1] 8
[1] TRUE

S3와 달리 R은 슬롯을 검사합니다. 알 수 없는 슬롯이나 잘못된 유형의 값이 있으면 new()가 오류와 함께 중단되므로 S4 객체는 항상 클래스에서 선언한 형태를 가집니다:

setClass("Person", slots = c(name = "character", age = "numeric"))
p <- new("Person", name = "Cy", age = "ten")

출력:

Error in validObject(.Object) : 
  invalid class “Person” object: invalid object for slot "age" in class "Person": got class "character", should be or extend class "numeric"
Calls: new -> initialize -> initialize -> validObject
Execution halted

지정되지 않은 슬롯에는 character(0)과 같이 해당 유형의 빈 값이 할당됩니다. prototype은 대신 실제 기본값을 설정합니다. 이전 코드는 representation()을 사용하여 슬롯을 선언하며, 이는 slots와 같은 의미입니다:

setClass("Task", slots = c(title = "character", done = "logical"),
         prototype = list(done = FALSE))
setClass("Note", representation(text = "character"))
t <- new("Task", title = "Write report")
print(t@done)
print(length(new("Note")@text))

출력:

[1] FALSE
[1] 0
challenge icon

챌린지

쉬움

Book.R에서 세 개의 슬롯을 가진 S4 클래스 Book을 선언하세요. title과 author의 타입은 character이고, pages의 타입은 numeric이어야 합니다. 그런 다음 @을 사용해 슬롯을 읽고 Dune by Frank Herbert (412 pages)를 반환하는 book_label(b)을 완성하세요.

제공된 코드는 title;author;pages 형식의 줄을 읽고, new("Book", ...)을 사용해 각 책을 생성한 후 레이블을 출력하고, 마지막으로 클래스의 슬롯 이름을 출력합니다.

여러분의 코드는 Book.R에 작성하세요. main.R에는 제공된 입출력 코드가 들어 있으며 수정할 수 없습니다.

직접 해보기

source("Book.R")

# 제공된 입력/출력 코드: 있는 그대로 유지하세요
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
  p <- strsplit(line, ";")[[1]]
  b <- new("Book", title = p[1], author = p[2], pages = as.numeric(p[3]))
  cat(book_label(b), "\n", sep = "")
}
cat("slots: ", paste(slotNames("Book"), collapse = ", "), "\n", sep = "")
quiz icon실력 점검

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

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

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