Java 호출
EGL에서 Java™를 생성 중인 경우 Java 코드를 호출할 몇몇 방법이 있습니다. 이 주제에서는 javaLib.invoke() 등의 JavaLib 시스템 라이브러리에서 시스템 함수를 사용하고 ExternalType 파트를 선언하는 것을 포함하여 가장 일반적인 방법 중 몇몇을 다룹니다.
전제조건
- COBOL이 아니라 Java에 생성된 EGL 프로젝트
- EGL 프로그램 또는 다른 논리 파트
Java 클래스 한 번 호출
Java 클래스의 메소드를 한 번만 사용해야 하는 경우 javaLib.invoke 시스템 함수를 사용할 수 있습니다.
이 예제는 메소드 random을 호출합니다. 이 메소드는 클래스 java.lang.Math에 속하고 0과 1 사이의 난수를 리턴합니다. 이 경우 클래스는 EGL 라이브러리와 유사하고 메소드는 이 라이브러리에서 함수와 유사하게 작동합니다.
이런 방식으로 호출할 수 있는 메소드만 정적으로 정의된 메소드입니다. "정적"은 EGL에서 유사점이 없는 Java 용어입니다. 즉, 이 컨텍스트에서 메소드를 임의의 시간에 호출할 수 있고 초기화하지 않아도 사용할 수 있습니다.
- 논리 파트 내의 EGL 함수에서, 전달해야 하거나
리턴 값을 승인하는 데 필요할 수 있는 변수를
선언하십시오.
myNumber float; - 메소드를 호출할 javaLib.invoke() 시스템 함수를 사용하여
메개변수로 호출할 메소드 및 클래스의 이름을
전달합니다.
myNumber = javaLib.invoke("java.lang.Math", "random"); - 그런 다음 호출의 결과를 사용할 수 있습니다.
sysLib.writeStderr(strLib.formatNumber(myNumber));
매개변수를 메소드에 전달하려면 javaLib.invoke()의 argument 매개변수를 사용하십시오.
Java 클래스 여러 번 호출
Java 클래스의 메소드를 몇 번 사용하려고 계획하는 경우 또는 호출하려는 메소드가 정적으로 정의되지 않은 경우, 뒤따르는 "ExternalType 파트를 작성하여 클래스 표시"의 경우와 같이 ExternalType 파트를 작성해야 합니다. 그러나 마이그레이션된 프로그램과의 호환성을 위해 약간 적은 EGL 코드를 사용하여 javaLib에서 기타 함수를 통해 클래스와 정적이 아닌 해당 메소드도 여러 번 초기화하고 사용할 수 있습니다.
//Error! The method nextInt() is not static.
myInt int = javaLib.invoke("java.util.Random", "nextInt");
javaLib.storeNew("myRandomGenerator" AS "objId:java", "java.util.Random");
myInt int = javaLib.invoke("myRandomGenerator" AS "objId:java", "nextInt");
이러한 예제에서 문자열 myRandomGenerator는 클래스를 나타내는 ID입니다. 클래스를 사용하는 경우 항상 사용자는 이 ID가 EGL 파트 또는 문자열 리터럴이 아니라 코드 AS "objId:java"가 포함된 Java 클래스를 참조함을 EGL에 알립니다. 자세한 정보는 as 연산자를 참조하십시오. Java 클래스 및 메소드 호출에 대한 자세한 내용은 Java 액세스 함수의 내용을 참조하십시오.
ExternalType 파트를 작성하여 클래스 표시
클래스를 자주 사용할 계획이거나 사용하려는 메소드가 정적으로 정의되지 않은 경우 EGL ExternalType 파트, Java 클래스를 직접 나타내는 EGL 파트를 정의할 수 있습니다. ExternalType 파트를 정의한 후, 이를 기반으로 변수를 작성하고 EGL 라이브러리의 이름을 사용하는 경우와 같이 해당 변수를 사용할 수 있습니다.
이 예제는 클래스 java.util.Random을 사용합니다. 이 클래스에는 랜덤 정수를 리턴하는 nextInt라는 비정적 메소드가 있습니다. 다시, EGL 프로그래밍의 용도로 클래스가 라이브러리이고 메소드가 함수라고 가정하십시오.
- EGL 소스 파일에서, 사용하려는
Java 클래스의 이름을 지정하여
ExternalType 파트 정의를 시작하십시오.
Java 클래스의 이름이 두 개의 특성으로 나뉩니다.ExternalType Random type JavaObject {packageName = "java.util", javaName = "Random"} //prototypes go here end- packageName은 클래스를 보유하는 패키지의 이름입니다. Java 패키지 및 EGL 패키지는 거의 동일한 방식으로 작동합니다.
- javaName은 Java 클래스 자체의 이름입니다. ExternalType 파트의 이름을 클래스와 동일한 이름으로 지정할 수 있습니다(원하는 경우).
- ExternalType 파트 내에서, 사용하려는 클래스의 메소드를 나타내는 함수 프로토타입을
작성하십시오.
다시, Java의 함수 프로토타입은 인터페이스 파트의 해당 항목과 같이 EGL의 함수 프로토타입과 유사합니다. 이는 함수나 메소드 이름, 해당 인수 및 해당 리턴 값을 나열하지만 내부 논리가 없습니다. 여기서 프로토타입은 ExternalType 파트의 함수를 Java 클래스의 메소드에 링크합니다.ExternalType Random type JavaObject {packageName = "java.util", javaName = "Random"} function nextInt() returns(int); end또한 주의하여 Java 유형을 호환 가능한 EGL 유형에 일치시키거나 그 반대도 수행해야 합니다. EGL 파트 및 Java 파트를 연관시키는 표가 Java에 EGL 기본요소 맵핑에서 사용 가능합니다.
- ExternalType 파트는 constructor도 필요합니다. EGL
조항에서, 생성자는 파트에 기반한 새 변수가 작성될 때 실행되는
함수입니다. 생성자는 일반적으로 EGL에서
사용되지 않습니다. 자세한 정보는 new 연산자의 내용을 참조하십시오.
ExternalType Random type JavaObject {packageName = "java.util", javaName = "Random"} function nextInt() returns(int); constructor(); end - ExternalType 파트에 기반하여 변수를 작성하려면 먼저
new 키워드 및 파트의 이름으로
해당 생성자를 호출해야 합니다.
코드 new Random()이 실제로 파트 정의에서 constructor() 함수 프로토타입에 대한 함수 호출이며, 이는 차례대로 Java 클래스의 생성자를 참조합니다.myRandomGenerator Random = new Random(); - EGL 라이브러리를 사용 중인 경우와 같이 ExternalType의
함수를 사용하십시오.
myInt int = myRandomGenerator.nextInt(); sysLib.writeStderr(strLib.formatNumber(myInt));
/*
Writes a random integer to the console
using an ExternalType part
*/
program ExternalTypeTest type BasicProgram
function main()
myRandomGenerator Random = new Random();
myInt int = myRandomGenerator.nextInt();
SysLib.writeStderr(StrLib.formatNumber(myInt));
end
end
externalType Random type JavaObject
{packageName = "java.util",
javaName = "Random"}
constructor();
function nextInt() returns(int);
end
ExternalType 파트에 대한 자세한 내용은 ExternalType 파트의 내용을 참조하십시오.