간단한 클래스 생성하기

클래스 설계하기

클래스의 기본 목적은 데이터와 그 데이터에 대해 수행되는 연산을 캡슐화하는 객체를 정의하는 것입니다. 예를 들어, BasicClass는 하나의 속성과 이 속성의 데이터에 대해 연산을 수행하는 두 메서드를 정의합니다.

  • Value — 클래스의 객체에 저장된 숫자형 데이터를 포함하는 속성

  • roundOff — 속성값을 소수점 이하 두 자리수로 반올림하는 메서드

  • multiplyBy — 속성값을 지정된 숫자와 곱하는 메서드

다음은 BasicClass의 정의입니다.

classdef BasicClass
   properties
      Value {mustBeNumeric}
   end
   methods
      function r = roundOff(obj)
         r = round([obj.Value],2);
      end
      function r = multiplyBy(obj,n)
         r = [obj.Value] * n;
      end
   end
end

클래스 구문에 대한 요약을 보려면 classdef를 참조하십시오.

클래스를 사용하려면 다음을 수행하십시오.

  • 클래스와 동일한 이름을 갖는 .m 파일에 클래스 정의를 저장합니다.

  • 클래스의 객체를 생성합니다.

  • 속성에 액세스하여 데이터를 할당합니다.

  • 메서드를 호출하여 데이터에 대한 연산을 수행합니다.

객체 생성

클래스 이름을 사용하여 클래스의 객체를 생성할 수 있습니다.

a = BasicClass
a = 

  BasicClass with properties:

    Value: []

처음에는 속성값이 비어 있습니다.

속성에 액세스하기

속성 이름 앞에 객체 변수와 점을 사용하여 Value 속성에 값을 할당할 수 있습니다.

a.Value = pi/3;

속성값을 반환하려면 값을 할당하지 않고 점 표기법을 사용하십시오.

a.Value
ans =

    1.0472

클래스 속성에 대한 자세한 내용은 Class Properties 항목을 참조하십시오.

메서드 호출하기

객체 a에 대해 roundOff 메서드를 호출해 보겠습니다.

roundOff(a)
ans =

    1.0500

이 객체를 여러 개의 인수를 받는 메서드에 대한 첫 번째 인수로 전달합니다. 아래 myltiplyBy 메서드처럼 호출할 수 있습니다.

multiplyBy(a,3)
ans =

    3.1416

점 표기법을 사용하여 메서드를 호출할 수도 있습니다.

a.multiplyBy(3)

점 표기법을 사용할 때는 객체를 인수로 명시적으로 전달할 필요가 없습니다. 이 표기법에서는 점과 메서드 이름의 왼쪽에 객체를 사용합니다.

클래스 메서드에 대한 자세한 내용은 메서드와 함수 항목을 참조하십시오.

생성자 추가하기

클래스는 생성자라고 하는 특수 메서드를 정의하여 클래스의 객체를 생성할 수 있습니다. 생성자 메서드를 사용하면 생성자에 인수를 전달할 수 있으며 이를 속성값으로 할당할 수 있습니다. BasicClassValue 속성은 mustBeNumeric 함수를 사용하여 가능한 값을 제한합니다.

다음은 BasicClass 클래스에 대한 생성자입니다. 입력 인수를 사용하여 생성자를 호출하면 Value 속성에 할당됩니다. 입력 인수 없이 생성자를 호출하면 Value 속성은 디폴트 값인 빈 상태([])가 됩니다.

methods        
    function obj = BasicClass(val)
        if nargin == 1
            obj.Value = val;
        end
    end
end

이 생성자를 클래스 정의에 추가하면 객체 생성과 속성값 설정을 한 번에 수행할 수 있습니다.

a = BasicClass(pi/3)
a = 

  BasicClass with properties:

    Value: 1.0472

생성자는 클래스의 객체 생성과 관련된 다른 작업을 수행할 수 있습니다.

생성자에 대한 자세한 내용은 클래스 생성자 메서드 항목을 참조하십시오.

메서드 벡터화하기

MATLAB®에서는 연산을 벡터화할 수 있습니다. 예를 들어, 벡터에 숫자를 더할 수 있습니다.

[1 2 3] + 2
ans =

     3     4     5

MATLAB이 숫자 2를 배열 [1 2 3] 내 각 요소에 더합니다. 산술 연산자 메서드를 벡터화하려면 obj.Value 속성 참조를 대괄호로 묶으십시오.

[obj.Value] + 2

이 구문을 사용하면 객체로 구성된 배열에 메서드를 사용할 수 있습니다. 예를 들어, 인덱스 참조 값 할당을 사용하여 객체 배열을 만들어 보겠습니다.

obj(1) = BasicClass(2.7984);
obj(2) = BasicClass(sin(pi/3));
obj(3) = BasicClass(7);

그러면 다음 표현식은

[obj.Value] + 2

아래 표현식과 동일합니다.

[obj(1).Value obj(2).Value obj(3).Value] + 2

roundOff 메서드가 벡터화되었기 때문에 배열에 대해 연산을 수행할 수 있습니다.

roundOff(obj)
ans =

    2.8000    0.8700    7.0000

함수 오버로드하기

클래스는 기존 MATLAB 함수와 동일한 이름을 갖는 메서드를 정의하여 더하기와 같은 기존 기능을 구현할 수 있습니다. 예를 들어, 두 개의 BasicClass 객체를 더한다고 가정하겠습니다. 그렇다면 각 객체의 Value 속성값도 더해지는 것이 자연스럽습니다.

다음은 MATLAB plus 함수의 오버로드된 버전입니다. 속성값을 더해서 BasicClass 클래스의 더하기를 정의하고 있습니다.

method
   function r = plus(o1,o2)
      r = [o1.Value] + [o2.Value];
   end
end

plus 메서드를 구현하면 BasicClass의 객체에 “+” 연산자를 사용할 수 있습니다.

a = BasicClass(pi/3);
b = BasicClass(pi/4);
a + b
ans =

    1.8326

plus 메서드를 벡터화하여 객체 배열에 대해 연산을 수행할 수 있습니다.

a = BasicClass(pi/3);
b = BasicClass(pi/4);
c = BasicClass(pi/2);
ar = [a b];
ar + c
ans =

    2.6180    2.3562

관련 정보

함수 오버로드에 대한 자세한 내용은 클래스 정의에서 함수 오버로드하기 항목을 참조하십시오.

연산자 오버로드에 대한 자세한 내용은 연산자 오버로드 항목을 참조하십시오.

BasicClass 코드 목록

다음은 이 항목에 설명된 특징을 추가한 후의 BasicClass 정의입니다.

classdef BasicClass
    properties
        Value {mustBeNumeric}
    end
    methods
        function obj = BasicClass(val)
            if nargin == 1
                obj.Value = val;
            end
        end
        function r = roundOff(obj)
            r = round([obj.Value],2);
        end
        function r = multiplyBy(obj,n)
            r = [obj.Value] * n;
        end
        function r = plus(o1,o2)
            r = [o1.Value] + [o2.Value];
        end
    end
end

관련 항목