Menu
Coddy logo textTech

기본 제네릭을 위한 메서드

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

R의 기본 패키지에 있는 많은 함수는 S3 제네릭입니다: print(), format(), summary(), toString(), length(), as.character() 등입니다. 메서드를 추가하면 모든 R 사용자가 이미 알고 있는 함수와 함께 클래스를 사용할 수 있습니다. summary.gradebook()은 전체 객체에 대한 정보를 보고합니다:

summary.gradebook <- function(object, ...) {
  paste0(length(object$marks), " marks, average ", mean(object$marks))
}
g <- structure(list(marks = c(70, 85, 91)), class = "gradebook")
cat(summary(g), "\n")

출력:

3 marks, average 82 

메서드를 작성하기 전에 제네릭의 매개변수를 확인하세요. summary()는 첫 번째 인수를 object라고 부르는 반면, toString()과 format()은 이를 x라고 부릅니다. toString()은 하나의 문자열을 반환해야 합니다.

toString.gradebook <- function(x, ...) paste(x$marks, collapse = " / ")
g <- structure(list(marks = c(70, 85, 91)), class = "gradebook")
print(toString(g))

출력:

[1] "70 / 85 / 91"

length() 메서드는 클래스에서 length()가 의미하는 바를 변경합니다. 필드에 항목을 저장하는 큐는 목록의 필드 수가 아니라 자신이 보유한 항목의 수를 보고할 수 있습니다:

q <- structure(list(items = c("a", "b", "c"), name = "jobs"), class = "queue")
print(length(q))
length.queue <- function(x) length(x$items)
print(length(q))

출력:

[1] 2
[1] 3

연산자도 제네릭입니다. "+.money"라는 이름의 메서드는 기호이기 때문에 따옴표로 작성되며, +의 어느 한쪽이든 money 객체일 때 실행됩니다. 이 메서드는 양쪽 피연산자를 e1과 e2로 받습니다:

new_money <- function(amount) structure(list(amount = amount), class = "money")
"+.money" <- function(e1, e2) new_money(e1$amount + e2$amount)
"==.money" <- function(e1, e2) e1$amount == e2$amount
a <- new_money(5)
b <- new_money(7)
print((a + b)$amount)
print(a == b)

출력:

[1] 12
[1] FALSE
challenge icon

챌린지

쉬움

스택은 항목을 items 필드에 저장하며, 스택의 최상단 항목은 마지막에 있습니다. Stack.R에는 new_stack(), push() 및 pop()이 제공됩니다. 세 가지 메서드를 추가하세요:

  • length.stack()은 항목 수를 반환합니다.
  • toString.stack()은 최상단부터 최하단까지의 항목을 | 로 연결하여 반환하거나, empty를 반환합니다.
  • summary.stack()은 stack of 3, top: c를 반환하며, 비어 있을 때는 stack of 0을 반환합니다.

제공된 코드는 push <item> 및 pop 명령을 읽은 다음 길이, toString() 및 summary()를 출력합니다.

작성한 코드는 Stack.R에 넣으세요. main.R에는 제공된 입력/출력 코드가 들어 있으며 편집할 수 없습니다.

직접 해보기

source("Stack.R")

# 제공된 입력/출력 코드: 그대로 유지하세요
input <- suppressWarnings(readLines(file("stdin")))
s <- new_stack()
for (cmd in input) {
  if (cmd == "pop") s <- pop(s) else s <- push(s, substring(cmd, 6))
}
cat("length: ", length(s), "\n", sep = "")
cat("items: ", toString(s), "\n", sep = "")
cat(summary(s), "\n", sep = "")
quiz icon실력 점검

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

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

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