Menu
Coddy logo textTech

Show 메서드

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

S4 객체가 출력되면 R은 show() 함수를 호출합니다. 클래스에 대한 메서드가 없으면 모든 슬롯을 나열하는데, 이는 올바르지만 길게 표시됩니다:

setClass("Point", slots = c(x = "numeric", y = "numeric"))
p <- new("Point", x = 1, y = 2)
p

출력:

An object of class "Point"
Slot "x":
[1] 1

Slot "y":
[1] 2

setMethod("show", "Point", function(object) ...)은 클래스에 자체 출력 방식을 제공합니다. 이 메서드는 cat()을 사용해 출력하며, 최상위 수준에서 객체를 출력할 때와 print()에 의해 호출될 때 모두 사용됩니다:

setClass("Point", slots = c(x = "numeric", y = "numeric"))
setMethod("show", "Point", function(object) {
  cat("Point(", object@x, ", ", object@y, ")\n", sep = "")
})
p <- new("Point", x = 1, y = 2)
p
print(p)

출력:

Point(1, 2)
Point(1, 2)

슬롯은 또 다른 S4 객체를 담을 수 있습니다. 해당 클래스의 이름으로 형식을 선언하세요. 바깥쪽 show() 메서드는 내부 객체에 show()를 호출하여 출력할 수 있습니다:

setClass("Point", slots = c(x = "numeric", y = "numeric"))
setMethod("show", "Point", function(object) cat("(", object@x, ", ", object@y, ")", sep = ""))
setClass("Line", slots = c(from = "Point", to = "Point"))
setMethod("show", "Line", function(object) {
  cat("line ")
  show(object@from)
  cat(" -> ")
  show(object@to)
  cat("\n")
})
new("Line", from = new("Point", x = 0, y = 0), to = new("Point", x = 3, y = 4))

출력:

line (0, 0) -> (3, 4)

가상 클래스는 representation("VIRTUAL")로 선언되며 new()를 사용해 생성할 수 없습니다. 이 클래스는 S4 상속 장에서 다루는 다른 클래스의 공통 부모 역할을 하기 위해 존재합니다. isVirtualClass()는 이 두 종류를 구분해 알려 줍니다:

setClass("Shape", representation("VIRTUAL"))
setClass("Point", slots = c(x = "numeric"))
cat(isVirtualClass("Shape"), isVirtualClass("Point"), "\n")
msg <- tryCatch(new("Shape"), error = function(e) "cannot create a Shape")
cat(msg, "\n")

출력:

TRUE FALSE 
cannot create a Shape 
challenge icon

챌린지

쉬움

포인트와 세그먼트는 두 파일에 정의된 두 개의 S4 클래스입니다. 클래스는 선언되어 있습니다. 각 클래스에 show() 메서드를 추가하세요:

  • Point.R에서는 포인트가 Point(1, 2)로 출력된 다음 줄바꿈되도록 하세요.
  • Segment.R에서는 세그먼트가 Segment Point(1, 2) to Point(4, 6), length 5로 출력된 다음 줄바꿈되도록 하세요. 길이는 소수점 둘째 자리까지 반올림합니다. 포인트 텍스트는 직접 구성하거나 헬퍼를 사용하세요. 포인트 메서드는 자체적으로 줄바꿈을 출력하므로 세그먼트 줄의 중간에서 호출하지 마세요.

제공된 코드는 1,2 4,6 줄을 읽고, 먼저 첫 번째 포인트를 출력한 다음 세그먼트를 출력하며, 둘 다 해당 show() 메서드를 통해 출력합니다.

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

직접 해보기

source("Point.R")
source("Segment.R")

# 제공된 입출력 코드: 있는 그대로 유지하세요
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
  n <- as.numeric(strsplit(line, "[ ,]")[[1]])
  a <- new("Point", x = n[1], y = n[2])
  b <- new("Point", x = n[3], y = n[4])
  print(a)
  print(new("Segment", from = a, to = b))
}
quiz icon실력 점검

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

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

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