17.2 S4 클래스

이 절에서는 R의 S4 클래스에 대한 모든 것을 학습합니다. 클래스를 정의하고, 생성하고, 슬롯에 액세스하고, 프로그램에서 효율적으로 사용하는 방법 등에 대하여 살펴 보겠습니다.

S3클래스와 개체가 형식적 정의가 없는 것과 달리, 개체를 공식적으로 정의해야 하고 개체를 만드는데 독특한 방법을 가지고 있다는 점에서 더 엄격한 S4 클래스를 살펴 보겠습니다.

이것은 우리 코드를 안전하게 만들어 주어, 우연하게도 저지를 수 있는 순진한 실수를 막아 줍니다.

17.2.1 S4 클래스를 정의하는 방법

S4 클래스는 setClass() 함수를 사용하여 정의합니다.

R 용어에서 멤버 변수슬롯(slot)이라고합니다. 클래스를 정의하는 동안 클래스의 이름과 (슬롯의 클래스와 함께) 클래스에 포함될 멤버인 슬롯을 설정해야 합니다.

S4 클래스 정의의 예

setClass(Class = "student", 
         slots = list(name="character", age="numeric", GPA="numeric"))

getClass("student")
## Class "student" [in ".GlobalEnv"]
## 
## Slots:
##                                     
## Name:       name       age       GPA
## Class: character   numeric   numeric
# initialize method during object instantiation
setMethod(f = "initialize", signature = "student",
          definition = function( .Object, Aname, Aage, AGPA)
          {
            .Object@name    <- Aname
            .Object@age <- Aage
            .Object@GPA   <- AGPA
            return( .Object )
          } 
          )

17.2.2 S4 객체를 생성하는 방법

S4 객체는 new() 함수로 생성할 수 있습니다.

S4 객체 생성 예

# new() 함수를 이용한 개체 생성
# 클래스 이름과 슬롯의 값을 제공
# create new instance of the class 'Person' using new()
mystu <- new(Class = "student", Aname = "John",
             Aage = 21, AGPA = 3.5)

mystu
## An object of class "student"
## Slot "name":
## [1] "John"
## 
## Slot "age":
## [1] 21
## 
## Slot "GPA":
## [1] 3.5

isS4() 함수를 이용해 개체가 S4 개체인지 확인할 수 있습니다.

isS4(mystu)
## [1] TRUE

17.2.3 슬롯에 액세스하고 수정하는 방법

$를 사용하여 리스트의 구성 요소에 액세스하는 것처럼 개체의 슬롯은 @를 사용하여 액세스합니다.

17.2.3.1 슬롯 접근

mystu@name
## [1] "John"
mystu@GPA
## [1] 3.5
mystu@age
## [1] 21

17.2.3.2 슬롯 직접 수정

재할당을 통해 슬롯을 수정할 수 있습니다.

# GPA 수정
mystu@GPA <- 3.7
mystu
## An object of class "student"
## Slot "name":
## [1] "John"
## 
## Slot "age":
## [1] 21
## 
## Slot "GPA":
## [1] 3.7

17.2.3.3 slot() 함수를 사용한 슬롯 수정

마찬가지로 slot() 함수를 사용하여 슬롯에 액세스하거나 수정할 수 있습니다.

slot(mystu,"name")
## [1] "John"
slot(mystu,"name") <- "Paul"
slot(mystu,"name")
## [1] "Paul"

17.2.4 메소드와 일반 함수

S3 클래스의 경우와 마찬가지로 S4 클래스의 메소드도 클래스 자체가 아닌 일반 함수에 속합니다. S4 의 일반 함수 작업은 S3의 일반 함수와 매우 유사합니다.

showMethods() 함수를 사용하여 사용 가능한 모든 S4 일반 함수와 메소드를 나열할 수 있습니다.

모든 일반 함수 목록

showMethods()               # 목록이 너무 많아서 출력은 생략합니다.

대화형 모드에서 개체 이름을 쓰면 그 내용이 출력됩니다. 이는 S4 일반 함수 show() 함수를 사용하여 수행됩니다.

위 목록에서 이 기능을 볼 수 있습니다. 이 함수는 S3 클래스의 print() 함수에 대응대는 S4 함수 입니다.

함수가 일반 함수인지 테스트하기

isS4(print)
## [1] FALSE
isS4(show)
## [1] TRUE

showMethods(show)를 사용하여 show 일반 함수의 모든 메소드를 확인할 수 있습니다.

예 6 : 일반 함수의 모든 메소드 나열

showMethods(show)               # 목록이 너무 많아서 출력은 생략합니다.

17.2.5 메소드 작성 방법

setMethod() 도우미 함수를 사용하여 자체 메소드를 작성할 수 있습니다.

예를 들어 다음과 같이 show() 일반 함수의 메소드를 구현할 수 있습니다.

setMethod("show", "student", function(object) {
                   cat(object@name, "\n")
                   cat(object@age, "years old\n")
                   cat("GPA:", object@GPA, "\n")
                 }
         )

이제 이전과 같이 대화형 모드에서 개체의 이름을 쓰면 위의 코드가 실행됩니다.

s4.s <- new("student", Aname="John", Aage=21, AGPA=3.5)
s4.s       # 이는 show(s)와 같습니다.
## John 
## 21 years old
## GPA: 3.5

이런 식으로 일반 함수에 대한 자체 S4 클래스 메소드를 작성할 수 있습니다.

참고 자료 : https://www.datamentor.io/r-programming/s4-class/