Main Content

코드 제안 및 코드 완성 사용자 지정하기

함수 및 클래스에 맞게 코드 제안 및 코드 완성을 사용자 지정하려면 MATLAB®에 함수 시그니처에 관한 정보를 제공하십시오. 함수 시그니처는 함수에서 허용 가능한 구문과 데이터형을 설명합니다. MATLAB은 이 정보를 사용하여 편집기, 라이브 편집기, 명령 창에서 코드 제안 및 코드 완성을 표시합니다. JSON 형식 파일 functionSignatures.json에서 이 함수 정보를 정의합니다. MATLAB은 arguments 블록을 가진 함수에 대해 arguments 블록에 포함된 정보를 바탕으로 코드 완성 및 제안을 제공할 수 있습니다. 이 정보는 functionSignatures.json 파일이 없어도 사용할 수 있습니다. MATLAB Online에서는 코드 제안 및 코드 완성이 지원되지 않습니다.

MATLAB에서 함수 시그니처 정보를 감지할 수 있도록 하려면 함수 코드가 포함된 폴더 안에 있는 resources 폴더에 functionSignatures.json을 넣어야 합니다. 클래스 메서드 또는 네임스페이스 함수에 대한 정보를 정의하는 경우 가장 바깥쪽 클래스 또는 네임스페이스 폴더의 부모 폴더 안에 있는 resources 폴더에 functionSignatures.json을 넣어야 합니다. 예를 들어, myClass의 메서드에 대한 정보를 정의하려면 다음 클래스 및 네임스페이스 구조체의 myFolder 안에 있는 resources 폴더에 functionSignatures.json을 넣으십시오.

  myFolder/+myNamespace/@myClass
  myFolder/+myNamespace/+mySubnamespace/@myClass

클래스 또는 네임스페이스 폴더 바깥에 있는 클래스의 경우 클래스 코드가 포함된 폴더 안에 있는 resources 폴더에 functionSignatures.json을 넣으십시오. 동일한 파일에서 여러 함수에 대한 시그니처를 정의할 수 있습니다.

functionSignatures.json 파일에는 단일 JSON 객체가 포함됩니다. JSON은 중괄호를 사용하여 객체를 정의하고 객체를 이름-값 쌍 모음으로 참조합니다. 이러한 JSON term은 함수 시그니처 컨텍스트에서 오버로드되기 때문에 "이름" 대신 "속성"이 사용됩니다. functionSignatures.json의 JSON 객체에는 체계 버전(선택 사항)과 함수 객체 목록이 포함됩니다. 각 함수 객체는 시그니처 객체 목록을 포함하며 각 시그니처 객체는 인수 객체로 구성된 배열을 포함합니다. JSON은 대괄호를 사용하여 배열을 정의합니다.

Example functionSignatures.json file showing the function object property "functionName1" with one signature object property "inputs". The "inputs" signature object property has three argument objects named "A", "dim", and "nanflag".

체계 버전(선택 사항)을 지정하려면 _schemaVersion을 첫 번째 속성, 버전 번호를 이 속성의 값으로 사용하십시오. 버전 번호는 major#.minor#.patch# 형식의 JSON 문자열로 지정합니다. 여기에서 각 숫자는 음이 아닌 정수로 지정합니다. 현재 체계 버전은 1.0.0입니다. 파일에 체계 버전이 지정되어 있지 않은 경우, MATLAB은 버전을 1.0.0으로 가정합니다.

functionSignatures.json에 구문 오류가 있으면 MATLAB은 파일을 읽을 때 명령 창에 오류 메시지를 표시합니다. validateFunctionSignaturesJSON 함수를 사용하여 JSON 체계와 MATLAB 함수 시그니처 체계에 대해 functionSignatures.json 파일의 유효성을 검사합니다.

함수 객체

함수에 대한 정보를 정의하려면 함수 이름과 동일한 속성을 만드십시오. 속성값은 시그니처 객체입니다.

{
  "functionName1": { signatureObj1 },
  "functionName2": { signatureObj2 }
}

클래스 생성자, 클래스 메서드 또는 네임스페이스 함수에 대한 정보를 정의하려면 함수나 메서드의 전체 이름을 사용하십시오. 예를 들어, 클래스 생성자, 클래스 메서드 myMethod 및 네임스페이스 함수 myFunction을 정의해 봅니다.

{
  "myClass.myClass": { signatureObj },
  "myClass.myMethod": { signatureObj },
  "myNamespace.myFunction": { signatureObj }
}

동일한 속성(함수 이름 또는 메서드 이름)으로 여러 개의 함수 객체를 정의하면 동일한 함수 또는 메서드에 대해 여러 함수 시그니처를 정의할 수 있습니다. 자세한 내용은 여러 개의 시그니처 항목을 참조하십시오.

시그니처 객체

시그니처 객체는 함수의 입력 인수, 출력 인수, 지원되는 플랫폼을 정의합니다. platforms 속성을 제외한 각 속성의 값은 인수 객체로 구성된 배열입니다.

{
  "functionName1":
  {
     "inputs": [ argumentObj1, argumentObj2 ]
  }
}

JSON 파일에 myClass.myMethod와 같은 인스턴스 메서드를 지정하는 경우 inputs에 있는 요소 중 하나가 myClass의 객체여야 합니다. 일반적으로, 이 객체는 첫 번째 요소입니다. MATLAB에서는 점 표기법(b = myObj.myMethod(a)) 또는 함수 표기법(b = myMethod(myObj,a)) 구문을 사용하여 지정된 메서드를 호출할 때 이 메서드에 대한 코드 제안 및 코드 완성을 지원합니다.

JSON 파일의 각 시그니처에는 다음 속성이 포함될 수 있습니다.

속성설명값의 JSON 데이터형
inputs

함수 입력 인수 목록입니다. MATLAB은 코드 제안 및 코드 완성에 이 속성을 사용합니다.

인수 객체로 구성된 배열

outputs

함수 출력 인수 목록입니다. MATLAB은 더욱 정교한 코드 제안 및 코드 완성을 위해 이 속성을 사용합니다.

인수 객체로 구성된 배열

platforms

함수를 지원하는 플랫폼 목록입니다. 플랫폼이 함수를 지원하지 않는 경우, MATLAB은 사용자 지정 코드 제안 및 코드 완성을 제공하지 않습니다.

디폴트 값은 모든 플랫폼입니다. 목록의 요소는 computer 함수에서 반환된 archstr과 일치해야 합니다. 목록은 포괄적 또는 배타적일 수 있으나, 동시에 둘 다 될 수는 없습니다. 예제 값은 "win64,maci64" 또는 "-win64,-maci64"입니다.

쉼표로 구분된 값으로 구성된 문자열

인수 객체

인수 객체는 각 입력 인수와 출력 인수에 대한 정보를 정의합니다.

{
  "functionName1":
  {
     "inputs":
     [
        {"name":"in1",  "kind":"required", "type":["numeric"]},
        {"name":"in2",  "kind":"required", "type":["numeric","integer","scalar"]}
     ]
  }
}

JSON 파일에 입력값이 표시되는 순서는 중요합니다. 예를 들어, functionName1 함수를 호출할 때 in1in2 앞에 표시되어야 합니다.

각 인수 객체에는 다음 속성이 포함될 수 있습니다.

 name – 인수의 이름

 kind – 인수의 유형

 type – 인수의 클래스 및/또는 특성

 repeating – 여러 번 인수 지정

 purpose – 인수 설명

더 복잡한 함수 시그니처의 경우, 각 인수 객체에 다음 속성을 사용할 수 있습니다.

 platforms – 지원 플랫폼 목록

 tuple – 인수 세트 정의

 mutuallyExclusiveGroup – 배타적 인수 세트의 정의

함수 시그니처 파일 생성하기

이 예제에서는 함수에 맞게 사용자 지정 코드 제안 및 코드 완성을 만드는 방법에 대해 설명합니다.

나중 단계에 JSON 파일에서 시그니처를 설명할 함수를 만듭니다. 예제 함수는 다음 인수를 허용합니다.

  • 필수 인수 2개

  • varargin을 통해 선택적 positional 인수 1개

  • varargin을 통해 선택적 이름-값 인수 2개

myFunc는 코드 제안을 보여주기 위한 함수이고 인수 검사는 하지 않습니다.

% myFunc  Example function
% This function is called with any of these syntaxes:
%
%   myFunc(in1, in2) accepts 2 required arguments. 
%   myFunc(in1, in2, in3) also accepts an optional 3rd argument. 
%   myFunc(___, NAME, VALUE) accepts one or more of the following name-value 
%       arguments. This syntax can be used in any of the previous syntaxes.
%           * 'NAME1' with logical value
%           * 'NAME2' with 'Default', 'Choice1', or 'Choice2'
function myFunc(reqA,reqB,varargin)
    % Initialize default values
    NV1 = true;
    NV2 = 'Default';
    posA = [];
    
    if nargin > 3
        if rem(nargin,2)
            posA = varargin{1};
            V = varargin(2:end);
        else
            V = varargin;
        end
        for n = 1:2:size(V,2)
            switch V{n}
                case 'Name1'
                    NV1 = V{n+1};
                case 'Name2'
                    NV2 = V{n+1}
                otherwise
                    error('Error.')
            end
        end
    end
end

myFunc와 동일한 폴더 안에 있는 resources 폴더에서 파일 functionSignatures.json에 다음 함수 시그니처 설명을 만듭니다. 입력 이름이 myFunc 본문의 이름과 일치하지 않지만 도움말 텍스트와는 일치합니다.

{
  "_schemaVersion": "1.0.0",
  "myFunc":
  {
     "inputs":
     [
        {"name":"in1", "kind":"required", "type":["numeric"], "purpose":"ID of item"},
        {"name":"in2", "kind":"required", "type":["numeric"], "purpose":"# Items"},
        {"name":"in3", "kind":"ordered", "type":["numeric"], "purpose":"Input Value"},
        {"name":"Name1", "kind":"namevalue", "type":["logical","scalar"],"purpose":"Option"},
        {"name":"Name2", "kind":"namevalue", "type":["char", "choices={'Default','Choice1','Choice2'}"]}
     ]
  }
}

MATLAB은 이 함수 시그니처 설명을 사용하여 코드 제안 및 코드 완성에 대한 정보를 제공합니다.

함수 시그니처 정보의 사용 방법

MATLAB은 사용자가 입력할 때 JSON 파일에 있는 함수 시그니처 정보를 사용하여 입력과 일치하는 구문을 표시합니다. Tab 키를 눌러 부분적으로 입력한 텍스트를 완성할 수도 있습니다. 명령 창에서는 MATLAB이 사용자가 입력할 때 JSON 파일을 사용하여 입력과 일치하는 구문을 표시하지 않습니다.

스크립트 또는 라이브 스크립트에서 코드 제안을 시험하려면 먼저 myFunc를 호출해 보십시오. JSON 파일에서 작성한 이름과 용도가 표시됩니다. 그러면 MATLAB은 인수가 언제 선택적 인수가 되는지, 또 여러 건의 제안이 있는지 알려줍니다(예: 세 번째 positional 인수 또는 이름-값 인수). 이름-값 인수 옵션이 나열됩니다.

Three calls to the myFunc function showing examples of different code suggestions. The first suggestion shows the purpose of the in1 argument, the second suggestion shows the purpose of the in3 argument with the word Optional in parentheses, and the third suggestion shows a list of supported name-value arguments for the options argument.

함수 호출에 이름-값 인수를 추가하면 MATLAB은 JSON 파일에 있는 선택 사항을 제시합니다. 'Name1'이 논리형 스칼라로 정의되어 있기 때문에 MATLAB은 선택 사항(true 또는 false)을 자동으로 채웁니다. MATLAB은 JSON 파일에서 'Name2' 인수 값으로 3개를 취합니다.

Two calls to the myFunc function showing examples of different name-value argument value suggestions. The first suggestion shows true and false as the supported values for the Name1 name-value argument. The second suggestion shows 'Choice1', 'Choice2', and 'Default' as the supported values for the Name2 name-value argument.

여러 개의 시그니처

함수에 여러 구문이 있으면 코드 제안에서 함수 구현에 상관없이 구문을 여러 개의 함수 시그니처로 그룹화하는 것이 유용할 수 있습니다. 여러 개의 시그니처에 코드 제안 및 코드 완성을 제공하려면 JSON 파일에 속성이 동일한 함수 객체를 여러 개 만드십시오.

두 번째 입력값의 클래스에 따라 서로 다른 코드 경로를 따르는 다음 함수를 생각해 보겠습니다. 이 함수는 코드 제안을 위한 예제이므로 계산이므로 오류 검사는 수행하지 않습니다.

function anotherFunc(arg1,arg2,arg3)
    switch class(arg2)
        case 'double'
            % Follow code path 1
        case {'char','string'}
            % Follow code path 2
        otherwise
            error('Invalid syntax.')
    end
end

코드 제안의 관점에서 이 함수에 2개의 함수 시그니처가 있는 경우를 고려해 보겠습니다. 첫 번째 시그니처는 2개의 필수 숫자형 값을 허용합니다. 두 번째 시그니처는 필수 숫자형을 허용하며 그다음에 문자형 또는 string형, 마지막에 필수 숫자형이 옵니다. 여러 개의 함수 시그니처를 정의하려면 JSON 파일에 속성(함수 이름)이 동일한 함수 객체를 여러 개 정의하십시오.

{
  "_schemaVersion": "1.0.0",
  "anotherFunc":
  {
     "inputs":
     [
        {"name":"input1",  "kind":"required", "type":["numeric"]},
        {"name":"input2",  "kind":"required", "type":["numeric"]}
     ]
  },
  "anotherFunc":
  {
     "inputs":
     [
        {"name":"input1",  "kind":"required", "type":["numeric"]},
        {"name":"input2",  "kind":"required", "type":[["char"],["string"]]},
        {"name":"input3",  "kind":"required", "type":["numeric"]}
     ]
  }
}

또는 인수 객체의 mutuallyExclusiveGroup 속성을 사용하여 여러 개의 함수 시그니처를 정의할 수 있습니다. 일반적으로 여러 개의 함수 객체를 구현하는 것이 훨씬 간편하고 읽기 쉽지만, 상호 배타적인 그룹을 사용하면 input1 같은 일반적인 인수 객체를 재사용할 수 있습니다.

{
  "_schemaVersion": "1.0.0",
  "anotherFunc":
  {
     "inputs":
     [
        {"name":"input1",  "kind":"required", "type":["numeric"]},
        {"mutuallyExclusiveGroup":
          [
            [
              {"name":"input2",  "kind":"required", "type":["numeric"]}
            ],
            [
              {"name":"input2",  "kind":"required", "type":[["char"],["string"]]},
              {"name":"input3",  "kind":"required", "type":["numeric"]}
            ]
           ]
        }
     ]
  }
}

참고 항목

관련 항목

외부 웹사이트