MATLAB이 2008a 이후부터 클래스 지원을 필두로 객체를 지원한다. 주 언어가 C++이라 예전 전산물리학 조교할 때와 비선형 계획 수업을 제외하면 MATLAB을 필드에서 제대로 써 보지 않아서, 테스트겸 어제 오늘 이틀동안 여러가지 코딩을 해 보았다.
테스트 결과 MATLAB에서도 객체 프로그래밍이 가능하긴 하지만 원래 객체 기반의 언어가 아니라 몇 년에 걸쳐 구조체부터 하나씩 도입을 해 온 산물이기 때문에 C++이나 자바와는 굉장히 특성이 다르다. 간단하게 정리해 본다. 아래의 지원 목록은 help 를 참조하며 하나씩 만들어가면서 본 것이라 확실하지는 않다. (지원하더라도 괴상하게 지원하는 경우가 많다...)
객체 프로그래밍을 위해 지원하는 것
- Member variable / function
- Scope and Methods
- Public / Private / Protected
- Static / Accessor
- Inheritance
- Polymorphism
- Abstract
- Subclasses / Superclasses
- Interface
꼭 필요한 것은 아니지만 지원하는 것들
- Event / handler
- Dynamic methods
- Recursion
- Properties and attributes
MATLAB에서 기형적으로 지원하는 것들
- Properties
적어놓고 보면 다 지원하는 것 같은데, 총평을 먼저 하자면 구현이 괴악하다. 다른 언어에서 아주 기본적으로 지원하는 몇몇 부분이 지원되지 않거나 굉장히 특이하게 지원된다. 여러가지 중에서 properties의 경우, MATLAB가 주언어가 아니라서 이해가 참 힘들었다.
Properties 는 객체에서 저장 공간이나 속성을 담당한다. 다른 언어에서 변수를 member variable의 형태로 객체에 포함시켜서 사용하는 것과는 차이가 있는 부분인데, 변수들을 properties라는 일종의 구조체로 묶어서 가지고 있다. 예를 들면
classdef Trader
properties (SetAccess = protected, GetAccess = protected)
name = 'Trader'
id = 1
end
이런 식으로 기술한다.
그런데 MATLAB에서는 같은 객체 안의 method에서 자신의 property를 참조할 수 있는 직접적인 방법을 제공하지 않는다. (this나 self등이 없다!) 그래서 편법을 써야 하는데, method의 첫 인자로 자신을 넘기는 방법이다.
function obj=initialize(obj,name)
test = obj.id
end
이렇게 method를 만들면 MATLAB은 첫 인자로 자신을 넘겨주게 되고, 그 객체의 변수값을 직접 억세스하는 방식으로 현재의 값을 읽어오게 된다.
이러한 이상한 특징은 MATLAB의 기본적인 특징 하나와 맞물려 굉장히 재미있는 동작을 만든다. MATLAB은 call-by-reference를 지원하지 않는다. 그래서 위의 예에서 인자로 넘어간 객체는 실제 객체가 아니라 객체의 복사본이다. 따라서 값을 읽을 수는 있는데, 그 값을 수정할 수는 없다. 객체 안의 method에서 자신의 값을 수정할 수가 없게 된다. 그래서 properties의 값은 constructor에 의해서만 지정이 가능하다. 메모리를 가질 수 없는 객체라니, 객체 프로그래밍의 관점에서 보면 진정 엽기적인 객체 지원이다.
MATLAB에서 제안하는 방법은 객체의 리턴값으로 객체를 재지정하는 것이다. 아래와 같이, 리턴되는 값이 property 값이 변한 객체이므로 그것으로 자신을 재지정하는 식이다.
A = Trader;
A = A.initialize();
주윗 사람들의 태반은 이 방법에 동의할 수 없을 것이다. 방법이 없는 것은 아니다. MATLAB에서도 call-by-reference를 사용하는 부분이 있는데, handle 지원이다. MATLAB에서 그래프를 그리거나 UI를 만들 때, 모든 UI object들을 제어하기 위해서 handle이라는 unique number가 존재한다. 그 handle 값을 이용하여 오브젝트들의 핸들을 잡고 내부의 속성을 조정할 수 있다.
따라서 MATLAB 클래스 지원의 상속 기능을 사용하여 객체를 handle을 상속해서 생성하는 방법이 가능하다. 그러면 위의 예에서 obj는 복사된 객체가 아니라 원래 객체의 handle이 된다. 따라서 직접적인 수정이 가능해진다. 이 방법에도 문제점이 있다. 객체를 상속받은 경우 abstract나 interface를 사용할 수가 없다. 또한 여러개의 superclass들을 상속받아서 클래스를 정의하려는 경우, 모든 클래스는 handle을 루트로 가지고 있어야 한다.
classdef Trader < handle
properties
name = 'Trader'
id = 1
end
methods (Access = public)
function obj=initialize(obj,name)
obj.name = 'TEST';
end
end
end
대충 이런 식으로 '상식적인' 객체 프로그래밍을 할 준비가 마무리 되었다. 사실 처음 시작이 복잡해서 그렇지 MATLAB으로 객체 프로그래밍을 하는 것은 (코딩과 거리가 먼 사람들을 위한) 다른 언어에서 유래를 찾아볼 수 없는 어마어마한 내부 함수들 때문에 꽤 재미있다. 첫인상 정리는 여기까지.
댓글
정규형! 여전히 재미있는 것들을 하고 계시네요!
작년 한 해 코딩이 1천줄이 되지 않을 정도로 요즘은 코딩과 거리가 멀어져서 너무 고민이 많습니다. 그 원인 중 하나가 매틀랩인데, 이녀석 때문에 너무 코드를 간편하게 작성하는 문제가 생기게 되더군요 @_@; 가령, 논문 한편에 쓰는 코드가 (새로 쓰는 것만 기준으로) 20-30줄 내외라든지...
전 2007b를 사용하고 있는데 얼른 2008a라든가 후속 버전을 깔아서 OOP를 맛봐야 하겠네요. 그간 MATLAB GUI 프로그래밍할 때 코드가 산만해지는게 귀찮아서 고민이 많았는데, WINAPI에서 처럼 클래스화하여 개념상 간략하게 치환하는게 가능해질지...!
요새 앞으로 2년동안 우려먹을? 것들을 위해서 이것저것 스터디중이라는~
관리자만 볼 수 있는 댓글입니다.
오래간만이야! 요샌 어떻게 지내고 있는지! 즐겁게 지내고 있길 :D