Main Content

열거형 클래스 정의하기

열거형 클래스

enumeration 블록을 클래스 정의에 추가하여 열거형 클래스를 생성할 수 있습니다. 예를 들어, WeekDays 클래스는 요일 집합을 열거합니다.

classdef WeekDays
   enumeration
      Monday, Tuesday, Wednesday, Thursday, Friday
   end
end

다음 섹션에서 MATLAB® 코드를 실행할 수 있도록 WeekDays 클래스 정의를 경로에 있는 .m 파일에 배치하십시오.

열거형 멤버 생성하기

클래스 이름과 멤버 이름을 사용하여 열거형 멤버를 참조합니다.

ClassName.MemberName

예를 들어, 열거형 멤버 WeekDays.Tuesday를 변수 today에 할당합니다.

today = WeekDays.Tuesday;

todayWeekDays 클래스의 변수입니다.

whos
  Name       Size            Bytes  Class       Attributes

  today      1x1               104  WeekDays              
today
today = 

    Tuesday

슈퍼클래스 값으로 변환하기

열거형 클래스가 슈퍼클래스를 지정하는 경우 열거형 객체를 슈퍼클래스 생성자에 전달하여 슈퍼클래스로 변환할 수 있습니다. 이때 슈퍼클래스 생성자는 자기 자신의 클래스를 입력값으로 받고 슈퍼클래스의 인스턴스를 반환할 수 있어야 합니다. MATLAB에 내장된 숫자형 클래스(예: uint32)는 이러한 변환을 허용합니다.

예를 들어, Bearing 클래스가 uint32 내장 클래스에서 파생된다고 가정하겠습니다.

classdef Bearing < uint32
   enumeration
      North (0)
      East  (90)
      South (180)
      West  (270)
   end
end

Bearing.East 멤버를 변수 a에 할당합니다.

a = Bearing.East;

a를 슈퍼클래스 생성자에 전달하고 uint32형 값을 반환합니다.

b = uint32(a);
whos
  Name      Size            Bytes  Class      Attributes

  a         1x1                 4  Bearing              
  b         1x1                 4  uint32               

uint32 생성자는 서브클래스 Bearing의 객체를 받아 uint32형 클래스의 객체를 반환합니다.

열거형 클래스에 메서드 정의하기

여느 MATLAB 클래스와 마찬가지로 열거형 클래스에 메서드를 정의할 수 있습니다. 예를 들어, WeekDays 열거형 클래스에 대해 isMeetingDay라는 메서드를 정의해 보겠습니다. 사용 사례는 사용자에게 화요일마다 반복되는 회의가 있는 경우입니다. 이 메서드는 입력 인수가 WeekDays 멤버 Tuesday의 인스턴스인지 확인합니다.

classdef WeekDays
   enumeration
      Monday, Tuesday, Wednesday, Thursday, Friday
   end
   methods
      function tf = isMeetingDay(obj)
         tf = WeekDays.Tuesday == obj;
      end
   end
end

WeekDays 클래스의 인스턴스를 사용하여 isMeetingDay를 호출합니다.

today = WeekDays.Tuesday;
today.isMeetingDay
ans =

     1

메서드에 열거형 멤버를 직접 입력값으로 사용할 수도 있습니다.

isMeetingDay(WeekDays.Wednesday)
ans =

     0

열거형 클래스에 속성 정의하기

열거형 멤버와 관련된 데이터를 저장해야 하는 경우 열거형 클래스에 속성을 추가합니다. 클래스 생성자에 속성값을 설정합니다. 예를 들어, SyntaxColors 클래스는 세 개의 속성을 정의합니다. 클래스 생성자는 클래스 멤버를 참조할 때 입력 인수의 값을 대응하는 속성에 할당합니다.

classdef SyntaxColors
   properties
      R
      G
      B
   end
   methods
      function c = SyntaxColors(r, g, b)
         c.R = r; c.G = g; c.B = b;
      end
   end
   enumeration
      Error   (1, 0, 0)
      Comment (0, 1, 0)
      Keyword (0, 0, 1)
      String  (1, 0, 1)
   end
end

열거형 멤버를 참조하면 생성자가 속성값을 초기화합니다.

e = SyntaxColors.Error;
e.R
ans =

     1

SyntaxColors가 값 클래스(handle에서 파생되지 않음)이기 때문에 클래스 생성자만 속성값을 설정할 수 있습니다.

e.R = 0
You cannot set the read-only property 'R' of SyntaxColors.

속성을 정의하는 열거형 클래스에 대한 자세한 내용은 Mutable Handle vs. Immutable Value Enumeration Members 항목을 참조하십시오.

시퀀스를 호출하는 열거형 클래스 생성자

enumeration 블록의 각 명령문은 열거형 멤버의 이름이며, 선택적으로 인수 목록이 그 다음에 올 수 있습니다. 열거형 클래스가 생성자를 정의하는 경우 MATLAB이 생성자를 호출하여 열거형 인스턴스를 생성합니다.

MATLAB은 생성자를 명시적으로 정의하지 않는 모든 열거형 클래스에 대해 디폴트 생성자를 제공합니다. 디폴트 생성자는 다음과 같이 열거형 클래스의 인스턴스를 생성합니다.

  • 열거형 멤버가 입력 인수를 정의하지 않는 경우 입력 인수를 사용하지 않음

  • 입력 인수가 해당 멤버에 대한 열거형 클래스에 정의된 경우 입력 인수를 사용함

예를 들어, Bool 클래스에 대한 입력 인수는 Bool.No의 경우 0이고, Bool.Yes의 경우 1입니다.

classdef Bool < logical
   enumeration
      No  (0)
      Yes (1)
   end
end

디폴트 생성자가 첫 번째 슈퍼클래스에 인수를 전달하기 때문에 01 값은 logical 클래스입니다. 즉, 다음 명령문을 실행하면

n = Bool.No;

logical이 호출되며, 이는 생성자의 다음 명령문과 일치합니다.

function obj = Bool(val)
   obj@logical(val)
end

MATLAB은 첫 번째 슈퍼클래스에만 멤버 인수를 전달합니다. 예를 들어, 다른 클래스에서 파생된 Bool이 있다고 가정하겠습니다.

classdef Bool < logical & MyBool
   enumeration
      No  (0)
      Yes (1)
   end
end

MyBool 클래스는 특화된 동작을 추가할 수 있습니다.

classdef MyBool
   methods
      function boolValues = testBools(obj)
         ...
      end
   end
end

디폴트 Bool 생성자는 아래 함수와 같이 정의된 것처럼 동작합니다.

  • 첫 번째 슈퍼클래스 생성자에 인수가 전달됨

  • 그다음 생성자에 인수가 전달되지 않음

function obj = Bool(val)
   obj@logical(val) 
   obj@MyBool       
end

관련 항목