Main Content

MATLAB과 다른 OO 언어 비교

C++ 및 Java 코드와의 차이점

MATLAB® 프로그래밍 언어는 몇 가지 중요한 측면에서 C++ 또는 Java®와 같은 다른 객체 지향 언어와 차이가 있습니다.

퍼블릭 속성

C++ 또는 Java 언어의 필드와 다르게 MATLAB 속성을 사용하여 데이터 저장소 구현과 별개로 퍼블릭 인터페이스를 정의할 수 있습니다. 속성값을 할당하거나 쿼리할 때 자동으로 실행되는 set 액세스 메서드와 get 액세스 메서드를 정의할 수 있으므로 속성에 대한 퍼블릭 액세스를 제공할 수 있습니다. 예를 들어, 다음 명령문은

myobj.Material = 'plastic';

char형 벡터 plasticmyobjMaterial 속성에 할당합니다. 실제로 값을 할당하기 전에 myobj는 필요한 연산을 수행할 수 있는 set.Material(myobj의 클래스가 이 메서드를 정의한다고 가정함)이라는 메서드를 실행합니다. 속성 액세스 메서드에 대한 자세한 내용은 속성 get 및 set 메서드 항목을 참조하십시오.

또한, 퍼블릭 액세스, 보호 액세스 또는 프라이빗 액세스를 활성화하는 특성을 설정하여 속성에 대한 액세스를 제어할 수도 있습니다. 전체 속성 특성 목록은 속성 특성(Attribute) 항목을 참조하십시오.

묵시적 파라미터가 없음

일부 언어에서는 하나의 메서드에 대한 하나의 객체 파라미터가 항상 묵시적입니다. MATLAB에서는 객체가 이에 대해 동작하는 메서드에 대한 명시적 파라미터입니다.

디스패치

MATLAB 클래스에서 메서드 디스패치는 메서드 시그니처를 기반으로 하지 않지만 C++ 및 Java 코드에서는 메서드 시그니처를 기반으로 합니다. 인수 목록에 동일한 우선 순위를 가지는 객체가 있는 경우 MATLAB은 호출할 메서드를 선택하는 데 가장 왼쪽에 있는 객체를 사용합니다.

하지만 특정 인수의 클래스가 다른 인수의 클래스보다 우위에 있으면 MATLAB이 인수 목록 내의 위치에 관계없이 상위 인수의 메서드에 디스패치합니다.

자세한 내용은 Class Precedence 항목을 참조하십시오.

슈퍼클래스 메서드 호출하기

  • C++에서는 범위 지정 연산자를 사용하여 슈퍼클래스 메서드를 호출합니다(예: superclass::method).

  • Java 코드에서는 superclass.method를 사용합니다.

이에 상응하는 MATLAB 연산은 method@superclass입니다.

기타 차이점

MATLAB 클래스에는 C++ 템플릿 또는 Java 제네릭에 상응하는 개념이 없습니다. 하지만 MATLAB은 약한 유형의 언어이므로 여러 데이터 유형과 작동하는 함수 및 클래스를 작성할 수 있습니다.

MATLAB 클래스는 동일한 함수 이름에 여러 다른 시그니처를 사용하여 함수를 오버로드하는 것을 지원하지 않습니다.

객체 수정

MATLAB 클래스는 퍼블릭 속성을 정의할 수 있으며, 퍼블릭 속성은 지정된 클래스의 인스턴스에 대해 해당 속성에 값을 명시적으로 할당하여 수정할 수 있습니다. 하지만 handle 클래스에서 파생된 클래스만 참조 동작을 보입니다. 값 클래스(handle에서 파생되지 않은 클래스)의 인스턴스에 대해 속성값을 수정하면 수정이 이루어진 맥락 내에서만 값이 변경됩니다.

다음 섹션에서 이 동작에 대해 더 자세히 다루게 됩니다.

함수에 전달된 객체

MATLAB은 모든 변수를 값으로 전달합니다. 객체를 함수에 전달하면 MATLAB이 호출자에서 호출된 함수의 파라미터 변수로 값을 복사합니다.

하지만 MATLAB은 복사되었을 때 서로 다르게 동작하는 다음과 같은 두 가지 종류의 클래스를 지원합니다.

  • 핸들 클래스 — 핸들 클래스 인스턴스 변수는 객체를 참조합니다. 핸들 클래스 인스턴스 변수의 복사본은 원래 변수와 동일한 객체를 참조합니다. 함수가 입력 인수로 전달된 핸들 객체를 수정하면 원래 핸들이 참조하는 객체와 복사된 핸들이 참조하는 객체 모두에 영향을 미칩니다.

  • 값 클래스 — 값 클래스 인스턴스의 속성 데이터는 해당 인스턴스의 복사본에 있는 속성 데이터에 독립적입니다(단, 값 클래스 속성은 핸들을 포함할 수 있음). 함수는 입력 인수로 전달된 값 객체를 수정할 수 있지만, 이러한 수정은 원래 객체에 영향을 미치지 않습니다.

이 두 가지 종류의 클래스에 대한 동작과 사용에 대한 자세한 내용은 핸들 클래스와 값 클래스 비교 항목을 참조하십시오.

값 객체 전달하기.  값 객체를 함수에 전달하면 함수가 인수 변수의 로컬 복사본을 생성합니다. 함수는 복사본만 수정할 수 있습니다. 원래 객체를 수정하려면 수정한 객체를 반환한 다음 이를 원래 변수 이름에 할당해야 합니다. 예를 들어, 값 클래스 SimpleClass를 살펴보겠습니다.

classdef SimpleClass
   properties
      Color
   end
   methods
      function obj = SimpleClass(c)
         if nargin > 0
            obj.Color = c;
         end
      end
   end
end

red라는 값을 Color 속성에 할당하여 SimpleClass의 인스턴스를 생성합니다.

obj = SimpleClass('red');

객체를 함수 g에 전달합니다. 그러면 이 함수가 blueColor 속성에 할당합니다.

function y = g(x)
   x.Color = 'blue';
   y = x;
end
y = g(obj);

함수 g는 입력 객체의 복사본을 수정하고 해당 복사본을 반환하지만 원래 객체를 변경하지는 않습니다.

y.Color
ans =

    blue
obj.Color
ans =

     red

함수 g가 값을 반환하지 않는다면, 객체의 Color 속성에 대한 수정은 함수 작업 공간 내의 obj 복사본에서만 이루어집니다. 함수 실행이 종료되면 이 복사본은 범위를 벗어나게 됩니다.

원래 변수를 덮어씀으로써 사실상 원래 객체가 새 객체로 대체됩니다.

obj = g(obj);

핸들 객체 전달하기.  핸들을 함수에 전달하면 값 객체를 전달할 때와 마찬가지로 함수가 핸들 변수의 복사본을 생성합니다. 하지만 핸들 객체의 복사본이 원래 핸들과 동일한 객체를 참조하기 때문에 함수가 수정된 객체를 반환할 필요 없이 객체를 수정할 수 있습니다.

예를 들어, SimpleClass 클래스 정의를 수정하여 handle 클래스에서 파생된 클래스를 만든다고 가정하겠습니다.

classdef SimpleHandleClass < handle
   properties
      Color
   end
   methods
      function obj = SimpleHandleClass(c)
         if nargin > 0
            obj.Color = c;
         end
      end
   end
end

red라는 값을 Color 속성에 할당하여 SimpleHandleClass의 인스턴스를 생성합니다.

obj = SimpleHandleClass('red');

객체를 함수 g에 전달합니다. 그러면 이 함수가 blueColor 속성에 할당합니다.

y = g(obj);

함수 g는 반환된 핸들과 원래 핸들 모두에서 참조되는 객체의 Color 속성을 설정합니다.

y.Color
ans =

blue
obj.Color
ans =

blue

변수 yobj는 동일한 객체를 참조합니다.

y.Color = 'yellow';
obj.Color
ans =

yellow

함수 g는 입력 인수(obj)가 참조하는 객체를 수정한 후 그 객체에 대한 핸들을 y로 반환했습니다.

MATLAB은 핸들을 값으로 전달함.  핸들 변수는 객체에 대한 참조입니다. MATLAB은 이 참조를 값으로 전달합니다.

핸들은 C++의 참조처럼 동작하지 않습니다. 객체 핸들을 함수에 전달하고 해당 함수가 핸들 변수에 다른 객체를 할당하는 경우 호출자의 변수는 영향을 받지 않습니다. 예를 들어, 함수 g2를 정의한다고 가정하겠습니다.

function y = g2(x)
   x = SimpleHandleClass('green');
   y = x;
end

핸들 객체를 g2에 전달합니다.

obj = SimpleHandleClass('red');
y = g2(obj);
y.Color
ans =

green
obj.Color
ans =

red

이 함수는 인수로 전달된 핸들을 덮어쓰지만, 핸들로 참조되는 객체는 덮어쓰지 않습니다. 원래 핸들 obj는 계속해서 원래 객체를 참조합니다.

정적 속성

MATLAB의 클래스에서는 상수 속성은 정의할 수 있지만 C++ 등의 다른 언어에서 사용되는 것과 같은 의미의 "정적(static)" 속성을 정의할 수는 없습니다. 상수 속성은 클래스 정의에 지정한 초기값에서 변경할 수 없습니다.

MATLAB에는 변수가 항상 함수와 클래스의 이름보다 우선한다는 오래된 규칙이 있습니다. 대입문은 변수가 존재하지 않을 경우 변수를 추가합니다.

다음 형식의 표현식은

A.B = C

새 변수 A를 추가합니다. 이 변수는 값이 C인 필드 B를 포함하는 struct입니다. A.B = CA 클래스의 정적 속성을 참조할 경우 A 클래스가 변수 A보다 우선하게 됩니다.

이러한 동작은 이전 릴리스의 MATLAB과의 심각한 비호환성 문제를 야기합니다. 예를 들어, MATLAB 경로에 A라는 이름의 클래스를 추가하면 .m 코드 파일 내부에서 A.B = C와 같은 대입문의 의미가 바뀔 수 있습니다.

다른 언어에서는 클래스 내부에서 프라이빗 데이터로 사용하거나 퍼블릭 상수로 사용하는 경우를 제외하고는 클래스에서 정적 데이터를 거의 사용하지 않습니다. MATLAB에서는 Java에서 public final static 필드를 사용하는 것과 같은 식으로 상수 속성을 사용할 수 있습니다. MATLAB에서 클래스 내부로 한정된 데이터를 사용하려면 영속 변수를 프라이빗 메서드나 보호 메서드 내에 생성하거나 클래스가 전용으로 사용하는 로컬 함수를 생성하십시오.

MATLAB에서는 정적 데이터를 사용하지 마십시오. 클래스에 정적 데이터가 포함된 경우 여러 애플리케이션에서 동일한 클래스를 사용하면 애플리케이션 간에 충돌이 발생합니다. 이러한 충돌은 몇몇 다른 언어에서는 그다지 문제가 되지 않습니다. 이러한 언어는 각기 다른 프로세스에서 실행되는 실행 파일로 애플리케이션을 컴파일합니다. 프로세스마다 클래스 정적 데이터의 자체 복사본을 가집니다. MATLAB은 각 클래스에 대한 단일 복사본을 사용하여 동일한 프로세스와 환경에서 서로 다른 여러 애플리케이션을 실행하는 경우가 많습니다.

MATLAB에서 정적 데이터를 정의하고 사용하는 방법은 정적 데이터 항목을 참조하십시오.

일반적인 객체 지향 기법

다음 표에는 다른 객체 지향 언어에서 흔히 사용되는 객체 지향 기법을 설명하는 섹션의 링크가 나와 있습니다.

기법MATLAB에서 사용하는 방법
연산자 오버로드연산자 오버로드
다중 상속여러 개의 클래스를 서브클래스화하기
서브클래스화서브클래스 생성자 설계하기
소멸자핸들 클래스 소멸자
데이터 멤버 범위 지정속성 특성(Attribute)
네임스페이스(클래스 범위 지정)패키지로 네임스페이스 생성하기
명명된 상수상수 값으로 클래스 속성 정의하기Named Values 항목을 참조하십시오.
열거형열거형 클래스 정의하기
정적 메서드정적 메서드
정적 속성

지원되지 않음. persistent 변수를 참조하십시오. Java static final 속성 또는 C++ static const 속성에 상응하는 속성으로는 Constant 속성을 사용하십시오. 상수 값으로 클래스 속성 정의하기 항목을 참조하십시오.

변경 가능한(mutable) 정적 데이터는 정적 데이터 항목을 참조하십시오.

생성자클래스 생성자 메서드
복사 생성자직접적으로 상응하는 항목 없음
참조/참조 클래스핸들 클래스와 값 클래스 비교
추상 클래스/인터페이스추상 클래스 및 클래스 멤버
가비지 컬렉션객체 라이프사이클
인스턴스 속성동적 속성 — 인스턴스에 속성 추가하기
클래스 가져오기클래스 가져오기
이벤트와 리스너이벤트 및 리스너 개념