Menu
Coddy logo textTech

NextMethod 기초

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

메서드 안에서 NextMethod()는 동일한 제네릭에 대해 같은 인수를 사용하여 다음 순서의 메서드를 호출합니다. 클래스가 하나인 객체의 경우 다음 메서드는 기본 메서드이므로, 메서드는 일반적인 응답을 재사용하고 여기에 내용을 추가할 수 있습니다:

describe <- function(x) UseMethod("describe")
describe.default <- function(x) paste("an object with", length(x), "fields")
describe.task <- function(x) paste0(NextMethod(), ", titled ", x$title)
t <- structure(list(title = "Buy milk", done = FALSE), class = "task")
print(describe(t))

출력:

[1] "an object with 2 fields, titled Buy milk"

객체는 c("urgent", "task")와 같이 벡터에서 여러 클래스를 가질 수 있습니다. 디스패치는 클래스를 순서대로 시도하며, 첫 번째 메서드의 NextMethod()는 다음 클래스에 해당하는 메서드로 넘어갑니다:

describe <- function(x) UseMethod("describe")
describe.task <- function(x) paste("task:", x$title)
describe.urgent <- function(x) paste("URGENT", NextMethod())
fix <- structure(list(title = "Fix the leak"), class = c("urgent", "task"))
print(describe(fix))

출력:

[1] "URGENT task: Fix the leak"

NextMethod()는 메서드가 받은 모든 인수를 전달하며, 여기에는 sep와 같은 추가 인수도 포함됩니다. 다음 메서드는 인수를 다시 나열하지 않아도 동일한 값을 확인합니다:

label <- function(x, sep = ": ") UseMethod("label")
label.default <- function(x, sep = ": ") paste0("item", sep, x$name)
label.box <- function(x, sep = ": ") paste0("[", NextMethod(), "]")
b <- structure(list(name = "tools"), class = "box")
print(label(b))
print(label(b, sep = " = "))

출력:

[1] "[item: tools]"
[1] "[item = tools]"

Base R은 벡터의 부분 집합을 만들 때 클래스를 유지하기 위해 NextMethod()를 사용합니다. 기본 [는 클래스를 제거하므로, "[.percent" 메서드가 작업을 수행하고 클래스를 다시 추가하도록 합니다:

format.percent <- function(x, ...) paste0(unclass(x) * 100, "%")
"[.percent" <- function(x, i) structure(NextMethod(), class = "percent")
p <- structure(c(0.1, 0.25, 0.5), class = "percent")
print(format(p[2:3]))

출력:

[1] "25%" "50%"
challenge icon

챌린지

쉬움

작업과 긴급 작업은 두 파일에 있는 두 개의 클래스입니다. Task.R에서 an item을 반환하는 일반 describe() 및 기본 메서드와, NextMethod()를 호출하고 제목을 추가하여 an item: Buy milk를 반환하는 describe.task()를 완성하세요. Urgent.R에서는 NextMethod()를 호출하여 URGENT an item: Fix bug를 반환하는 describe.urgent()를 완성하세요.

생성자는 제공되어 있습니다. 긴급 작업의 클래스는 c("urgent", "task")입니다. 제공된 코드는 task Buy milk, urgent Fix bug 또는 제목이 있는 다른 단어로 이루어진 줄을 읽고, 해당 클래스의 객체로 만든 다음 각각에 대해 describe()를 출력합니다.

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

직접 해보기

source("Task.R")
source("Urgent.R")

# 제공된 입력/출력 코드: 그대로 유지하세요
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
  kind <- sub(" .*", "", line)
  title <- sub("^[a-z]+ ", "", line)
  t <- if (kind == "urgent") new_urgent(title) else if (kind == "task") new_task(title) else structure(list(title = title), class = kind)
  cat(describe(t), "\n", sep = "")
}
quiz icon실력 점검

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

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

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