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

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

경로에 있는 클래스 정의

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

클래스 폴더 및 경로 폴더

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

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

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

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

경로 폴더 사용하기

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

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

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

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

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

addpath path_folder

클래스 폴더 사용하기

클래스 폴더 이름은 항상 @ 문자로 시작하고, 그 뒤에 폴더 이름으로 클래스 이름이 옵니다. 클래스 폴더는 반드시 경로 폴더에 포함되어야 할 뿐, 이 클래스 폴더가 MATLAB 경로에 있지는 않습니다. 클래스 폴더 내에 클래스 정의 파일을 둡니다. 이 폴더는 별도의 메서드 파일들을 포함할 수도 있습니다. 클래스 정의 파일은 클래스 폴더와 동일한 이름(@ 문자는 제외)을 가져야 합니다. 클래스 정의(classdef 키워드로 시작됨)는 파일에서 다른 코드보다 앞에 나와야 합니다(공백 및 주석은 코드를 구성하지 않음).

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

폴더당 하나의 클래스만 정의해야 합니다. 모든 파일은 확장자가 .m이어야 합니다.

클래스 정의를 위해 둘 이상의 파일을 사용하려면 클래스 폴더를 사용하십시오. MATLAB은 클래스 폴더에 있는 .m 파일을 클래스의 메서드로 취급합니다. 클래스 파일은 MATLAB이 폴더에 있는 파일을 해당 클래스의 메서드로 명시적으로 식별할 수 있는 이점을 제공합니다. 자세한 내용은 경로를 변경하여 클래스 정의 업데이트하기 항목을 참조하십시오.

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

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

프라이빗 폴더에 포함된 함수는 private 폴더 바로 위에 있는 폴더에 정의된 함수에서만 액세스할 수 있습니다. 클래스 폴더 내 private 폴더에 정의된 함수는 private 액세스를 가지는 클래스 메서드가 됩니다.

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

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

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

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

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

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

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

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

클래스 우선 순위 및 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/Foo.m이 경로에서 fldr3/@Foo 앞에 있습니다.

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

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

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

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

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

  • fldr2/Foo.m이 경로에서 fldr5/Foo.m 클래스 앞에 옵니다.

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

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

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

  • 메서드 barfldr3/@Foo에 정의된 Foo 클래스의 일부로 인식되지 않습니다.

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

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

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

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

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

MATLAB 경로를 변경하여 클래스에 대한 클래스 정의 파일을 바꿀 수 있습니다(path 참조). 하지만 경로 폴더에 정의된 클래스(즉, 클래스 @ 폴더에 없음)의 경우 MATLAB이 새 폴더를 현재 클래스 정의로 인식하기 전에 사용자가 클래스를 지워 주어야 합니다.

클래스 폴더 내 클래스 정의

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

fldA/+FooPkg/@Foo/Foo.m
fldB/+FooPkg/@Foo/Foo.m

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

addpath fldA

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

a = FooPkg.Foo;

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

cd fldB

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

b = FooPkg.Foo;

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

경로 폴더 내 클래스 정의

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

fldA/+FooPkg/Foo.m
fldB/+FooPkg/Foo.m

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

addpath fldA

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

a = FooPkg.Foo;

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

cd fldB

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

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

clear FooPkg.Foo

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

관련 항목