Menu
Coddy logo textTech

유효성 검사

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

형식은 R이 확인합니다. 값에 관한 규칙은 여러분이 정합니다. setClass()의 validity 인수는 object의 함수이며, 객체가 올바르면 TRUE를 반환하고 그렇지 않으면 문제를 설명하는 문자형 문자열을 반환합니다. new()는 모든 객체에 대해 이 함수를 실행합니다:

setClass("Account", slots = c(owner = "character", balance = "numeric"),
  validity = function(object) {
    if (object@balance < 0) return("balance must not be negative")
    TRUE
  })
ok <- new("Account", owner = "Ada", balance = 10)
msg <- tryCatch(new("Account", owner = "Bo", balance = -5), error = function(e) conditionMessage(e))
cat(msg)

출력:

invalid class “Account” object: balance must not be negative

유효성 검사 함수는 문자 벡터를 반환하여 여러 문제를 한 번에 보고할 수 있습니다. R은 오류 메시지에서 문제에 번호를 매깁니다:

setClass("Range", slots = c(lo = "numeric", hi = "numeric"),
  validity = function(object) {
    problems <- character(0)
    if (length(object@lo) != 1) problems <- c(problems, "lo must be one number")
    if (length(object@hi) != 1) problems <- c(problems, "hi must be one number")
    if (length(problems) == 0) TRUE else problems
  })
msg <- tryCatch(new("Range", lo = c(1, 2), hi = numeric(0)), error = function(e) conditionMessage(e))
cat(msg)

출력:

invalid class “Range” object: 1: lo must be one number
invalid class “Range” object: 2: hi must be one number

@<-는 타입을 확인하지만 유효성 검사 함수를 실행하지 않으므로, 대입으로 규칙을 위반할 수 있습니다. validObject()는 검사를 다시 실행하므로 슬롯을 변경한 후 호출하세요:

setClass("Account", slots = c(balance = "numeric"),
  validity = function(object) if (object@balance < 0) "balance must not be negative" else TRUE)
a <- new("Account", balance = 10)
a@balance <- -99
cat("still created:", a@balance, "\n")
msg <- tryCatch(validObject(a), error = function(e) conditionMessage(e))
cat(msg, "\n")

출력:

still created: -99 
invalid class “Account” object: balance must not be negative 

R은 텍스트 앞에 invalid class “Account” object:를 표시합니다. 사용자에게 메시지를 보여 주는 코드는 object: 뒤의 부분만 유지할 수 있습니다:

setClass("Account", slots = c(balance = "numeric"),
  validity = function(object) if (object@balance < 0) "balance must not be negative" else TRUE)
msg <- tryCatch(new("Account", balance = -1), error = function(e) conditionMessage(e))
cat(sub(".*object: ", "", msg))

출력:

balance must not be negative
challenge icon

챌린지

쉬움

Rating 클래스를 Rating.R에 선언하고, stars(numeric) 및 comment(character) 슬롯과 처음으로 위반된 규칙을 반환하는 유효성 검사 함수를 정의하세요:

  • 별점이 1, 2, 3, 4, 5 중 하나가 아닌 경우 stars must be a whole number from 1 to 5;
  • 댓글이 20자를 초과하는 경우 comment is too long.

그 외에는 TRUE를 반환합니다. 제공된 코드는 4;Great 줄(댓글은 생략될 수 있음)을 읽고, 각 평점을 생성한 다음 ok: 4/5 또는 문제 텍스트를 출력합니다.

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

직접 해보기

source("Rating.R")

# 제공된 입력/출력 코드: 그대로 유지하세요
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
  p <- strsplit(line, ";")[[1]]
  out <- tryCatch({
    r <- new("Rating", stars = as.numeric(p[1]), comment = if (length(p) > 1) p[2] else "")
    paste0("ok: ", r@stars, "/5")
  }, error = function(e) sub(".*object: ", "", conditionMessage(e)))
  cat(out, "\n", sep = "")
}
quiz icon실력 점검

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

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

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