Menu
Coddy logo textTech

클래스 벡터

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

S3 상속은 클래스 벡터에서 비롯됩니다. class = c("manager", "employee")를 가진 객체는 관리자이면서 동시에 직원입니다. 제네릭에 manager 메서드가 없으면 디스패치가 계속 진행되어 employee 메서드를 사용합니다:

pay <- function(x) UseMethod("pay")
pay.employee <- function(x) x$salary / 12
m <- structure(list(name = "Ada", salary = 60000), class = c("manager", "employee"))
print(class(m))
print(pay(m))

출력:

[1] "manager"  "employee"
[1] 5000

모든 생성자에서 클래스 벡터를 직접 작성하면 부모의 세부 정보가 반복됩니다. 대신 부모 생성자가 class 인수를 받아 자신의 클래스 앞에 추가하고, 자식 생성자가 부모 생성자를 호출하도록 합니다:

new_employee <- function(name, salary, ..., class = character()) {
  structure(list(name = name, salary = salary, ...), class = c(class, "employee"))
}
new_manager <- function(name, salary, reports) {
  new_employee(name, salary, reports = reports, class = "manager")
}
m <- new_manager("Ada", 60000, 4)
print(class(m))
print(names(m))

출력:

[1] "manager"  "employee"
[1] "name"    "salary"  "reports"

부모 생성자의 ...는 자식의 추가 필드(여기서는 reports)를 수집하여 부모 고유의 필드 뒤에 배치합니다. 일반 직원에게는 reports 필드가 아예 없습니다:

new_employee <- function(name, salary, ..., class = character()) {
  structure(list(name = name, salary = salary, ...), class = c(class, "employee"))
}
e <- new_employee("Bo", 40000)
print(class(e))
print(names(e))

출력:

[1] "employee"
[1] "name"   "salary"

클래스 벡터의 순서가 중요합니다. 가장 구체적인 클래스가 먼저 와야 합니다. 부모 클래스를 먼저 배치하면 부모 클래스의 메서드가 우선 적용되어 자식 클래스의 메서드는 절대 사용되지 않습니다:

title <- function(x) UseMethod("title")
title.employee <- function(x) "employee"
title.manager <- function(x) "manager"
right <- structure(list(), class = c("manager", "employee"))
wrong <- structure(list(), class = c("employee", "manager"))
print(title(right))
print(title(wrong))

출력:

[1] "manager"
[1] "employee"
challenge icon

챌린지

쉬움

직원과 관리자는 두 파일로 나뉘어 있습니다. Employee.R의 new_employee(name, salary, ..., class = character())를 완성하세요. 이 함수는 name, salary 및 ...에서 전달된 추가 필드를 포함하는 리스트를 반환하며, 클래스 벡터는 c(class, "employee")입니다. 그런 다음 Manager.R의 new_manager(name, salary, reports)를 완성하세요. 이 함수는 추가 필드 reports와 클래스 manager를 사용하여 new_employee()를 호출합니다.

label()과 해당 employee 메서드는 제공되어 있으므로, 관리자는 자체 메서드 없이도 레이블을 얻습니다. 제공된 코드는 employee Bo 40000 또는 manager Ada 60000 4 형식의 줄을 읽고 클래스 벡터, 필드 이름 및 레이블을 출력합니다.

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

직접 해보기

source("Employee.R")
source("Manager.R")

# 제공된 입력/출력 코드: 그대로 유지하세요
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
  p <- strsplit(line, " ")[[1]]
  x <- if (p[1] == "manager") new_manager(p[2], as.numeric(p[3]), as.numeric(p[4])) else new_employee(p[2], as.numeric(p[3]))
  cat("class: ", paste(class(x), collapse = ", "), "\n", sep = "")
  cat("fields: ", paste(names(x), collapse = ", "), "\n", sep = "")
  cat(label(x), "\n", sep = "")
}
quiz icon실력 점검

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

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

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