이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

클래스로 구조화된 데이터 나타내기

데이터 구조로 사용되는 객체

이 예제에서는 특정 구조체로 데이터를 저장하기 위한 클래스를 정의합니다. 데이터 저장소에 일관된 구조체를 사용하면 데이터에 대한 연산을 수행하는 함수를 더욱 손쉽게 생성할 수 있습니다. 특정 데이터 요소를 설명하는 필드 이름을 갖는 MATLAB® struct를 사용하면 데이터를 구조화하는 데 유용할 수 있습니다. 하지만 클래스를 사용하면 데이터 저장소(속성)와 해당 데이터에 대해 수행할 수 있는 연산(메서드) 모두를 정의할 수 있습니다. 이 예제에서는 이러한 이점에 대해서 다룹니다.

예제에 대한 배경

이 예제에서의 데이터는 인장 응력/압력 측정값을 나타냅니다. 이 데이터는 다양한 재료의 탄성 계수를 계산하는 데 사용됩니다. 간단히 말하면 응력은 재료에 가해지는 힘이고 압력은 그 결과로 나타나는 변형입니다. 이 비율은 재료의 특징을 정의합니다. 이 접근 방식은 실제 과정을 지나치게 단순화한 것이지만 이 예제에서는 충분합니다.

데이터의 구조

다음 표에는 데이터의 구조에 대한 설명이 나와 있습니다.

데이터

설명

Material

테스트한 재료의 유형을 식별하는 char 벡터

SampleNumber

특정 테스트 샘플의 번호

Stress

테스트 도중 샘플에 가해지는 응력을 나타내는 숫자로 구성된 벡터

Strain

가해지는 응력값에 대응하는 압력을 나타내는 숫자로 구성된 벡터

Modulus

테스트 중인 재료의 탄성 계수를 정의하는 숫자로 응력 및 압력 데이터에서 계산됩니다.

TensileData 클래스

이 예제는 먼저 클래스에 대한 단순한 구현으로 시작하여 이 구현을 바탕으로 각각 추가되는 기능이 클래스의 유용함을 어떻게 향상시키는지를 보여줍니다.

이 클래스의 첫 번째 버전에는 데이터 저장소만 있습니다. 이 클래스는 필수 데이터 요소 각각에 대한 속성을 정의합니다.

classdef TensileData
   properties
      Material
      SampleNumber
      Stress
      Strain
      Modulus
   end
end

인스턴스를 생성하고 데이터 할당하기

다음 명령문은 TensileData 객체를 생성하고 이 객체에 데이터를 할당합니다.

td = TensileData;
td.Material = 'Carbon Steel';
td.SampleNumber = 001;
td.Stress = [2e4 4e4 6e4 8e4];
td.Strain = [.12 .20 .31 .40];
td.Modulus = mean(td.Stress./td.Strain);

클래스와 구조체의 이점 비교

TensileData 객체(이전 명령문에서 td)는 여느 MATLAB 구조체를 취급하는 것과 같은 방식으로 취급해야 합니다. 하지만 특화된 데이터 구조를 클래스로 정의하면 MATLAB struct와 같은 범용 데이터 구조를 사용하는 경우에 비해 이점이 있습니다.

  • 사용자가 필드 이름의 철자를 실수로 잘못 입력하는 경우 오류가 발생합니다. 예를 들어, 다음을 입력하면

    td.Modulis = ...
    

    필드가 구조체에 추가될 뿐입니다. 하지만 tdTensileData 클래스의 인스턴스인 경우에는 오류가 반환됩니다.

  • 클래스는 재사용하기가 쉽습니다. 클래스를 한 번 정의한 후에는 새로운 속성을 추가하는 서브클래스를 사용하면 클래스를 손쉽게 확장할 수 있습니다.

  • 클래스는 식별하기가 쉽습니다. 클래스는 이름을 가지므로 whos 함수 및 class 함수와 작업 공간 브라우저를 사용하여 객체를 식별할 수 있습니다. 클래스 이름을 사용하면 의미 있는 이름을 갖는 레코드를 쉽게 참조할 수 있습니다.

  • 클래스에 필드 값이 할당된 경우, 클래스 또는 값 등의 개별 필드의 값의 유효성을 검사할 수 있습니다.

  • 클래스는 특정 필드를 읽을 수 있도록 허용하되 변경할 수는 없게 하는 식으로 필드의 대한 액세스를 제한할 수 있습니다.

속성을 특정 값으로 제한하기

속성 set 액세스 메서드를 정의하여 속성을 특정 값으로 제한할 수 있습니다. MATLAB은 속성에 대한 값을 설정할 때마다 set 액세스 메서드를 호출합니다.

Material 속성의 Set 함수

Material 속성의 set 메서드는 속성의 대입값을 aluminum, stainless steel 또는 carbon steel 문자열 중 하나로 제한합니다.

이 함수 정의를 methods 블록에 추가합니다.

classdef TensileData
   properties
      Material
      SampleNumber
      Stress
      Strain
      Modulus
   end
   methods
      function obj = set.Material(obj,material)
         if (strcmpi(material,'aluminum') ||...
               strcmpi(material,'stainless steel') ||...
               strcmpi(material,'carbon steel'))
            obj.Material = material;
         else
            error('Invalid Material')
         end
      end
   end
end

Material 속성을 설정하려고 하면 MATLAB이 속성값을 설정하기 전에 set.Material 메서드를 호출합니다.

값이 허용되는 값과 일치할 경우 함수가 속성을 해당 값으로 설정합니다. set 메서드 내의 코드는 속성 set 메서드를 재귀적으로 호출하지 않도록 속성에 직접 액세스할 수 있습니다.

예를 들면 다음과 같습니다.

td = TensileData;
td.Material = 'brass';
Error using TensileData/set.Material
Invalid Material

생성자를 사용하여 인터페이스 단순화하기

생성자를 추가하여 TensileData 클래스에 대한 인터페이스를 단순화할 수 있으며, 생성자는 다음과 같은 특징을 갖습니다.

  • 데이터를 생성자에 대한 인수로 전달할 수 있도록 합니다.

  • 속성에 값을 할당합니다.

생성자는 클래스와 동일한 이름을 갖는 메서드입니다.

methods
   function td = TensileData(material,samplenum,stress,strain)
      if nargin > 0
         td.Material = material;
         td.SampleNumber = samplenum;
         td.Stress = stress;
         td.Strain = strain;
      end
   end 
end

다음 명령문을 사용하여 데이터로 완전히 채워진 TensileData 객체를 생성할 수 있습니다.

td = TensileData('carbon steel',1,...
      [2e4 4e4 6e4 8e4],...
      [.12 .20 .31 .40]);

요청 시 데이터 계산하기

어떤 속성의 값이 다른 속성에 종속되는 경우 Dependent 특성을 사용하여 해당 속성을 정의하십시오. MATLAB은 종속 속성의 값을 저장하지 않습니다. 종속되는 속성의 get 메서드는 해당 속성이 쿼리될 때 속성값을 파악합니다.

탄성 계수 계산하기

TensileData 객체는 Modulus 속성의 값을 저장하지 않습니다. 생성자는 Modulus 속성의 값에 대한 입력 인수를 갖지 않습니다. Modulus의 값은 다음과 같은 특징이 있습니다.

  • Stress 속성 및 Strain 속성의 값으로부터 계산됩니다.

  • Stress 속성 또는 Strain 속성의 값이 변경되면 그에 따라 변경되어야 합니다.

따라서 Modulus 속성의 값이 요청된 경우에만 계산하는 것이 좋습니다. Modulus의 값을 계산하려면 속성의 get 액세스 메서드를 사용하십시오.

Modulus 속성의 get 메서드

Modulus 속성은 StressStrain에 종속되므로 Dependent 특성은 true입니다. Modulus 속성을 별도의 properties 블록에 배치하고 Dependent 특성을 설정합니다.

get.Modulus 메서드는 Modulus 속성의 값을 계산한 후 반환합니다.

properties (Dependent)
   Modulus
end

디폴트 특성만을 사용하여 methods 블록에 속성 get 메서드를 정의합니다.

methods
   function modulus = get.Modulus(obj)
      ind = find(obj.Strain > 0);
      modulus = mean(obj.Stress(ind)./obj.Strain(ind));
   end
end

이 메서드는 분모 데이터에서 0을 제거한 후 압력에 대한 응력 데이터의 평균 비율을 계산합니다.

속성이 쿼리되면 MATLAB이 get.Modulus 메서드를 호출합니다. 예를 들면 다음과 같습니다.

td = TensileData('carbon steel',1,...
      [2e4 4e4 6e4 8e4],...
      [.12 .20 .31 .40]);
td.Modulus
ans =
  1.9005e+005

Modulus 속성의 Set 메서드

Dependent 속성의 값을 설정하려면 클래스가 속성의 set 메서드를 구현해야 합니다. Modulus 속성의 명시적 설정을 허용할 필요는 없습니다. 하지만 set 메서드를 사용하면 사용자 지정 오류 메시지를 제공할 수 있습니다. Modulus set 메서드는 현재 속성값을 참조한 후 오류를 반환합니다.

methods
   function obj = set.Modulus(obj,~)
      fprintf('%s%d\n','Modulus is: ',obj.Modulus)
      error('You cannot set the Modulus property');
   end
end

TensileData 객체 표시하기

TensileData 클래스는 disp 메서드를 오버로드합니다. 이 메서드는 명령 창에서의 객체 표시를 제어합니다.

disp 메서드는 Material, SampleNumber, Modulus 속성의 값을 표시합니다. Stress 속성 데이터와 Strain 속성 데이터는 표시하지 않습니다. 이들 속성에는 명령 창에서는 쉽게 검토할 수 없는 원시 데이터가 포함되어 있습니다.

disp 메서드는 fprintf를 사용하여 서식 지정된 텍스트를 명령 창에 표시합니다.

methods
   function disp(td)
      fprintf(1,...
         'Material: %s\nSample Number: %g\nModulus: %1.5g\n',...
         td.Material,td.SampleNumber,td.Modulus);
   end 
end

압력 대비 응력을 플로팅하는 메서드

이 메서드는 응력/압력 데이터의 그래프를 살펴보고 가해진 장력 범위에 대한 재료의 반응을 파악하는 데 유용합니다. TensileData 클래스는 MATLAB plot 함수를 오버로드합니다.

plot 메서드는 압력에 대한 응력 데이터의 선형 그래프를 생성하고 제목과 축 레이블을 추가하여 인장 데이터 레코드에 대한 표준화된 그래프를 생성합니다.

methods
   function plot(td,varargin)
      plot(td.Strain,td.Stress,varargin{:})
      title(['Stress/Strain plot for Sample',...
         num2str(td.SampleNumber)])
      ylabel('Stress (psi)')
      xlabel('Strain %')
   end 
end

이 메서드에 대한 첫 번째 인수는 데이터를 포함하는 TensileData 객체입니다.

이 메서드는 가변적인 인수 목록(varargin)을 내장 plot 함수에 직접 전달합니다. TensileData plot 메서드를 사용하면 선 지정자 인수 또는 속성 이름-값 쌍을 전달할 수 있습니다.

예를 들면 다음과 같습니다.

td = TensileData('carbon steel',1,...
      [2e4 4e4 6e4 8e4],[.12 .20 .31 .40]);
plot(td,'-+b','LineWidth',2)

TensileData 클래스 개요

예제 코드설명
classdef TensileData

값 클래스는 객체의 독립적인 복사본을 지원합니다. 자세한 내용은 핸들 클래스와 값 클래스 비교 항목을 참조하십시오.

   properties
      Material
      SampleNumber
      Stress
      Strain
   end

데이터의 구조 항목을 참조하십시오.

   properties (Dependent)
      Modulus
   end 

쿼리 요청이 있으면 Modulus를 계산합니다. 이 코드에 대한 자세한 내용은 요청 시 데이터 계산하기 항목을 참조하십시오.

일반적인 정보는 종속 속성에 대한 set 메서드 및 get 메서드 항목을 참조하십시오.

   methods

메서드에 대한 일반적인 정보는 Ordinary Methods 항목을 참조하십시오.

   function td = TensileData(material,samplenum,...
      stress,strain)
      if nargin > 0
         td.Material = material;
         td.SampleNumber = samplenum;
         td.Stress = stress;
         td.Strain = strain;
      end
   end

이 코드에 대한 자세한 내용은 생성자를 사용하여 인터페이스 단순화하기 항목을 참조하십시오.

생성자에 대한 일반적인 정보는 클래스 생성자 메서드 항목을 참조하십시오.

   function obj = set.Material(obj,material)
      if (strcmpi(material,'aluminum') ||...
         strcmpi(material,'stainless steel') ||...
         strcmpi(material,'carbon steel'))
         obj.Material = material;
      else
         error('Invalid Material')
      end
   end

Material 속성에 대한 가능한 값을 제한합니다.

이 코드에 대한 자세한 내용은 속성을 특정 값으로 제한하기 항목을 참조하십시오.

속성의 set 메서드에 대한 일반적인 정보는 속성 set 메서드 항목을 참조하십시오.

   function m = get.Modulus(obj)
      ind = find(obj.Strain > 0); 
      m = mean(obj.Stress(ind)./obj.Strain(ind)); 
   end 

쿼리 요청이 있으면 Modulus 속성을 계산합니다.

이 코드에 대한 자세한 내용은 Modulus 속성의 get 메서드 항목을 참조하십시오.

속성의 get 메서드에 대한 일반적인 정보는 속성 get 메서드 항목을 참조하십시오.

   function obj = set.Modulus(obj,~)
      fprintf('%s%d\n','Modulus is: ',obj.Modulus)
      error('You cannot set Modulus property'); 
   end 

Dependent Modulus 속성에 대한 set 메서드를 추가합니다. 이 코드에 대한 자세한 내용은 Modulus 속성의 Set 메서드 항목을 참조하십시오.

속성의 set 메서드에 대한 일반적인 정보는 속성 set 메서드 항목을 참조하십시오.

   function disp(td)
      fprintf(1,'Material: %s\nSample Number: %g\nModulus: %1.5g\n',...
      td.Material,td.SampleNumber,td.Modulus)
   end 

특정 속성을 표시하도록 disp 메서드를 오버로드합니다.

이 코드에 대한 자세한 내용은 TensileData 객체 표시하기 항목을 참조하십시오.

disp 오버로드에 대한 일반적인 정보는 Overloading the disp Function 항목을 참조하십시오.

   function plot(td,varargin)
      plot(td.Strain,td.Stress,varargin{:})
      title(['Stress/Strain plot for Sample',...
         num2str(td.SampleNumber)])
      ylabel('Stress (psi)')
      xlabel('Strain %')
   end 

TensileData 객체를 받도록 plot 함수를 오버로드하고 압력에 대한 응력을 그래프로 표시합니다.

압력 대비 응력을 플로팅하는 메서드

   end
end

methodsclassdefend 문입니다.

 확장하여 클래스 코드 보기

관련 항목