Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

클래스 정의를 포함하는 폴더

경로에 있는 클래스 정의

클래스 메서드를 호출하려면 다음 섹션에서 설명하는 것처럼 클래스 정의가 MATLAB® 경로에 있어야 합니다.

클래스 폴더 및 경로 폴더

클래스 정의 파일을 포함할 수 있는 폴더는 두 가지 유형이 있습니다.

  • 경로 폴더 — 폴더가 MATLAB 경로에 있고 폴더 이름은 @ 문자로 시작하지 않습니다. 하나의 폴더 내에 여러 클래스와 함수를 둘 때는 이 유형의 폴더를 사용하십시오. 전체 클래스 정의가 하나의 파일에 포함되어 있어야 합니다.

  • 클래스 폴더 — 폴더 이름이 @ 문자로 시작하고, 그 뒤에 클래스 이름이 옵니다. 이 폴더는 MATLAB 경로에 없지만 이 폴더의 부모 폴더는 경로에 있습니다. 하나의 클래스 정의를 위해 여러 파일을 사용할 때는 이 유형의 폴더를 사용하십시오.

MATLAB 경로에 대한 자세한 내용은 path 함수를 참조하십시오.

경로 폴더 사용하기

클래스 정의 파일을 포함하는 폴더는 MATLAB 경로에 있습니다. 따라서, 이 경로 폴더에 있는 클래스 정의는 우선 순위와 관련하여 일반 함수처럼 동작합니다. 즉, MATLAB 경로에서 첫 번째로 나타나는 이름이 이후에 나타나는 모든 동일한 이름보다 우선합니다.

각 클래스 정의 파일의 이름은 classdef 키워드에 지정된 클래스의 이름과 일치해야 합니다. 경로 폴더를 사용하면 각 클래스에 대해 개별 클래스 폴더를 생성할 필요가 없습니다. 하지만 모든 메서드를 포함한 전체 클래스 정의가 단일 파일 내에 포함되어 있어야 합니다.

세 개의 클래스가 단일 폴더에 정의되어 있다고 가정하겠습니다.

.../path_folder/MyClass1.m
.../path_folder/MyClass2.m
.../path_folder/MyClass3.m

이러한 클래스를 사용하려면 path_folder를 MATLAB 경로에 추가하십시오.

addpath path_folder

클래스 폴더 사용하기

클래스 폴더 이름은 항상 @ 문자로 시작하고, 그 뒤에 폴더 이름으로 클래스 이름이 옵니다. 클래스 폴더는 반드시 경로 폴더에 포함되어야 할 뿐, 이 클래스 폴더가 MATLAB 경로에 있지는 않습니다. 클래스 폴더 내에 클래스 정의 파일을 둡니다. 이 폴더는 별도의 메서드 파일들을 포함할 수도 있습니다. 클래스 정의 파일은 클래스 폴더와 동일한 이름(@ 문자는 제외)을 가져야 합니다.

.../parent_folder/@MyClass/MyClass.m
.../parent_folder/@MyClass/myMethod1.m
.../parent_folder/@MyClass/myMethod2.m

폴더당 하나의 클래스만 정의해야 합니다. 모든 파일은 .m 또는 .p 확장자를 가집니다. MATLAB 버전 R2018a 이상에서는 독립 실행형 메서드가 .mlx 확장자를 갖는 라이브 함수가 될 수 있습니다.

클래스 정의를 위해 둘 이상의 파일을 사용하려면 클래스 폴더를 사용하십시오. MATLAB은 클래스 폴더에 있는 함수 파일을 클래스의 메서드로 취급합니다. 함수 파일은 MATLAB 코드(.m), 라이브 코드 파일 형식(.mlx), MEX 함수(플랫폼별 확장자) 및 P 코드 파일(.p)일 수 있습니다.

MATLAB은 클래스 폴더에 있는 파일을 해당 클래스의 메서드로 명시적으로 식별합니다. 이를 통해 클래스의 메서드를 작성하는 데 더 모듈화된 접근 방식을 사용할 수 있습니다.

각 파일의 기본 이름은 유효한 MATLAB 함수 이름이어야 합니다. 유효한 함수 이름은 영문자로 시작하고 영문자, 숫자 또는 밑줄을 포함할 수 있습니다. 자세한 내용은 개별 파일 내 메서드 항목을 참조하십시오.

클래스 폴더 내 프라이빗 폴더에 포함된 함수

프라이빗 폴더에 포함된 함수는 private 폴더 바로 위에 있는 폴더에 정의된 함수에서만 액세스할 수 있습니다. 클래스 폴더 내 private 폴더에 정의된 함수는 클래스 메서드에서만 호출할 수 있습니다. 함수는 클래스의 프라이빗 멤버에 액세스할 수 있지만 그 자체가 메서드는 아닙니다. 함수는 입력값으로 전달될 객체가 필요하지 않고 함수 표기법을 사용해서만 호출될 수 있습니다. 클래스의 여러 메서드에서 호출할 수 있는 헬퍼 함수가 필요하면 private 폴더의 함수를 사용하십시오.

클래스 폴더가 private 폴더를 포함하는 경우 이 클래스 폴더에 정의된 클래스만 private 폴더에 정의된 함수에 액세스할 수 있습니다. 서브클래스는 슈퍼클래스 프라이빗 함수에 액세스할 수 없습니다. 프라이빗 폴더에 대한 자세한 내용은 프라이빗 함수 항목을 참조하십시오.

서브클래스가 슈퍼클래스의 프라이빗 함수에 액세스할 수 있도록 하려면 함수를 슈퍼클래스의 보호 메서드로 정의하십시오. Access 특성을 protected로 설정하여 메서드를 지정하십시오.

프라이빗 폴더의 메서드에 디스패치하기

클래스가 클래스 폴더 내의 private 폴더에 함수를 정의한 경우 MATLAB은 다음과 같은 우선 순위 규칙에 따라 프라이빗 함수와 classdef 파일의 메서드 중 우선하는 쪽에 디스패치합니다.

  • 점 표기법(obj.methodName)을 사용하는 경우 classdef 파일에 정의된 메서드가 private 폴더의 함수보다 우선합니다.

  • 함수 표기법(methodName(obj))을 사용하는 경우 private 폴더의 함수가 classdef 파일에 정의된 메서드보다 우선합니다.

프라이빗 폴더에 클래스 정의를 추가할 수 없음

프라이빗 폴더에는 클래스 정의(classdef 파일)를 넣을 수 없습니다. 그렇게 하면 클래스 폴더나 경로 폴더에 대한 요구 사항을 충족할 수 없습니다.

클래스 우선 순위 및 MATLAB 경로

동일한 이름을 갖는 클래스 정의가 여러 개 있는 경우 MATLAB 경로의 파일 위치에 따라 우선 순위가 결정됩니다. MATLAB 경로에서 가장 먼저 나오는 폴더에 있는 클래스 정의가 클래스 폴더에 정의가 포함되어 있는지와 무관하게 경로에서 나중에 나오는 모든 클래스보다 항상 우선합니다.

경로 폴더의 클래스와 같은 이름을 가진 함수는 함수가 경로에서 더 먼저 나오는 폴더에 포함된 경우 클래스보다 우선합니다. 하지만, 클래스 폴더(@-폴더)에 정의된 클래스는 함수가 경로에서 더 먼저 나오는 폴더에 정의되어 있더라도 같은 이름의 함수보다 우선합니다.

예를 들어, 다음과 같은 폴더와 파일을 갖는 경로가 있다고 가정하겠습니다.

경로 내 순서폴더 및 파일파일이 정의하는 항목

1

fldr1/Foo.m

Foo 클래스

2

fldr2/Foo.m

함수 Foo

3

fldr3/@Foo/Foo.m

Foo 클래스

4

fldr4/@Foo/bar.m

메서드 bar

5

fldr5/Foo.m

Foo 클래스

MATLAB은 이 논리를 적용하여 어느 버전의 Foo를 호출할지 결정합니다.

다음과 같은 이유로 fldr1/Foo.m 클래스가 fldr3/@Foo 클래스보다 우선합니다.

  • fldr1이 경로에서 fldr3 앞에 있고 fldr1/Foo.m는 클래스입니다.

다음과 같은 이유로 fldr3/@Foo 클래스가 함수 fldr2/Foo.m보다 우선합니다.

  • fldr3/@Foo가 클래스 폴더에 있는 클래스입니다.

  • fldr2/Foo.m이 클래스가 아닙니다.

  • 클래스 폴더에 있는 클래스는 함수보다 우선합니다.

다음과 같은 이유로 함수 fldr2/Foo.mfldr5/Foo.m 클래스보다 우선합니다.

  • fldr2가 경로에서 fldr5 클래스 앞에 옵니다.

  • fldr5/Foo.m이 클래스 폴더에 있지 않습니다.

  • 클래스 폴더에 정의되지 않은 클래스는 함수와 관련하여 경로 순서를 따릅니다.

다음과 같은 이유로 fldr3/@Foo 클래스가 fldr4/@Foo보다 우선합니다.

  • fldr3이 경로에서 fldr4 앞에 옵니다.

fldr3/@Foo/Foo.m이 버전 7.6 이전에 생성된 MATLAB 클래스를 포함하는 경우(즉, 클래스에 classdef 키워드를 사용하지 않은 경우) fldr4/@Foo/bar.mfldr3/@Foo에 정의된 Foo 클래스의 메서드가 됩니다.

클래스 폴더에 정의된 클래스의 이전 동작

MATLAB 버전 5~버전 7에서 클래스 폴더는 경로 폴더에 있으면서 더 뒤에 나오는 동일한 이름의 다른 클래스 폴더를 가리지 않습니다. 대신, 클래스는 동일한 이름을 갖는 모든 클래스 폴더에 있는 메서드들의 조합을 사용하여 클래스를 정의합니다. 이 동작은 더 이상 지원되지 않습니다.

이전 버전과의 호환성과 관련하여 클래스 폴더에 정의된 클래스는 동일한 이름을 갖는 함수 및 스크립트보다 언제나 우선합니다. 이러한 우선 순위는 경로에서 이러한 클래스 앞에 오는 함수 및 스크립트에 적용됩니다.

경로를 변경하여 클래스 정의 업데이트하기

MATLAB은 클래스 정의 중 하나만 현재 정의로 인식할 수 있습니다. MATLAB 경로를 변경하면 클래스에 대한 정의 파일이 바뀔 수 있습니다(path 참조). 기존 정의의 인스턴스가 존재하지 않으면(즉, 정의가 더 이상 경로에서 가장 먼저 나오지 않으면) MATLAB은 즉시 새로운 폴더를 현재 정의로 인식합니다. 그러나 경로를 변경하기 전의 기존 클래스 인스턴스가 있는 경우 MATLAB은 새로운 클래스가 정의된 방식에 따라 새 폴더의 정의를 사용할지 결정합니다. 새 정의가 클래스 폴더에 정의되어 있다면 MATLAB은 즉시 새 폴더를 현재 클래스 정의로 인식합니다. 하지만 경로 폴더에 정의된 클래스의 경우(즉, 클래스 @ 폴더에 없는 경우) 사용자가 클래스를 지워 주어야만 MATLAB이 새 폴더를 현재 클래스 정의로 인식합니다.

클래스 폴더 내 클래스 정의

fldAfldB의 두 폴더에서 Foo라는 이름의 클래스에 대해 두 가지 버전을 정의한다고 가정하겠습니다.

fldA/@Foo/Foo.m
fldB/@Foo/Foo.m

폴더 fldA를 경로의 맨 위에 추가합니다.

addpath fldA

Foo 클래스의 인스턴스를 생성합니다. MATLAB은 클래스 정의로 fldA/@Foo/Foo.m을 사용합니다.

a = Foo;

현재 폴더를 fldB로 변경합니다.

cd fldB

현재 폴더는 항상 경로의 처음에 있습니다. 따라서, MATLAB은 fldB/@Foo/Foo.mFoo 클래스의 정의로 찾아내게 됩니다.

b = Foo;

MATLAB은 fldB에 정의된 새 클래스를 사용하도록 기존 인스턴스 a를 자동으로 업데이트합니다.

경로 폴더 내 클래스 정의

두 폴더, fldAfldB에서 Foo라는 클래스의 두 가지 버전을 정의하되 클래스 폴더를 사용하지 않는다고 가정하겠습니다.

fldA/Foo.m
fldB/Foo.m

폴더 fldA를 경로의 맨 위에 추가합니다.

addpath fldA

Foo 클래스의 인스턴스를 생성합니다. MATLAB은 클래스 정의로 fldA/Foo.m을 사용합니다.

a = Foo;

현재 폴더를 fldB로 변경합니다.

cd fldB

현재 폴더는 사실상 경로의 맨 위에 있습니다. 하지만 MATLAB은 fldB/Foo.mFoo 클래스에 대한 정의로 인식하지 않습니다. MATLAB은 클래스를 지울 때까지 원래 클래스 정의를 계속 사용합니다.

foldB에 있는 Foo의 정의를 사용하려면 Foo를 지우십시오.

clear Foo

MATLAB은 fldB의 클래스 정의를 따르도록 기존 객체를 자동으로 업데이트합니다. 일반적으로 인스턴스 변수를 반드시 지울 필요는 없습니다.

관련 항목