다음은 Hadley Wickham (RStudio의 수석 과학자)의 "Advanced R, 2nd edition" (CRC Press, 2019)에 따른 수많은 R 객체 시스템 의 업데이트 된 빠른 요약입니다. 여기 에는 Object 에 대한 장을 기반으로 한 웹 표현이 있습니다 . -지향적 프로그래밍 .
2015 년 초판은 여기에 웹 표현이 있고 여기 에 OO에 대한 해당 장이 있습니다 .
OO 시스템에 대한 접근
Hadley는 OO 프로그래밍에 대한 두 가지 다른 접근 방식을 구별하기 위해 다음을 정의합니다.
기능적 OOP : 메소드 (호출 가능한 코드 조각)는 일반 함수 에 속합니다 (Java / C # 일반 메소드 와 혼동하지 마십시오 ). 메소드를 전역 조회 테이블에있는 것으로 생각하십시오. 실행할 메서드는 함수 이름과 해당 함수에 전달 된 하나 이상의 인수 유형 (또는 객체 클래스)을 기반으로 런타임 시스템에서 찾습니다 (이를 "메서드 디스패치"라고 함). 구문 측면에서 메서드 호출은 일반 함수 호출처럼 보일 수 있습니다 myfunc(object, arg1, arg2)
.. 이 호출은 런타임이 쌍 ( "myfunc", typeof (object)) 또는 가능하면 ( "myfunc", typeof (object), typeof (arg1), typeof (arg2)) 와 연관된 메소드를 찾도록 유도합니다.언어가 지원한다면. R의 S3에서 일반 함수의 전체 이름은 (함수 이름, 클래스)쌍. 예 : mean.Date
날짜의 평균을 계산하는 방법입니다. methods("mean")
함수 이름으로 일반 메소드를 나열 해보십시오 mean
. 기능적 OOP 접근법은 예를 들어 OO의 개척자 Smalltalk , Common Lisp Object System 및 Julia에서 찾을 수 있습니다. Hadley는 "R과 비교할 때 Julia의 구현은 완전히 개발되었으며 매우 성능이 뛰어납니다."라고 말합니다.
캡슐화 된 OOP : 메서드는 개체 또는 클래스에 속하며 메서드 호출은 일반적으로 object.method(arg1, arg2)
. 객체가 데이터 (필드)와 동작 (메소드)을 모두 캡슐화 하기 때문에 이를 캡슐화 라고합니다 . 메서드를 객체 또는 객체의 클래스 설명에 첨부 된 조회 테이블에있는 것으로 생각하십시오. 런타임은 메서드 이름과 하나 이상의 인수 유형을 기반으로 메서드를 찾습니다. 이것은 C ++, Java, C #과 같은 "인기있는"OO 언어에서 발견되는 접근 방식입니다.
두 경우 모두 상속이 지원되는 경우 (아마도 가능) 런타임은 호출 조회 키와 일치하는 항목을 찾을 때까지 클래스 계층 구조를 위쪽으로 탐색 할 수 있습니다.
R 객체가 속한 시스템을 찾는 방법
library(sloop) # formerly, "pryr"
otype(mtcars)
#> [1] "S3"
R 개체 시스템
S3
- 기능적 OOP 접근 방식.
- Hadley에 따르면 가장 중요한 시스템입니다.
- 가장 간단하고 일반적입니다. R이 사용한 최초의 OO 시스템.
- base R 전체에 사용되는 base R이 함께 제공됩니다.
- 강제 보장이 아닌 규칙에 의존합니다.
- Chambers, John M 및 Trevor J Hastie를 참조하십시오 . 1992. "S의 통계 모델" Wadsworth & Brooks / Cole 고급 도서 및 소프트웨어.
- "Advanced R, 2nd edition"에 대한 자세한 내용은 여기 .
S4
- 기능적 OOP 접근 방식.
- Hadley에 따르면 세 번째로 중요한 시스템입니다.
- 따라서 S3를 다시 작성하면 S3와 비슷하지만 더 형식적이고 더 엄격합니다. 프로그램 설계에 대해 신중하게 생각해야합니다. 대규모 시스템 구축에 적합합니다 (예 : Bioconductor 프로젝트).
- 기본 "방법"패키지에서 구현됩니다.
- 참조 : Chambers, John M. 1998. "Programming with Data : A Guide to the S Language." 봄 병아리.
- "Advanced R, 2nd edition"에 대한 자세한 내용은 여기 .
RC 일명 "참조 클래스"
- 캡슐화 된 OOP 접근 방식.
- 베이스 R과 함께 제공됩니다.
- S4 기반.
- RC 객체는 "변경 가능"한 특수한 유형의 S4 객체입니다. 즉, R의 일반적인 copy-on-modify 의미 체계를 사용하는 대신 제자리에서 수정할 수 있습니다. 변경 가능한 상태는 추론하기 어렵고 보기 흉한 버그의 원인이지만 특정 애플리케이션에서 더 효율적인 코드로 이어질 수 있습니다.
R6
- 캡슐화 된 OOP 접근 방식.
- Hadley에 따르면 두 번째로 중요한 시스템입니다.
- R6 패키지 에서 찾을 수 있습니다 (로 설치
library(R6)
).
- RC와 유사하지만 더 가볍고 더 빠릅니다. S4 또는 메소드 패키지 에 의존하지 않습니다 . R 환경 위에 구축되었습니다. 또한 :
- 공개 및 비공개 방법
- 활성 바인딩 (액세스 할 때 실제로 메서드를 호출하는 필드)
- 패키지간에 작동하는 클래스 상속
- 모두 클래스 메소드 (클래스에 속하는 통해 인스턴스를 액세스 할 수있는 코드
self
, private
, super
)와 멤버 함수 (필드에 할당 된 기능, 그러나 방법되지 않은 단 기능)
- R의 "수정시 복사"의미 체계를 벗어나는 표준화 된 방법을 제공합니다.
- 패키지 사이트 : "R6 : R을위한 캡슐화 된 객체 지향 프로그래밍"을 참조하십시오 .
- "Advanced R, 2nd edition"에 대한 자세한 내용은 여기 .
기타
같은 사람이 있습니다 R.oo (RC 유사), 킬로그램 (프로토 타입 기반, 자바 스크립트를 생각한다) 및 Mutatr는 . 그러나 "Advanced R"은 다음과 같이 말합니다.
널리 사용되는 R6 외에도 이러한 시스템은 주로 이론적 관심사입니다. 그들은 강점을 가지고 있지만 R 사용자는 거의 알고 이해하지 않으므로 다른 사람들이 코드를 읽고 기여하기가 어렵습니다.
"Advanced R, 2nd edition"의 트레이드 오프 에 대한 장도 읽어보십시오 .