R 클래스와 오브젝트
대부분의 R 사용자들은 R이 클래스와 오브젝트로 이루어져 있는지도 모른다. 그런데, R은 객체 지향의 프로그램 언어이다. 객체 지양 프로그램이기 때문에, R Package를 사용하기 편리 한것이다.
클래스의 개념 R 은 오브젝트 지향의 프로그래밍 언어이다. 코드는 오브젝트를 생성해서 이용하지만 어떤 오브젝트에는 클래스가 정의 되어 있다. 오브젝트는 클래스를 실체화한 변수이다.
오브젝트와 클래스 관계는 이해하기 어려운 개념이지만 자주 예로 거론되는 '붕어빵'으로 예시를 들어 보자
붕어빵을 만들려면 빵틀이 사용 된다. 빵틀에 반죽을 부어 만들기 때문에 얼핏 보면 모두 똑같은 모양으로 보이지만 엄밀히 말하면 비슷할 뿐이지 익은 정도나 탄력 등 은 붕어 빵마다 다르다. 또 붕어 빵에는 단팥이 들어가야 한다. 단 단팥이 들어 가 있으면 되고, 이것이 단팥인지 아니면, 크림인지 양은 전부 다르다.
즉 '붕어빵 이라는 것은 빵틀에 부어 만드는 것'과 '반드시 단팥이 들어가 있을 것'이 2개의 지정으로 '클래스'를 설계한 것이 된다. 그리고 이 금형에 반죽을 부어 실제로 단팥을 넣어 만들어진 붕어빵이 '오브젝트'에 해당한다.
S3 클래스 오브젝트 지향 프로그래밍에서는 오브젝트 구조는 클래스 마다 다르다. 그래서 오브젝트를 처리하는 전용 함수가 준비 되어 있는 것이 보통이다. 이것을 메소드라고 한다. R은 클래스 마다 다른 메소드를 호출하는데 매우 간단한 방법이 사용된다. 예를 들면 'print' 함수는 사실 각 클래스마다 특별한 'print' 메소드를 구비하고 있다.
'methods(print)'를 실행 하면 클래스마다 준비된 'print' 메소드 목록을 확인 할 수 있다.
methods(print)
## [1] print.acf*
## [2] print.AES*
## [3] print.anova*
## [4] print.aov*
## [5] print.aovlist*
---- 이하 생략 --
출력 결과는 모드 'print'. 로 시작된다. 그리고 'print.'뒤어 오는 문자열 클래스 이름을 나타낸다.
'print.acf*'는 'acf'클래스 독자의 'print' 메소드임을 나타내고 있다. 또 '*'는 이 함수 내용이 은폐되어 있을음 나타내고 있다. 반면 '*'가 없는 함수의 경우 메소드 이름을 입력하면 코드가 콘솔에 표시된다.
반대로 말하면 메소드 이름 뒤에 점을 넣어 적절한 클래스 이름을 이용한 함수를 정의 하면 그 클래스 전용 메소드로 된다. 이 구조를 'S3 클래스' 라고 부른다. S3 클래스 오브젝트는 'class' 함수를 사용해서 요브젝트와 클래스 이름을 관련짓는 것만으로 작성 할수 있다.
아래 간단한 예를 들었다. 먼저 보통의 문자열 오브젝트에 'print' 함수를 적용하면 그 문자가 콘솔에 표시된다.
다음으로 이 오브젝트에 'str'클래스 이름을 설정한다(문자열을 의미하는 string의 생략형) 그리고 'str' 클래스 오브젝트를 표시하는 'print' 메소드를 정의한다. 이 메소드는 문자를 그대로 표시 할 뿐 아니라 그 문자 코드를 표시한다. R에서 문자 코드를 표시하려면 'charToRaw' 함수를 사용한다.
# 보통 문자 오브젝트
x <- "A"
print(x)
## [1] "A"
# 독자 메소드 정의
print.str <- function(x){
charToRaw(x)
}
# 오브젝트 클래스를 설정
class(x)<- "str"
print(x)
## [1] 41
methods(print)
## [1] print.acf*
## [2] print.AES*
## [3] print.anova*
## [4] print.aov*
## [5] print.aovlist*
---- 이하 생략 --
# 보통 문자 오브젝트
x <- "A"
print(x)
## [1] "A"
# 독자 메소드 정의
print.str <- function(x){
charToRaw(x)
}
# 오브젝트 클래스를 설정
class(x)<- "str"
print(x)
## [1] 41
댓글 없음:
댓글 쓰기