함수

함수에는 일련의 EGL 명령문이 있습니다. 함수는 프로그램의 첫 번째 실행 코드를 포함하거나 다른 프로그램에서 호출됩니다. 함수 자체는 EGL 파트가 아닙니다. (독립형 함수는 특수한 경우입니다. 독립형 함수 함수의 내용을 참조하십시오.) 함수의 개요는 함수에 대한 소개의 내용을 참조하십시오.

함수는 다음 요소를 포함할 수 있습니다.

main()이라는 이름은 프로그램을 시작하거나 호출할 때마다 첫 번째로 실행되는 최상위 레벨 함수에서 사용되도록 예약되어 있습니다. 모든 프로그램 파트에는 매개변수 또는 리턴 유형이 없는 main() 함수가 있어야 합니다.

매개변수를 선언할 때 각 매개변수가 함수에 대한 입력으로 사용되는지(in), 함수의 출력으로 사용되는지(out) 또는 둘 다인지(inOut) 여부를 지정하십시오. 아무 것도 지정하지 않는 경우 inOut 수정자가 기본값입니다. 기타 수정자는 const, field, sqlNullable 등입니다. 자세한 정보는 이 주제의 "매개변수 수정자"를 참조하십시오.

EGL에서는 두 개의 함수에서 동일한 시그니처(함수 이름과 번호, 매개변수 유형의 조합)를 사용할 수 없습니다. 오버로드된 함수(이름은 같지만 시그니처는 다름)는 허용됩니다. 자세한 정보는 오버로드 함수의 내용을 참조하십시오.

구문

함수의 구문
functionName
이 함수에 지정한 이름입니다.
parameters
함수를 호출하는 데 사용되는 인수의 목록에 해당하는 변수 이름, 유형, 선택적 수정자(이 주제의 "매개변수 수정자" 참조)의 목록입니다. 매개변수는 쉼표로 구분되어야 합니다. 매개변수는 선택적이지만 소괄호는 필수입니다.
type
함수가 리턴하는 값을 설명하는 유형입니다. 이 유형은 호출 함수에서 리턴값을 받는 변수의 유형과 일치해야 합니다. 유형은 기본 유형, 데이터 항목, 사전 또는 레코드 중 하나입니다. 그러면 호출 함수가 변경된 레코드에 액세스할 수 있습니다.
statement
EGL 명령문입니다.

매개변수 수정자

매개변수를 선언할 때 다음 매개변수 수정자 중 하나 이상을 지정할 수 있습니다.
  • const는 입력 인수를 상수로 처리함을 표시합니다.
  • field는 매개변수에 텍스트 양식 또는 인쇄 양식 필드를 전달 중임을 표시합니다.
  • in, out, inout은 상호 배타적입니다. 이들 수정자는 매개변수가 입력, 출력 또는 둘 다에 사용되는지 여부를 표시합니다.
  • sqlNullable은 VisualAge® Generator에서 마이그레이션된 코드에서만 사용되며 인수(데이터베이스 액세스에 사용되는 것처럼)가 널일 수 있음을 표시합니다.
여러 수정자를 지정하는 경우 다음 순서로 지정하십시오.
  1. sqlNullable(const와 호환 가능하고 in이나 inout 중 하나와 호환 가능 또는 const, out이 없는 경우 사용됨)
  2. const(sqlNullable과 호환 가능하고 in 또는 inout 중 하나와 호환 가능)
  3. field(inout과 호환 가능)
  4. in, out 또는 inout
수정자에 대한 세부사항은 다음과 같습니다.
const
함수가 매개변수의 값을 변경하지 않는 경우 이 수정자를 사용하십시오. const를 사용하면 EGL 편집기에서 사용자가 값을 변경하지 못하게 하며 생성된 코드가 더 효율적인 경우가 있습니다.

기본요소이거나 동적 배열인 매개변수에 const 수정자를 사용할 수 있습니다. inout으로 수정된 매개변수에 상수를 전달하려면 항상 const를 사용하십시오.

제한사항:
  • const 수정자를 out 또는 field 수정자와 함께 사용할 수는 없지만 sqlNullable 수정자와 함께 사용할 수 있습니다.
  • 다음 함수에서는 매개변수에 const 수정자를 사용할 수 없습니다.
    • 외부 유형의 기타 함수 또는 생성자
    • 서비스 또는 원시 라이브러리에 있는 함수
  • 함수 내에서, 글로벌로 정의된 변수가 const로 수정된 함수 매개변수에 전달된 경우 글로벌로 정의된 변수를 업데이트하지 마십시오. 다음 예제에서 myParameter의 값은 글로벌로 정의된 변수의 업데이트로 인해 변경될 수도, 그렇지 않을 수도 있습니다.
    program example
       myGlobal int = 4;
       
       function main()
          myFunction (myGlobal);
       end
       function myFunction(myParameter INT const in)
    
          // print 4, twice
          sysLib.writeStdOut(myGlobal);
          sysLib.writeStdOut(myParameter);
    
          // update the global variable and print 17
          myGlobal = 17;
          sysLib.writeStdOut(myGlobal);
    
          // print the parameter value, which may be 4 or 17
          sysLib.writeStdOut(myParameter);
       endend
  • 한 함수의 매개변수가 const로 수정되고 다른 함수의 동등한 매개변수가 const로 수정되지 않는 경우 함수는 위임과 호환되지 않습니다. 예는 다음과 같습니다.
    Delegate MyDelegatePart( za int in, zb int const in ) end
    
    Function F1( xa int in, xb int const in ) end
    Function F2( xa int const in, xb int const in ) end
    Function F3( xa int in, xb int in ) end
    
    Function example()
       myDelegateVariable MyDelegatePart;
       myDelegateVariable = F1;  // OK
       myDelegateVariable = F2;  // Invalid: xa has const, za does not
       myDelegateVariable = F3;  // Invalid: zb has const, xb does not
    end
field
함수에 텍스트 양식 또는 인쇄 양식 필드를 전달할 경우 이 수정자를 사용하십시오. field 수정자를 지정할 때 blanks, cursor 또는 numeric과 같은 양식 필드 특성에 대해 매개변수를 테스트할 수 있습니다. 다음 예제와 같이 set 문에서 매개변수를 사용할 수 있습니다.
set myField red, bold;

field 수정자는 명시적으로 설명되든 기본적으로든 inout 매개변수와 함께 사용되어야 합니다. field 수정자를 const 수정자와 함께 사용할 수 없습니다.

in
매개변수가 함수의 입력으로 사용되는 경우 이 수정자를 사용하십시오. in을 지정하면 함수가 인수 값을 입력으로 받지만 호출 함수는 매개변수의 변경사항을 받지 않습니다. 현재 함수 또는 현재 함수가 호출한 함수에서 파일이나 데이터베이스에 액세스하는 레코드에 in을 지정할 수 없습니다.
제한 길이 문자열을 수정자가 in인 함수 매개변수로 지정하는 경우 텍스트 입력이 올바릅니다.
  • 인수에 있는 문자가 매개변수에서 올바른 문자보다 많은 경우 EGL은 사용 가능한 길이에 맞게 복사된 컨텐츠를 자릅니다.
  • 인수에 있는 문자가 매개변수에서 올바른 문자보다 적은 경우에는 EGL이 지정된 길이에 맞게 복사된 컨텐츠를 공백으로 채웁니다.
인수가 참조 유형이면 사본이 해당 함수 매개변수에 전달합니다. 매개변수에 지정하는 값은 참조가 가리키는 값에 영향을 주지 않습니다. 그러나 매개변수의 원래 값을 변경하지 않고 배열의 요소를 변경하는 경우 호출 프로그램이 변경을 발견합니다. 매개변수가 여전히 원래 인수가 가리키는 메모리의 동일한 영역을 가리키므로 프로그램이 변경을 발견합니다.
out
매개변수가 함수의 출력으로 사용되는 경우 이 수정자를 사용하십시오. 함수는 인수 값을 입력으로 받지 않고 매개변수는 “데이터 초기화”에 설명되어 있는 규칙에 따라 초기화됩니다. 함수가 리턴할 때 호출 프로그램의 인수에 값이 지정됩니다.
인수가 리터럴 또는 상수인 경우 매개변수는 수정자가 in인 것처럼 처리됩니다. 현재 함수 또는 현재 함수가 호출한 함수에서 파일이나 데이터베이스에 액세스하는 레코드에 out을 지정할 수 없습니다.
제한 길이 문자열을 수정자가 out인 함수 매개변수로 지정하는 경우 길이 한계는 매개변수와 인수 모두에 동일해야 합니다.
인수가 참조 유형이면 널 참조가 해당 함수 매개변수에 전달합니다. 매개변수에 지정하는 값은 호출 함수의 해당 변수를 업데이트합니다.
inOut
매개변수가 함수의 입력과 출력으로 사용되는 경우 이 수정자를 사용하십시오. 함수는 인수 값을 입력으로 받으며 호출 함수는 함수 종료 시 매개변수의 모든 변경사항을 받습니다. 인수가 리터럴 또는 상수인 경우 매개변수는 수정자가 in인 것처럼 처리됩니다.
인수가 레코드인 경우에는 다음 규칙이 적용됩니다.
  • 레코드를 사용하여 현재 함수 또는 현재 함수가 호출한 함수에서 파일 또는 데이터베이스에 액세스하는 경우 inOut 수정자를 지정하거나 기본적으로 해당 수정자를 승인해야 합니다.
  • 레코드의 유형이 매개변수와 인수에서 동일하고(예를 들어, 둘 다 EmpRecord 유형인 경우) inOut이 적용된 경우 레코드별 상태 정보(예: endOfFile 상태)가 함수에서 사용 가능하고 호출자에게 리턴됩니다.
인수가 참조 유형이면 해당 함수 매개변수에 참조로 전달합니다. 매개변수에 지정하는 값은 호출 프로그램의 해당 변수를 업데이트합니다.
sqlNullable
세부사항은 “sqlNullable”을 참조하십시오.
제한사항: COBOL 환경에서 사용할 코드를 생성할 때 SQL 레코드가 함수 매개변수로 전달될 경우 다음 제한사항에 유의해야 합니다.
  • COBOL 환경은 VSE 또는 System I 환경이 아니라 System Z 환경이어야 합니다.
  • SQL open 문에서 결과 세트 ID를 사용해야 합니다.
  • SQL get next, replace 또는 delete 문의 경우 SQL open 문에서 사용되는 결과 세트의 이름을 참조해야 합니다.
  • SQL open 문은 get next, replace 또는 delete 문과 함께 작동합니다. 두 명령문 모두 현재 함수의 함수 매개변수를 참조해야 합니다. open 문은 기타 SQL문과 다른 함수에 있을 수 없습니다.