Menu
Coddy logo textTech

출력 및 형식 지정 메서드

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

값이 출력될 때 R은 print() 함수를 호출합니다. 클래스에 대해 특별히 지정된 것이 없으면 S3 객체는 클래스 속성과 함께 목록으로 출력되므로 읽기 어렵습니다:

m <- structure(list(amount = 9.5, currency = "EUR"), class = "money")
print(m)

출력:

$amount
[1] 9.5

$currency
[1] "EUR"

attr(,"class")
[1] "money"

메서드는 generic.class라는 이름의 함수입니다. print()가 money 클래스의 객체를 받으면 print.money()를 찾아 대신 호출합니다. print 메서드는 cat()으로 출력하고 invisible(x)로 끝나므로, 객체를 두 번째로 출력하지 않고 반환합니다:

print.money <- function(x, ...) {
  cat("<money ", x$amount, " ", x$currency, ">\n", sep = "")
  invisible(x)
}
m <- structure(list(amount = 9.5, currency = "EUR"), class = "money")
print(m)
m

출력:

<money 9.5 EUR>
<money 9.5 EUR>

format()은 값을 텍스트로 변환하는 제네릭입니다. format.money() 메서드는 텍스트를 출력하는 대신 반환하므로, 다른 코드에서 이를 문장에 넣을 수 있고 print 메서드에서 재사용할 수 있습니다:

format.money <- function(x, ...) {
  sprintf("%.2f %s", x$amount, x$currency)
}
print.money <- function(x, ...) {
  cat("Money:", format(x), "\n")
  invisible(x)
}
m <- structure(list(amount = 9.5, currency = "EUR"), class = "money")
m
cat("You owe", format(m), "\n")

출력:

Money: 9.50 EUR 
You owe 9.50 EUR 

메서드는 제네릭과 동일한 인수를 받습니다. print()와 format()은 function(x, ...)으로 선언되므로, 해당 메서드도 x, ...로 시작합니다. ...은 호출자가 전달할 수 있는 digits와 같은 추가 인수를 받습니다. 메서드는 제네릭이 호출되는 모든 곳에서 작동하며, 예를 들어 vapply() 내부에서도 작동합니다:

format.money <- function(x, ...) sprintf("%.2f %s", x$amount, x$currency)
wallet <- list(
  structure(list(amount = 3, currency = "EUR"), class = "money"),
  structure(list(amount = 0.5, currency = "USD"), class = "money")
)
print(vapply(wallet, format, character(1)))

출력:

[1] "3.00 EUR" "0.50 USD"
challenge icon

챌린지

쉬움

Money.R에 new_money()가 주어져 있습니다. 같은 파일에 두 메서드를 추가하세요:

  • format.money(x, ...)는 금액을 소수점 이하 두 자리로 표시하고 통화를 함께 반환합니다: 9.50 EUR.
  • print.money(x, ...)는 format()을 사용하여 <money 9.50 EUR>를 한 줄에 출력하고, invisible(x)를 반환합니다.

제공된 코드는 9.5 EUR 행을 읽고, 모든 money 객체를 출력한 다음, 형식이 지정된 모든 금액을 + 로 연결하여 list: 를 출력합니다.

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

직접 해보기

source("Money.R")

# 제공된 입력/출력 코드: 그대로 유지하세요
input <- suppressWarnings(readLines(file("stdin")))
all <- list()
for (line in input) {
  p <- strsplit(line, " ")[[1]]
  m <- new_money(as.numeric(p[1]), p[2])
  print(m)
  all[[length(all) + 1]] <- m
}
cat("list: ", paste(vapply(all, format, character(1)), collapse = " + "), "\n", sep = "")
quiz icon실력 점검

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

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

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