Main Content

속성에 대한 set/get 인터페이스 구현하기

표준 set/get 인터페이스

그래픽스 객체와 같은 일부 MATLAB® 객체는 set 함수와 get 함수를 기반으로 하여 인터페이스를 구현합니다. 이러한 함수를 통해 단일 함수 호출에서 객체로 구성된 배열에 대한 여러 속성에 액세스할 수 있습니다.

다음 클래스 중 하나에서 파생하여 set 기능과 get 기능을 클래스에 추가할 수 있습니다.

  • matlab.mixin.SetGet — 대/소문자를 구분하지 않는 부분 속성 이름 일치를 지원하려는 경우 사용합니다. matlab.mixin.SetGet에서 파생해도 속성에 대한 점 표기법 참조를 사용하는 데 필요한 정확한 속성 이름에는 영향을 미치지 않습니다.

  • matlab.mixin.SetGetExactNames — 대/소문자를 구분하는 전체 속성 이름 일치만 지원하려는 경우 사용합니다.

참고

이 섹션에서 언급하는 set 메서드 및 get 메서드는 속성 set 액세스 메서드 및 get 액세스 메서드와 다릅니다. 속성 액세스 메서드에 대한 자세한 내용은 속성 get 및 set 메서드 항목을 참조하십시오.

서브클래스 구문

추상 클래스인 matlab.mixin.SetGet 또는 matlab.mixin.SetGetExactNames를 슈퍼클래스로 사용합니다.

classdef MyClass < matlab.mixin.SetGet
   ...
end

matlab.mixin.SetGetmatlab.mixin.SetGetExactNameshandle 클래스에서 파생되기 때문에 사용자의 서브클래스도 handle 클래스입니다.

get 메서드 구문

get 메서드는 객체 핸들과 속성 이름을 사용하여 객체 속성의 값을 반환합니다. 예를 들어, H가 객체 하나에 대한 핸들이라고 가정하겠습니다.

v = get(H,'PropertyName');

단일 속성 이름을 사용하여 핸들로 구성된 배열을 지정하면 get이 값으로 구성된 셀형 배열로 각 객체에 대한 속성값을 반환합니다.

CV = get(H,'PropertyName');

CV 배열은 H의 형태에 관계없이 항상 열입니다.

char형 벡터 속성 이름으로 구성된 셀형 배열과 핸들로 구성된 배열을 지정하면 get이 속성값으로 구성된 셀형 배열을 반환합니다. 셀에 포함된 각 행은 핸들 배열에 포함된 객체에 대응됩니다. 셀에 포함된 각 열은 속성 이름에 대응됩니다.

props = {'PropertyName1','PropertyName2'};
CV = get(H,props);

get은 m×n 셀형 배열을 반환하며, 여기서 m = length(H)이고 n = length(props)입니다.

핸들 배열을 지정하되 속성 이름을 지정하지 않으면 get은 배열에 포함된 각 구조체가 H에 포함된 객체에 대응되는 struct형의 배열을 반환합니다. 각 구조체에 포함된 각 필드는 H의 클래스로 정의된 속성에 대응됩니다. 각 필드의 값은 대응되는 속성의 값입니다.

SV = get(H);

출력 변수를 할당하지 않은 경우 H는 스칼라여야 합니다.

예제는 핸들로 구성된 배열과 함께 get 사용하기 항목을 참조하십시오.

set 메서드 구문

set 메서드는 핸들 H를 갖는 객체에 대해, 지정된 속성에 지정된 값을 할당합니다. H가 핸들로 구성된 배열이면 MATLAB이 배열 H에 포함된 각 객체에 대한 속성에 값을 할당합니다.

set(H,'PropertyName',PropertyValue)

속성 이름으로 구성된 셀형 배열과 속성값으로 구성된 셀형 배열을 set에 전달할 수 있습니다.

props = {'PropertyName1','PropertyName2'};
vals = {Property1Value,Property2Value};
set(H,props,vals)

length(H)가 1보다 크면 속성값 셀형 배열(vals)에는 각 객체에 포함된 각 속성의 값이 들어갑니다. 예를 들어 length(H)가 2, 즉 객체 핸들이 2개라고 가정하겠습니다. 각 객체에 대해 두 개의 속성값을 할당하려는 경우 다음과 같이 하십시오.

props = {'PropertyName1','PropertyName2'};
vals = {Property11Value,Property12Value;Property21Value,Property22Value};
set(H,props,vals))

위의 명령문은 다음 두 명령문과 동일합니다.

set(H(1),'PropertyName1',Property11Value,'PropertyName2',Property12Value)
set(H(2),'PropertyName1',Property21Value,'PropertyName2',Property22Value)

속성 이름이 아니라 스칼라 핸들을 지정하는 경우 setH의 클래스에 포함된 각 속성에 대해 한 개의 필드를 갖는 struct를 반환합니다. 각 필드는 빈 셀형 배열을 포함합니다.

SV = set(h);

set에 대한 하나의 호출에서 속성 이름/속성값 셀형 배열, 구조체형 배열(필드 이름이 속성 이름이고 필드 값이 속성값임), 셀형 배열을 조합하여 사용할 수 있습니다.

matlab.mixin.SetGet에서 파생된 클래스

이 예제 클래스는 set/get 인터페이스를 정의하고 상속된 메서드의 동작을 보여줍니다.

classdef LineType < matlab.mixin.SetGet
   properties
      Style = '-'
      Marker = 'o'
   end
   properties (SetAccess = protected)
      Units = 'points'
   end
   methods
      function obj = LineType(s,m)
         if nargin > 0
            obj.Style = s;
            obj.Marker = m;
         end
      end
      function set.Style(obj,val)
         if ~(strcmpi(val,'-') ||...
               strcmpi(val,'--') ||...
               strcmpi(val,'..'))
            error('Invalid line style ')
         end
         obj.Style = val;
      end
      function set.Marker(obj,val)
         if ~isstrprop(val,'graphic')
            error('Marker must be a visible character')
         end
         obj.Marker = val;
      end
   end
end

클래스의 인스턴스를 생성하고 그 핸들을 저장합니다.

h = LineType('--','*');

상속된 get 메서드를 사용하여 객체 속성의 값을 쿼리합니다.

get(h,'Marker')
ans =

'*'

상속된 set 메서드를 사용하여 속성의 값을 설정합니다.

set(h,'Marker','Q')

set 및 get으로 호출되는 속성 액세스 메서드

set 메서드 및 get 메서드를 사용하면 MATLAB이 속성 액세스 메서드(LineType 클래스의 set.Style 또는 set.Marker)를 호출합니다.

set(h,'Style','-.-')
Error using LineType/set.Style (line 20)
Invalid line style

속성 액세스 메서드에 대한 자세한 내용은 속성 get 및 set 메서드 항목을 참조하십시오.

모든 속성 나열하기

get을 사용하여 객체 속성과 이 객체 속성의 현재 값을 포함하는 struct를 반환할 수 있습니다.

h = LineType('--','*');
SV = get(h)
SV = 

  struct with fields:

     Style: '--'
    Marker: '*'
     Units: 'points'

set을 사용하여 public SetAccess를 갖는 속성을 포함하는 struct를 반환할 수 있습니다.

S = set(h)
S = 

  struct with fields:

     Style: {}
    Marker: {}

LineType 클래스는 SetAccess = protectedUnits 속성을 정의합니다. 따라서 S = set(h)SUnits에 대한 필드를 생성하지 않습니다.

set은 퍼블릭이 아닌 set 액세스를 갖는 속성에 대해서는 값을 반환할 수 없습니다.

핸들로 구성된 배열과 함께 get 사용하기

LineType 객체로 구성된 배열을 생성한다고 가정하겠습니다.

H = [LineType('..','z'),LineType('--','q')]
H = 

  1x2 LineType with properties:

    Style
    Marker
    Units

H가 핸들로 구성된 배열이면 get이 속성값으로 구성된 (length(H)×1) 셀형 배열을 반환합니다.

CV = get(H,'Style')
CV =

  2×1 cell array

    {'..'}
    {'--'}

H가 핸들로 구성된 배열인 경우 속성 이름을 지정하지 않으면 get이 속성 이름에 대응하는 이름을 갖는 필드를 포함하는 struct 배열을 반환합니다. H가 스칼라가 아닌 경우 get의 출력값을 변수에 할당합니다.

SV = get(H)
SV = 

2x1 struct array with fields:
    Style
    Marker
    Units

구조체로 구성된 SV 배열의 두 번째 배열 요소에서 Marker 속성의 값을 가져옵니다.

SV(2).Marker
ans =

'q'

핸들, 이름, 값으로 구성된 배열

핸들로 구성된 배열, 속성 이름으로 구성된 셀형 배열, 속성값으로 구성된 셀형 배열을 set에 전달할 수 있습니다. 속성값 셀형 배열에는 H에 포함된 각 객체에 대한 속성값으로 구성된 하나의 행이 있어야 합니다. 각 행에는 속성 이름 배열에 포함된 각 속성에 대한 하나의 값이 있어야 합니다.

H = [LineType('..','z'),LineType('--','q')];
set(H,{'Style','Marker'},{'..','o';'--','x'})

set에 대한 이 호출의 결과는 다음과 같습니다.

H(1)
ans = 

  LineType with properties:

     Style: '..'
    Marker: 'o'
     Units: 'points
H(2)
ans = 

  LineType with properties:

     Style: '--'
    Marker: 'x'
     Units: 'points'

속성 목록 사용자 지정하기

서브클래스에서 다음 메서드를 다시 정의하여 속성 목록이 표시되는 방법을 사용자 지정할 수 있습니다.

  • setdisp — 출력 인수는 사용하지 않고 하나의 스칼라 핸들 입력값을 사용하여 set을 호출하면 setsetdisp를 호출하여 속성 목록을 표시할 방법을 확인합니다.

  • getdisp — 출력 인수는 사용하지 않고 하나의 스칼라 핸들 입력값을 사용하여 get을 호출하면 getgetdisp를 호출하여 속성 목록을 표시할 방법을 확인합니다.

부분 속성 이름 일치에 대한 우선 순위 설정하기

matlab.mixin.SetGet에서 파생된 클래스는 PartialMatchPriority 속성 특성을 사용하여 부분 이름 일치에 대한 상대적 우선 순위를 지정할 수 있습니다. MATLAB은 둘 이상의 속성 이름과 일치하는 불완전하고 대/소문자 구분이 없는 텍스트 문자열을 확인할 때 이 특성을 적용합니다.

상속된 setget 메서드는 부정확한 이름 문자열로 인해 발생하는 모호성이 없는 경우, 그 부정확한 속성 이름이 가리키는 속성을 결정할 수 있습니다. 부분 속성 이름이 두 개 이상의 속성과 일치해서 모호할 때, MATLAB은 PartialMatchPriority 특성 값을 이용해 이름이 어느 속성과 일치하는지 결정할 수 있습니다.

디폴트 우선 순위는 PartialMatchPriority = 1입니다. 속성의 상대적 우선 순위를 낮추려면 PartialMatchPriority를 2 이상의 양의 정수 값으로 설정하십시오. 속성의 우선 순위는 PartialMatchPriority의 값이 증가할수록 낮아집니다.

예를 들어, 다음 클래스에서 Verbosity 속성은 이름 일치에서 Version 속성보다 높은 우선 순위를 가집니다.

classdef MyClass < matlab.mixin.SetGet
    properties
        Verbosity
    end
    properties (PartialMatchPriority = 2)
        Version
    end
end

모호할 수 있는 부정확한 이름 Verset 메서드를 호출하면 상대적 우선 순위가 더 높으므로 Verbosity 속성이 설정됩니다. 만약 PartialMatchPriority 특성을 설정하지 않았다면 모호한 이름으로 인해 오류가 발생했을 것입니다.

a = MyClass;
set(a,"Ver",10)
disp(a)
 MyClass with properties:

    Verbosity: 10
      Version: []

이와 동일한 이름 선택이 get 메서드에 적용됩니다.

v = get(a,"Ver")
v =

    10 

대/소문자 및 이름 일치

일치하지 않는 대/소문자를 포함하는 전체 이름 일치가 우선 순위가 더 높은 속성을 가진 부분 일치보다 우선합니다. 예를 들어, 다음 클래스는 우선 순위 1(디폴트 값)로 BaseLine 속성을 정의하고 우선 순위 2(1보다 낮음)로 Base 속성을 정의합니다.

classdef MyClass < matlab.mixin.SetGet
    properties
        BaseLine
    end
    properties (PartialMatchPriority = 2)
        Base
    end
end

문자열 baseset 메서드를 호출하면 Base 속성이 설정됩니다. BaseLine의 우선 순위가 더 높지만, 대/소문자만 다른 전체 이름 일치가 우선합니다.

a = MyClass;
set(a,"base",-2)
disp(a)
 MyClass with properties:

    BaseLine: []
        Base: -2

새로운 속성을 추가할 때 비호환성 줄이기

새로운 속성을 추가할 때 PartialMatchPriority 특성을 사용하여 코드 비호환성이 생기지 않도록 할 수 있습니다. 예를 들어, 다음 클래스에서는 DiscreteSamples 속성의 우선 순위가 더 낮으므로 set 메서드 및 get 메서드가 문자열 DisDistance 속성을 참조할 수 있습니다.

classdef Planet < matlab.mixin.SetGet
% Version 1.0
    properties
        Distance
    end
    properties(PartialMatchPriority = 2)
        DiscreteSamples
    end
end

이 클래스의 버전 2.0에서는 Discontinuities로 명명된 속성이 추가됩니다. 기존 코드에서 모호한 부분 속성 이름이 발생하지 않도록 하려면 PartialMatchPriority를 사용하여 Discontinuities의 우선 순위를 이전에 있는 기존 속성의 우선 순위보다 낮게 설정하십시오.

classdef Planet < matlab.mixin.SetGet
% Version 2.0
    properties
        Diameter;
        NumMoons = 0
        ApparentMagnitude;
        DistanceFromSun;
    end
    properties(PartialMatchPriority = 2)
        DiscreteSamples;
    end
    properties(PartialMatchPriority = 3)
        Discontinuities = false;
    end
end

Planet 클래스의 버전 1.0의 경우, set 메서드에 대한 다음 호출이 모호하지 않았습니다.

p = Planet;
set(p,"Disc",true)

그러나 Discontinuities 속성이 추가되면서 문자열 Disc가 모호해집니다. Discontinuities 속성에 더 낮은 우선 순위를 부여하면 문자열 DiscDiscreteSamples 속성과 계속 일치하게 됩니다.

참고

재사용 가능한 코드를 작성할 때, 대/소문자를 구분하는 완전한 속성 이름을 사용하면 모호성을 피하고 후속 소프트웨어 릴리스와의 비호환성을 방지하며 더 읽기 쉬운 코드를 생성할 수 있습니다.

참고 항목

| | |

관련 항목