속성에 대한 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.SetGet
및 matlab.mixin.SetGetExactNames
가 handle
클래스에서 파생되기 때문에 사용자의 서브클래스도 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)
속성 이름이 아니라 스칼라 핸들을 지정하는 경우 set
이 H
의 클래스에 포함된 각 속성에 대해 한 개의 필드를 갖는 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 = protected
인 Units
속성을 정의합니다. 따라서 S = set(h)
는 S
에 Units
에 대한 필드를 생성하지 않습니다.
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'
속성 목록 사용자 지정하기
서브클래스에서 다음 메서드를 다시 정의하여 속성 목록이 표시되는 방법을 사용자 지정할 수 있습니다.
부분 속성 이름 일치에 대한 우선 순위 설정하기
matlab.mixin.SetGet
에서 파생된 클래스는 PartialMatchPriority
속성 특성을 사용하여 부분 이름 일치에 대한 상대적 우선 순위를 지정할 수 있습니다. MATLAB은 둘 이상의 속성 이름과 일치하는 불완전하고 대/소문자 구분이 없는 텍스트 문자열을 확인할 때 이 특성을 적용합니다.
상속된 set
및 get
메서드는 부정확한 이름 문자열로 인해 발생하는 모호성이 없는 경우, 그 부정확한 속성 이름이 가리키는 속성을 결정할 수 있습니다. 부분 속성 이름이 두 개 이상의 속성과 일치해서 모호할 때, MATLAB은 PartialMatchPriority
특성 값을 이용해 이름이 어느 속성과 일치하는지 결정할 수 있습니다.
디폴트 우선 순위는 PartialMatchPriority = 1
입니다. 속성의 상대적 우선 순위를 낮추려면 PartialMatchPriority
를 2 이상의 양의 정수 값으로 설정하십시오. 속성의 우선 순위는 PartialMatchPriority
의 값이 증가할수록 낮아집니다.
예를 들어, 다음 클래스에서 Verbosity
속성은 이름 일치에서 Version
속성보다 높은 우선 순위를 가집니다.
classdef MyClass < matlab.mixin.SetGet properties Verbosity end properties (PartialMatchPriority = 2) Version end end
모호할 수 있는 부정확한 이름 Ver
로 set
메서드를 호출하면 상대적 우선 순위가 더 높으므로 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
문자열 base
로 set
메서드를 호출하면 Base
속성이 설정됩니다. BaseLine
의 우선 순위가 더 높지만, 대/소문자만 다른 전체 이름 일치가 우선합니다.
a = MyClass;
set(a,"base",-2)
disp(a)
MyClass with properties: BaseLine: [] Base: -2
새로운 속성을 추가할 때 비호환성 줄이기
새로운 속성을 추가할 때 PartialMatchPriority
특성을 사용하여 코드 비호환성이 생기지 않도록 할 수 있습니다. 예를 들어, 다음 클래스에서는 DiscreteSamples
속성의 우선 순위가 더 낮으므로 set
메서드 및 get
메서드가 문자열 Dis
로 Distance
속성을 참조할 수 있습니다.
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
속성에 더 낮은 우선 순위를 부여하면 문자열 Disc
가 DiscreteSamples
속성과 계속 일치하게 됩니다.
참고
재사용 가능한 코드를 작성할 때, 대/소문자를 구분하는 완전한 속성 이름을 사용하면 모호성을 피하고 후속 소프트웨어 릴리스와의 비호환성을 방지하며 더 읽기 쉬운 코드를 생성할 수 있습니다.
참고 항목
set
| get
| matlab.mixin.SetGet
| matlab.mixin.SetGetExactNames