패키지로 네임스페이스 생성하기
패키지 폴더
패키지는 클래스 폴더, 함수, 클래스 정의 파일 및 다른 패키지를 포함할 수 있는 특수 폴더입니다. 클래스 이름의 범위와 함수 이름의 범위는 패키지 폴더로 국한됩니다. 패키지는 일종의 네임스페이스로서, 그 안에서는 이름이 고유해야 합니다. 함수 이름과 클래스 이름은 패키지 내에서는 반드시 고유해야 합니다. 패키지를 사용하면 클래스와 함수를 체계적으로 구성할 수 있습니다. 또한, 다른 패키지에서 클래스와 함수의 이름을 다시 사용할 수도 있습니다.
참고
패키지는 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.MyFirstClass
에 myFcn
이라는 메서드가 있으면 객체에 대한 메서드 호출과 같은 방식으로 이 메서드를 호출합니다.
obj = mypack.MyFirstClass; myFcn(obj,arg);
mypack.MyFirstClass
에 MyProp
라는 속성이 있으면 점 표기법과 객체를 사용하여 속성값을 할당합니다.
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
fldrA\+foo\bar.m % package function
동일한 경로 폴더가 동일한 이름을 갖는 패키지 폴더와 클래스 폴더를 모두 포함하는 경우 패키지 함수가 정적 메서드보다 우선합니다.
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
경로 폴더 fldr
에 정적 메서드 bar
를 정의하는 classdef
파일 foo
가 들어 있고 동일한 폴더에 패키지 함수 bar
를 포함하는 패키지 +foo
가 들어 있는 경우
fldr/foo.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