4.10 개체와 클래스

참고 : https://www.datamentor.io/r-programming/object-class-introduction/

R은 S3, S4, 그리고 참조(reference) 클래스 등의 3개의 클래스를 가지고 있습니다.

4.10.1 개체와 클래스

R에서도 개체 지향 프로그래밍(object oriented programming)을 할 수 있습니다. 사실 R의 모든 것은 개체(object, ‘객체’)입니다.

개체는 속성에 작용하는 몇 가지 속성메소드를 가진 데이터 구조입니다.

클래스(class)개체의 청사진입니다. 우리는 클래스를 집을 짓기 전의 스케치(프로토타입)처럼 생각할 수 있습니다. 여기에는 바닥, 문, 창문 등에 대한 모든 세부 정보가 포함되어 있습니다. 이러한 설명을 바탕으로 우리는 집을 짓습니다.

집이 개체입니다. 설명으로 많은 집을 만들 수 있으므로, 클래스를 이용해서 많은 개체를 만들 수 있습니다. 개체클래스의 인스턴스(“예”)라고도 하며, 이 개체를 만드는 프로세스를 인스턴스화(instantiation)라고합니다.

대부분의 프로그래밍 언어에는 단일 클래스 시스템이 있지만 R에는 세 개의 클래스 시스템이 있습니다. 즉, S3, S4 및 최근의 참조(reference) 클래스 시스템입니다.

이 클래스들은 각각의 고유 특징을 가지고 있으며, 어떤 클래스를 사용할 지 여부는 선호도에 달려 있습니다.

4.10.1.1 S3 클래스

S3 클래스는 본질적으로 다소 원시적입니다. 공식적인 정의가 없으며 클래스 속성(attribute)을 추가하는 것만으로 이 클래스의 개체를 만들 수 있습니다.

이러한 단순함은 R 프로그래밍 언어에서 이 클래스가 널리 사용된다는 사실을 설명합니다. 실제로 대부분의 R 내장 클래스는 S3 유형입니다.

다음은 list를 이용한 S3 클래스 생성을 보여주고 있습니다.

# create a list with required components
s <- list(name = "John", age = 21, GPA = 3.5)
class(s)                              # 변수 s의 클래스를 확인합니다. : "list"로 반환합니다.
## [1] "list"
# name the class appropriately
class(s) <- "student"                 # 변수 s를 새로운 클래스 student로 지정합니다.
class(s)                              # "student"로 반환합니다.
## [1] "student"

자세한 내용은 R 프로그래밍 S3 클래스 섹션을 참조하십시오.

4.10.1.2 S4 클래스

S4 클래스는 S3 클래스를 개선한 것입니다. 그들은 같은 클래스의 개체를 다소 비슷하게 보이게 하는 데 도움이 되는 공식적으로 정의된 구조를 가지고 있습니다.

클래스 컴포넌트setClass() 함수를 사용하여 올바르게 정의되고, 개체new() 함수를 사용하여 생성합니다.

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

4.10.1.3 참조 클래스

참조(reference) 클래스는 다른 두 클래스에 비해 나중에 도입되었습니다. 다른 주요 프로그래밍 언어에서 보았던 개체 지향 프로그래밍과 더 유사합니다.

참조 클래스는 기본적으로 환경(environment)이 추가된 S4 클래스입니다.

setRefClass("student")

4.10.1.4 클래스간 비교

S3 클래스 S4 클래스 참조 클래스
공식적 정의가 없음 setClass() 함수를 이용하여 클래스 정의 setRefClass() 함수를 이용하여 클래스 정의
클래스의 속성을 설정해서 개체 생성 개체는 new() 함수를 사용해서 생성함 개체는 생성 함수를 이용하여 생성됨
속성은 $로 접근함 속성은 @로 접근함 속성은 $로 접근함
메소드는 일반 함수에 속함 메소드는 일반 함수에 속함 메소드는 클래스에 속함
‘copy-on-modify’ 시멘틱을 따름 ‘copy-on-modify’ 시멘틱을 따름 ‘copy-on-modify’ 시멘틱을 따르지 않음

자세한 사항은 제4부의 제5장을 참고하기 바랍니다.

4.10.2 클래스의 속성

모든 개체는 속성(attribute)를 가질 수 있습니다. 그런데 이러한 속성은 attr() 함수를 통해 속성을 지정하거나 조회할 수 있습니다. 이러한 개체의 속성이 중요한 이유는 속성을 통해 데이터 구조를 설정할 수도 있고, 함수의 기능 구현에 있어서 속성을 지정하여 제어할 수 있으며, 또 R 에서 개체를 구현할 수 있는 방법 중의 하나이기도 하기 때문입니다. 이러한 속성을 통해 새로운 해결 전략을 만들 수도 있고, 문제를 해결하는 시간을 단축할 수도 있습니다.3

4.10.2.1 개체 속성 정의

개체의 속성은 attr()함수를 이용해 생성할 수 있습니다.

y1 <- c("ID", "Name", "Grade", "Gender")              # y1는 문자형 벡터입니다.
y1                                                    # 벡터형으로 출력됩니다.
## [1] "ID"     "Name"   "Grade"  "Gender"
attr(y1, "new_class") <- "This is the list of class"  # y1의 속성지정합니다. (속성명과 속성값)
y1                                                    # y1에 데이터와 함께 속성 정보가 출력됩니다. 
## [1] "ID"     "Name"   "Grade"  "Gender"
## attr(,"new_class")
## [1] "This is the list of class"
attr(y1, "new_class")                                 # y1의 속성 값을 조회합니다.
## [1] "This is the list of class"

한편 속성이 추가된 새로운 개체를 반환해 주는 structure() 함수가 있습니다. structure() 함수는 추가적인 속성이 설정된 주어진 객체를 반환합니다.

structure() 함수의 형식은 다음과 같습니다.

structure(.Data, ...)

  • .Data : 다양한 속성이 첨부된 객체입니다.
  • : 데이터에 첨부 될 “tag = value” 형식으로 지정된 속성입니다.

structure() 함수의 사용 예를 들어 보겠습니다.

y2 <- structure(c("ID", "Name", "Grade", "Gender"), new_class = "A Class")
y2
## [1] "ID"     "Name"   "Grade"  "Gender"
## attr(,"new_class")
## [1] "A Class"

4.10.2.2 속성의 조회

개체의 속성을 조회하기 위해서는 attributes() 함수를 이용합니다. 그 결과는 리스트 형태로 반환됩니다.

attr(y1, "new_class")               # y1 개체의 new_class 속성의 값을 반환합니다. (벡터 형)
## [1] "This is the list of class"
attributes(y1)                      # y1 개체의 속성 이름과 값을 반환합니다. (리스트 형)
## $new_class
## [1] "This is the list of class"
attr(y2, "new_class")               # y2 개체의 new_class 속성의 값을 반환합니다. (벡터 형)
## [1] "A Class"
attributes(y2)                      # y2 개체의 속성 이름과 값을 반환합니다. (리스트 형)
## $new_class
## [1] "A Class"

4.10.2.3 세 가지 중요한 속성

아래의 속성들은 R의 기본 함수에서 그 사용법이 약속되어 있습니다.

  • Names : 각 요소에 지정될 수 있는 문자형 벡터입니다.
  • Dimensions : 행렬과 배열에서 쓰입니다.
  • Class : S3 개체 시스템서 쓰입니다.

데이터를 변형해도 이 속성들은 사라지지 않습니다. 그리고 다양한 함수에서 이 속성들을 통해 기능을 구현하고 있습니다.

4.10.3 names 속성 만들기

names 속성을 만드는 방법은 1) names() 함수를 이용하는 방법과 2) 변수를 생성할 때 지정하는 방법이 있습니다.

  • names() 함수는 개체의 이름을 만들거나 조회하는 함수입니다.

4.10.3.1 names() 함수를 이용하는 방법

v <- c(1, 2, 3)                  # v 백터 개체가 있습니다.
v                                # 지정된 속성이 없습니다.
## [1] 1 2 3
names(v) <- c(LETTERS[1:3])      # 이 개체의 names 속성을 ("A", "B", "C")로 생성합니다.
v                                # v 개체에 names 속성이 포함되어 있습ㄴ디ㅏ.
## A B C 
## 1 2 3
names(v)                         # v 벡터 개체의 이름 속성이 반환됩니다.
## [1] "A" "B" "C"

4.10.3.2 변수를 생성할 때 names 속성 지정

y <- c("A" = 1, "B" = 2, "C" = 3) # 정수형 벡터를 생성할 때 각 요소의 이름을 지정합니다.
names(y)                          # y 벡터 개체의 이름을 반환합니다.
## [1] "A" "B" "C"

4.10.3.3 names 속성의 조회

개체의 속성은 attr() 함수 또는 attributes() 함수를 통해서도 확인 가능합니다.

attr(v, "names")                 # v 개체의 names 의 속성 값을 벡터 형으로 반환합니다.
## [1] "A" "B" "C"
attributes(v)                    # v 개체의 속성을 리스트 형으로 반환합니다.
## $names
## [1] "A" "B" "C"
attr(y, "names")                 # y 개체의 names 의 속성 값을 벡터 형으로 반환합니다.
## [1] "A" "B" "C"
attributes(y)                    # y 개체의 속성을 리스트 형으로 반환합니다.
## $names
## [1] "A" "B" "C"

  1. 이하의 내용은 https://3months.tistory.com/393를 참고하여 정리하였습니다↩︎