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

패키지로 네임스페이스 생성하기

패키지 폴더

패키지는 클래스 폴더, 함수, 클래스 정의 파일 및 다른 패키지를 포함할 수 있는 특수 폴더입니다. 클래스 이름의 범위와 함수 이름의 범위는 패키지 폴더로 국한됩니다. 패키지는 일종의 네임스페이스로서, 그 안에서는 이름이 고유해야 합니다. 함수 이름과 클래스 이름은 패키지 내에서는 반드시 고유해야 합니다. 패키지를 사용하면 클래스와 함수를 체계적으로 구성할 수 있습니다. 또한, 다른 패키지에서 클래스와 함수의 이름을 다시 사용할 수도 있습니다.

참고

패키지는 MATLAB® 버전 7.6 이전에 생성된 클래스(즉, classdef를 사용하지 않는 클래스)에서 지원되지 않습니다.

패키지 폴더는 항상 + 문자로 시작합니다. 예를 들면 다음과 같습니다.

+mypack
+mypack/pkfcn.m  % a package function
+mypack/@myClass % class folder in a package

최상위 패키지 폴더의 상위(부모)는 MATLAB 경로에 있어야 합니다.

패키지 내용 나열하기

help 명령을 사용하여 패키지 내용을 나열할 수 있습니다.

help event
Contents of event:

EventData                      - event.EVENTDATA    Base class for event data 
PropertyEvent                  - event.PROPERTYEVENT    Event data for object property events
listener                       - event.LISTENER    Listener object
proplistener                   - event.PROPLISTENER    Listener object for property events

what 명령을 사용할 수도 있습니다.

what event
Classes in directory Y:xxx\matlab\toolbox\matlab\lang\+event

EventData      PropertyEvent  listener       proplistener  

내부 패키지

MathWorks®는 내부 MATLAB 코드에서 사용하는 유틸리티 함수에 대해서는 internal이라는 패키지를 사용하는 것으로 예약해 두고 있습니다. internal 패키지에 속하는 함수는 MathWorks만 사용할 수 있습니다. internal 패키지에 속하는 함수 또는 클래스를 사용하는 것은 권장되지 않습니다. 이러한 함수 및 클래스는 릴리스 간에 일관된 방식으로 작동하지 않을 수 있습니다. 이러한 함수 및 클래스는 제품 릴리스 정보에 문서화되지 않은 채 후속 릴리스의 MATLAB에서 예고 없이 제거될 수 있습니다.

패키지 내에서 패키지 멤버 참조하기

패키지를 가져오지 않을 경우 패키지 내의 패키지, 함수, 클래스에 대한 모든 참조는 패키지 이름 접두사를 사용해야 합니다. (클래스 가져오기 항목을 참조하십시오.) 예를 들어, 다음과 같은 패키지 함수를 호출하려면

+mypack/pkfcn.m

다음 구문을 사용합니다.

z = mypack.pkfcn(x,y);

정의에서는 패키지 접두사를 사용하지 않습니다. 예를 들어, pkfcn.m 함수의 함수 정의 라인은 함수 이름만 포함할 수 있습니다.

function z = pkfcn(x,y)

클래스 이름만 사용하여 패키지 클래스를 정의합니다.

classdef myClass

하지만 호출할 때는 패키지 접두사를 사용합니다.

obj = mypack.myClass(arg1,arg2,...);

다음과 같은 경우는 클래스의 객체가 있으므로 클래스 메서드를 호출할 때 패키지 이름이 필요하지 않습니다. 점 표기법이나 함수 표기법을 사용할 수 있습니다.

obj.myMethod(arg)
myMethod(obj,arg)

정적 메서드에는 패키지 이름을 포함하는 전체 클래스 이름이 필요합니다.

mypack.myClass.stMethod(arg)

패키지 외부에서 패키지 멤버 참조하기

패키지에 포함된 함수, 클래스 및 기타 패키지의 범위는 해당 패키지로 국한됩니다. 패키지 멤버를 참조하려면 멤버 이름 앞에 패키지 이름을 붙이고 점으로 구분합니다. 예를 들어, 다음 명령문은 mypack 패키지에 포함된 MyClass의 인스턴스를 생성합니다.

obj = mypack.MyClass;

클래스 멤버에 액세스하기 — 다양한 시나리오

이 섹션에서는 패키지 외부에서 다양한 패키지 멤버에 액세스하는 방법을 보여줍니다. 다음과 같은 콘텐츠를 갖는 패키지 mypack이 있다고 가정하겠습니다.

+mypack
+mypack/myfcn.m
+mypack/@MyFirstClass
+mypack/@MyFirstClass/myFcn.m
+mypack/@MyFirstClass/otherFcn.m
+mypack/@MyFirstClass/MyFirstClass.m
+mypack/@MySecondClass
+mypack/@MySecondClass/MySecondClass.m
+mypack/+mysubpack
+mypack/+mysubpack/myFcn.m

mypack에 포함된 myFcn 함수를 호출합니다.

mypack.myFcn(arg)

mypack에 포함된 각 클래스의 인스턴스를 생성합니다.

obj1 = mypack.MyFirstClass;
obj2 = mypack.MySecondClass(arg);

패키지 mysubpack에 있는 myFcn 함수를 호출합니다.

mypack.mysubpack.myFcn(arg1,arg2);

mypack.MyFirstClassmyFcn이라는 메서드가 있으면 객체에 대한 메서드 호출과 같은 방식으로 이 메서드를 호출합니다.

obj = mypack.MyFirstClass;
myFcn(obj,arg);

mypack.MyFirstClassMyProp라는 속성이 있으면 점 표기법과 객체를 사용하여 속성값을 할당합니다.

obj = mypack.MyFirstClass;
obj.MyProp = x;

패키지와 MATLAB 경로

패키지 폴더를 MATLAB 경로에 추가할 수는 없지만 패키지 상위 폴더는 MATLAB 경로에 추가해야 합니다. 심지어 패키지 폴더가 현재 폴더이더라도 패키지 상위 폴더가 MATLAB 경로에 없으면 패키지 멤버에 액세스할 수 없습니다. 패키지 폴더를 현재 폴더로 만드는 것만으로는 패키지 상위 폴더가 경로에 추가되지 않습니다.

패키지 멤버의 범위는 여전히 패키지로 국한됩니다. 항상 패키지 이름을 사용하여 패키지 멤버를 참조하십시오. 또는, 패키지 멤버를 호출하는 함수로 패키지를 가져오십시오. 클래스 가져오기 항목을 참조하십시오.

클래스가 다른 클래스를 가리는 것과는 달리, 패키지 폴더는 경로에서 자신보다 뒤에 나오는 다른 패키지 폴더를 가리지 않습니다. 둘 이상의 패키지가 동일한 이름을 가질 경우 MATLAB은 패키지 모두를 하나의 패키지로 취급합니다. 각기 다른 경로 폴더에서 중복 이름을 갖는 패키지가 동일한 함수 이름을 정의하는 경우 MATLAB은 이러한 함수 중 하나만 찾습니다.

중복 이름 해결하기

패키지와 클래스가 동일한 이름을 갖는다고 가정하겠습니다. 예를 들면 다음과 같습니다.

fldr_1/+foo
fldr_2/@foo/foo.m

which foo를 호출하면 실행 가능한 클래스 생성자에 대한 경로가 반환됩니다.

>> which foo
fldr_2/@foo/foo.m

함수와 패키지는 동일한 이름을 가질 수 있습니다. 하지만 패키지 이름 자체는 식별자가 아닙니다. 따라서, 중복 이름만 단독으로 나타나는 경우 이는 함수를 식별하는 것입니다. 패키지 이름만 실행하면 오류가 반환됩니다.

패키지 함수와 정적 메서드 비교

패키지와 클래스가 동일한 이름을 갖는 경우 정적 메서드가 패키지 함수보다 우선합니다. 예를 들어, 아래에서 경로 폴더 fldrA는 패키지 함수를 포함하고 경로 폴더 fldrB는 클래스 정적 메서드를 포함합니다.

fldrA/+foo/bar.m % bar is a function in package foo
fldrB/@foo/bar.m % bar is a static method of class foo

which foo.bar를 호출하면 정적 메서드에 대한 경로가 반환됩니다.

which foo.bar
fldrB/@foo/bar.m

동일한 경로 폴더가 동일한 이름을 갖는 패키지 폴더와 클래스 폴더를 모두 포함하는 경우 클래스 정적 메서드가 패키지 함수보다 우선합니다.

fldr/@foo/bar.m % bar is a static method of class foo
fldr/+foo/bar.m % bar is a function in package foo

which foo.bar를 호출하면 정적 메서드에 대한 경로가 반환됩니다.

which foo.bar
fldr/@foo/bar.m

관련 항목