작성자: admin 작성일시: 2016-09-20 22:37:32 조회수: 223 다운로드: 36
카테고리: R 태그목록:

R 객체지향 프로그래밍 기초 1

객체

프로그램이 어떤 작업을 수행하기 위해서는 (1)데이터와 (2)데이터를 조작하는 행위, 두 가지 요소가 필요하다. 일반적으로 데이터는 변수(variable)에 넣어서 사용하고 데이터를 조작하는 일은 함수(function)로 구성해서 쉽게 실행시킬 수 있도록 만들어 놓는다.

객체(object)는 서로 연관된 데이터와 그 데이터를 조작하기 위한 함수를 하나의 집합에 모아놓은 것을 말한다.

집합의 원소가 되는 변수나 함수는 멤버(member) 또는 속성(attribute)이라고 한다. 특히 객체에 합쳐진 함수는 함수가 아니라 메서드(method)라고 부른다.

예: 사각형의 면적 구하기

예를 들어 사각형의 면적을 구하는 프로그램을 만든다고 하자. 필요한 변수와 함수는 다음과 같다.

  1. 가로 길이와 세로 길이라는 두 개의 데이터를 넣을 변수
  2. 두 길이를 곱해서 면적을 구하는 함수

객체지향을 사용하지 않고 R로 구현하면 다음과 같아진다.

In [2]:
h <- 10
v <- 20

area <- function(h, v) {
    return(h * v)
}

a = area(h, v)
cat(a)
200

위 프로그램에서 사각형의 가로 길이를 나타내는 변수 h, 사각형의 세로 길이를 나타내는 변수 v, 그리고 이 사각형의 면적을 계산하는 함수 area()는 제각기 떨어져 있다. 하지만 객체 지향 프로그래밍에서는 이 세가지를 하나의 객체(object)로 묶을 수 있다.

다음은 이 프로그램을 객체 지향 방식으로 다시 구현한 것이다.

In [41]:
Rectangle <- function(h, v) {
    obj <- list(h=h, v=v)
    class(obj) <- "Rectangle"
    return(obj)
}

area <- function(obj) {
    UseMethod("area", obj)
}

area.Rectangle <- function(obj) {
    return(obj$h * obj$v)
}

이 부분은 클래스(class) 구현이라고 한다. 실제로 길이 변수들을 저장하고 면적을 계산하는 코드는 다음과 같다.

In [42]:
r <- Rectangle(10, 20)    
a <- area(r)
cat(a)
200

위 프로그램에서 r이 바로 객체이다. 어떻게 위와 같은 코드를 만드는지에 대해서는 곧 자세히 설명할 것이다.

객체 r은 사각형의 가로 길이와 세로 길이를 나타내는 변수 hv가 합쳐져서 만들어진 것이다. 객체 r에 포함된 이 속성들을 꺼내려면 객체 이름 뒤에 점(.)을 붙인 다음 변수 이름을 치면 된다. 다음과 같이 입력해 보면 알 수 있다.

In [43]:
r$h
10
In [44]:
r$v
20

다음 명령으로 함수 arear과 연결되어 있음을 알 수 있다.

In [45]:
methods(class=class(r))
[1] area
see '?methods' for accessing help and source code

클래스

객체 지향 프로그래밍에서 객체를 만들려면 객체를 바로 만들지 못하고 항상 클래스(class)라는 것을 만든 후에 그 클래스를 이용하여 객체를 만들어야 한다.

위 예제에서 Rectangle은 클래스이고 rRectangle 클래스로 만들어진 객체이다. 객체와 클래스의 관계는 "붕어빵"과 "붕어빵을 굽는 틀"에 비유할 수 있다. 즉, 정해진 속성, 여기에서는 가로 길이 h와 세로 길이 v라는 속성을 가지도록 사각형 클래스를 한 번 만들어 놓으면 이 속성을 가지는 실제 사각형은 얼마든지 많이 만들 수 있다.

예를 들어 위에서 만들어 놓은 Rectangle 클래스로 다음과 같이 5개의 사각형을 만들 수도 있다.

In [46]:
a <- Rectangle(1, 1)   # 가로 1, 세로 1인 사각형
b <- Rectangle(2, 1)   # 가로 2, 세로 1인 사각형
c <- Rectangle(4, 2)   # 가로 4, 세로 2인 사각형
d <- Rectangle(6, 3)   # 가로 6, 세로 3인 사각형
e <- Rectangle(8, 5)   # 가로 8, 세로 5인 사각형

이 사각형들의 면적은 다음과 같이 계산한다.

In [51]:
cat(area(a), "\n")
cat(area(b), "\n")
cat(area(c), "\n")
cat(area(d), "\n")
cat(area(e), "\n")
1 
2 
8 
18 
40 

생성자

R에서 클래스를 정의하는 문법은 다음과 같다.

클래스이름 <- function(속성값1, 속성값2, 속성값3) {
    obj <- list(속성이름1=속성값1, 속성이름2=속성값2, 속성이름3=속성값3)
    class(obj) <- "클래스이름"
    return(obj)
}

이 때 속성값 인수는 필요하지 않다면 없어도 된다.

위 코드는 사실 클래스이름이란 이름을 가진 함수를 정의하고 있는데 이 함수를 생성자(constructor)라고 하며 클래스 정의에서 가장 중요한 함수이다.

객체를 생성할 때는 바로 이 생성자 함수를 호출해야 한다. 생성자 함수 내부에서는 생성자를 호출할 때 넣은 입력 변수, 즉 인자의 값을 속성값으로 저장한다.

연습 문제 1

삼각형의 넓이를 계산하기 위한 클래스를 만든다. 이 클래스는 다음과 같은 속성을 가진다.

  • 밑변의 길이 b 와 높이 h
  • 삼각형의 넓이를 계산하는 메서드 area

연습 문제 2

사각 기둥의 부피를 계산하기 위한 클래스를 만든다. 이 클래스는 다음과 같은 속성을 가진다.

  • 밑면의 가로 길이 a, 밑면의 세로 길이 b, 높이 h
  • 부피를 계산하는 메서드 volume
  • 겉넓이를 계산하는 메서드 surface

질문/덧글

아직 질문이나 덧글이 없습니다. 첫번째 글을 남겨주세요!