본문 바로가기
R

객체지향 프로그래밍

by be-favorite 2021. 1. 20.

❗️블로그 옮김:  https://www.taemobang.com

 

방태모

안녕하세요, 제 블로그에 오신 것을 환영합니다. 통계학을 전공으로 학부, 석사를 졸업했습니다. 현재는 가천대 길병원 G-ABC에서 Data Science를 하고있습니다. 통계학, 시계열, 통계적학습과 기계

www.taemobang.com

R은 객체지향(object-oriented) 프로그래밍 언어이다. R과 함께 data science에서 핫한 툴인 Python도 객체지향 프로그래밍 언어에 해당한다. 객체지향 프로그래밍은 프로그래밍 방법 중 하나를 일컫는 말로, 복잡한 문제를 잘게 나누어 객체(object)로 만들고, 객체를 조합하여 문제를 해결한다. 그래서, 객체지향 프로그래밍에는 클래스(class)와 메서드(method) 라는 개념이 존재한다. 하나의 클래스 내부에는 여러가지 함수가 존재하는데, 이들 각각각을 메서드라 칭한다. 클래스는 객체를 표현하기 위한 문법으로, 프로그래밍에서 객체를 만들 때 사용하는 것이 클래스에 해당한다. 예를 들어, 내가 MMORPG 게임을 만든다고하면 기사, 마법사 등의 직업을 직업별로 클래스를 만들어 표현할 수 있다. 그리고, "기사"라는 클래스를 표현하려면 기본적으로 캐릭터의 채력, 마나 등이 필요하고, 칼로 베기, 찌르기 등의 기사 직업이 갖는 스킬이 필요하다. 여기서 전자를 클래스의 속성(attribute)이라 부르고, 후자를 메서드라 부른다. 이러한 객체지향 프로그래밍의 장점은 복잡한 문제를 처리하는데 유용하고, 기능의 개선과 발전이 필요할 때 필요한 클래스에 대해서만 수정하면 되므로 유지보수에도 효율적이라는 점이다.

 

R의 기초부터 배운 사람이라면 한번 쯤은 R이 객체지향 언어라는 말을 들어봤을 것이다. 그런데, 우리는 R이 객체지향 프로그래밍으로 설계되었다는 점을 어느 부분에서 느낄 수 있을까? 사실, Python에서는 통계 분석보다는 개발에 좀 더 초점을 맞춘 범용성이 큰 언어로 클래스와 메서드에 대한 개념을 중요하게 다룬다. 그러나, 프로그래밍 지식이 없는 R 유저들은 객체지향 언어, 클래스, 메서드에 대한 개념이 없어도 딱히 어려움이 없으며, R 기초에서는 해당 개념을 다루지 않는 것도 이러한 이유에서 이다. 물론, 나도 R이 객체지향 언어라는 점만 인지한 채로, 클래스와 메서드에 대한 개념이 없이 R을 오랫동안 사용했었지만 딱히 어려움이 크진 않았다.

 

그러나, 이러한 개념을 알아두면 R에서 편한점이 하나 있다. R을 오랫동안 사용해 온 유저라면 한번쯤은 "어떻게 plot() 함수는 이렇게 똑똑하게 동작할까?" 라는 생각을 해본 적이 있을 것이다. plot() 함수에 일반적인 숫자형 벡터(numeric vector)를 넣으면 x축은 Index, y축은 해당 숫자형 벡터의 값으로 갖는 산점도를 출력해주지만, 시계열 객체를 넣으면 따로 아무런 명시가 없이도 시계열 객체임을 캐치하고 해당 시계열의 시도표를 그려준다. 이는 근본적으로 R이 객체지향 프로그래밍 언어이기 때문에 가능한 일이다. R의 plot() 함수는 들어오는 객체에 따라 자동으로 그에 알맞는 메서드를 호출한다. 예를 들어, 우리가 R의 유명한 시계열 예제 자료 Airpassenger를 plot()에 넣어주면:

 

plot(Airpassenger)

 

실제로는 다음의 함수를 출력한 것과 같다:

 

plot.ts(Airpassenger)

 

즉, 메서드를 명시해야하는 Python과는 달리 R은 메서드를 명시하지 않아도 알아서 객체를 캐치하고 그에 맞는 함수를 호출한다. 이러한 이유에서 클래스, 메서드와 같은 개념을 모른채로 R을 사용해도 분석에 실제적으로 큰 어려움을 겪진 않는다. 앞선 예제에서 설명한 plot()과 같은 함수를 R에서는 generic 함수라고 하며, generic 함수는 input에 따라 결과값을 적절하게 반환해준다. R이 객체지향 프로그래밍 언어임을 알 수 있는 부분이다.

 

아울러, 앞서 이러한 개념을 알아두면 편한 점이 하나 있다고 했는데, 그것은 R의 강력한 help() 기능을 이용할 수 있기 때문이다. 예를 들어, 시계열 객체의 시도표 그림을 좀 더 세부적으로 조정하고 싶을 때, ?plot 또는 help(plot)을 수행하면 산점도를 그리는 가장 일반적인 {base} 패키지의 plot()에 대한 설명만 출력이 된다. 정확하게는 ?plot.default, help(plot.default)가 호출된 것이다. 객체지향 프로그래밍, 클래스나 메서드에 개념이 없는 R 유저들은 간혹 이런 경험이 있을 것이다. 이러한 경우엔 ?plot.ts나 help(plot.ts)를 수행하면 시계열 객체가 input일때 조정할 수 있는 다양한 인수들과 설명을 확인할 수 있다.

댓글