Menu
Coddy logo textTech

내장 기능을 위한 메서드

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

setMethod()는 length()와 summary() 같은 기본 함수에 S4 메서드를 추가하기도 합니다. 기본 함수는 다른 모든 경우에 계속 작동하고, 여러분의 클래스에는 고유한 동작이 적용됩니다:

setClass("Playlist", slots = c(name = "character", songs = "character"))
setMethod("length", "Playlist", function(x) length(x@songs))
pl <- new("Playlist", name = "gym", songs = c("a", "b", "c"))
print(length(pl))
print(length(c(1, 2)))

출력:

[1] 3
[1] 2

연산자도 제네릭입니다. +에 대한 메서드는 signature()에서 양쪽의 클래스 이름을 지정합니다. 두 인수는 e1과 e2라고 합니다:

setClass("Money", slots = c(amount = "numeric"))
setMethod("show", "Money", function(object) cat(sprintf("%.2f", object@amount), "\n"))
setMethod("+", signature("Money", "Money"), function(e1, e2) {
  new("Money", amount = e1@amount + e2@amount)
})
new("Money", amount = 2.5) + new("Money", amount = 4)

출력:

6.50 

그룹 제네릭 Arith는 +, -, *, /, ^ 및 나머지 연산자를 한 번에 나타냅니다. 해당 메서드 내부의 callGeneric()는 전달한 값에 사용된 연산자를 그대로 반복합니다.

setClass("Money", slots = c(amount = "numeric"))
setMethod("Arith", signature("Money", "numeric"), function(e1, e2) {
  new("Money", amount = callGeneric(e1@amount, e2))
})
m <- new("Money", amount = 10)
cat((m * 3)@amount, (m / 4)@amount, (m - 1)@amount)

출력:

30 2.5 9

그룹 제네릭 Compare는 ==, <, > 및 기타 연산자를 포함합니다. 이 메서드는 슬롯에 대해 callGeneric()이 반환하는 논리값을 반환합니다:

setClass("Money", slots = c(amount = "numeric"))
setMethod("Compare", signature("Money", "Money"), function(e1, e2) {
  callGeneric(e1@amount, e2@amount)
})
a <- new("Money", amount = 5)
b <- new("Money", amount = 8)
cat(a < b, a == b, a >= b)

출력:

TRUE FALSE FALSE
challenge icon

챌린지

쉬움

Money 클래스는 Money.R에서 amount(numeric) 및 currency(character) 슬롯을 가집니다. 네 가지 메서드를 추가하세요:

  • show()는 12.50 EUR과 줄바꿈을 출력합니다;
  • 두 Money 객체에 대한 +는 합계를 반환하거나, 통화가 다를 때 call. = FALSE를 사용하여 cannot add EUR and USD와 함께 중지합니다;
  • Money와 숫자에 대한 *는 금액을 스케일링한 값을 반환합니다;
  • 두 Money 객체에 대한 ==는 amount와 currency가 모두 같을 때 TRUE입니다.

제공된 코드는 10:EUR + 2.5:EUR, 4:USD * 3 또는 1:EUR == 1:EUR 행을 읽고 결과 또는 error: 와 메시지를 출력합니다.

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

직접 해보기

source("Money.R")

# 제공된 입출력 코드: 있는 그대로 유지하세요
input <- suppressWarnings(readLines(file("stdin")))
parse_money <- function(t) {
  p <- strsplit(t, ":")[[1]]
  new("Money", amount = as.numeric(p[1]), currency = p[2])
}
for (line in input) {
  p <- strsplit(line, " ")[[1]]
  a <- parse_money(p[1])
  tryCatch({
    if (p[2] == "+") print(a + parse_money(p[3]))
    if (p[2] == "*") print(a * as.numeric(p[3]))
    if (p[2] == "==") cat(a == parse_money(p[3]), "\n", sep = "")
  }, error = function(e) cat("error: ", conditionMessage(e), "\n", sep = ""))
}
quiz icon실력 점검

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

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

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