자바 인터페이스 함수
자바 인터페이스 함수 (Java Interface Functions)
다음 함수들은 자바 인터페이스의 핵심이에요. 자바 객체를 만들고, 데이터 필드를 읽고 쓰며, 결과를 Octave로 되돌려 주는 자바 메서드를 호출하는 수단을 제공하죠.
본문
객체 생성
jobj = javaObject (classname)
jobj = javaObject (classname, arg1, …)
클래스 classname의 자바 객체를 만드는데, 생성자에 인자 arg1, ...를 넘겨서 호출해요. 첫 예시는 초기화되지 않은 객체를 만들고, 둘째 예시는 생성자에 초기 인자를 하나 주는 경우예요.
x = javaObject ("java.lang.StringBuffer")
x = javaObject ("java.lang.StringBuffer", "Initial string")
관련: javaMethod, javaArray.
jary = javaArray (classname, sz)
jary = javaArray (classname, m, n, …)
클래스 classname의 요소로 이루어지고 크기가 sz인 자바 배열을 만들어요. classname은 클래스를 나타내는 자바 객체이거나, 정규화된 클래스 이름을 담은 문자열일 수 있어요. 크기는 정수 인자 m, n, ...을 하나씩 나열해서 지정할 수도 있어요.
생성된 배열은 초기화되지 않아요. classname이 참조 타입이면 모든 요소가 null로, 기본(primitive) 타입이면 기본값(보통 0)으로 설정돼요.
jary = javaArray ("java.lang.String", 2, 2);
jary(1,1) = "Hello";
관련: javaObject.
타입 확인
Octave에는 변수 타입이 아주 많지만, 자바 함수를 쓸 수 있는 것은 javaObject로 만든 객체뿐이에요. 익숙하지 않은 객체에 자바를 쓰기 전에 isjava로 타입을 확인할 수 있어요.
tf = isjava (x)
x가 자바 객체라면 true를 반환해요.
관련: class, typeinfo, isa, javaObject.
필드 읽기·쓰기
객체를 만들었다면 자연스럽게 객체가 가진 필드는 무엇인지, 그 값을 읽고(get) 쓸(set) 수 있는지가 궁금해지죠.
Octave에서는 구조체용 fieldnames 함수가 오버로드되어 자바 객체의 필드도 반환해요. 예:
dobj = javaObject ("java.lang.Double", pi);
fieldnames (dobj)
다음과 같은 결과가 나와요.
{
[1,1] = public static final double java.lang.Double.POSITIVE_INFINITY
[1,2] = public static final double java.lang.Double.NEGATIVE_INFINITY
[1,3] = public static final double java.lang.Double.NaN
[1,4] = public static final double java.lang.Double.MAX_VALUE
[1,5] = public static final double java.lang.Double.MIN_NORMAL
[1,6] = public static final double java.lang.Double.MIN_VALUE
[1,7] = public static final int java.lang.Double.MAX_EXPONENT
[1,8] = public static final int java.lang.Double.MIN_EXPONENT
[1,9] = public static final int java.lang.Double.SIZE
[1,10] = public static final java.lang.Class java.lang.Double.TYPE
}
객체와 구조체의 유사성은 필드를 읽고 쓰는 데까지 이어져요. 필드를 읽으려면 구조체에서 쓰던 . 연산자로 객체를 인덱싱해요. 필드를 읽는 데는 이 방식이 더 선호되지만, Octave는 함수 인터페이스로 java_get을 통해서도 읽을 수 있게 해 줘요. 두 방식을 비교한 예제예요.
dobj = javaObject ("java.lang.Double", pi);
dobj.MAX_VALUE
⇒ 1.7977e+308
java_get ("java.lang.Float", "MAX_VALUE")
⇒ 3.4028e+38
val = java_get (obj, name)
자바 객체 obj의 필드 name 값을 가져와요. 정적(static) 필드라면 obj는 해당 클래스의 정규화된 이름을 담은 문자열일 수 있어요.
obj가 일반 자바 객체라면 구조체처럼 인덱싱하는 축약 문법을 쓸 수 있어요. 다음 두 문장은 동등해요.
java_get (x, "field1")
x.field1
관련: java_set, javaMethod, javaObject.
obj = java_set (obj, name, val)
자바 객체 obj의 필드 name 값을 val로 설정해요.
정적 필드라면 obj는 해당 자바 클래스의 정규화된 이름을 담은 문자열일 수 있어요.
obj가 일반 자바 객체라면 구조체처럼 인덱싱하는 축약 문법을 쓸 수 있어요. 다음 두 문장은 동등해요.
java_set (x, "field1", val)
x.field1 = val
관련: java_get, javaMethod, javaObject.
메서드 호출
객체로 어떤 함수를 호출할 수 있는지 보려면 methods를 사용해요. 앞서 만든 dobj를 쓰면:
methods (dobj)
다음과 같은 결과가 나와요.
Methods for class java.lang.Double:
boolean equals(java.lang.Object)
java.lang.String toString(double)
java.lang.String toString()
...
객체의 메서드를 호출할 때도 같은 구조체 인덱싱 연산자 .를 써요. Octave는 javaMethod를 통한 함수형 인터페이스도 제공해요. 두 방식을 보여 주는 예시예요.
dobj = javaObject ("java.lang.Double", pi);
dobj.equals (3)
⇒ 0
javaMethod ("equals", dobj, pi)
⇒ 1
ret = javaMethod (methodname, obj)
ret = javaMethod (methodname, obj, arg1, …)
자바 객체 obj에서 메서드 methodname을 인자 arg1, ...과 함께 호출해요.
정적 메서드라면 obj는 해당 클래스의 정규화된 이름을 담은 문자열일 수 있어요.
obj가 일반 자바 객체라면 구조체처럼 인덱싱하는 축약 문법을 쓸 수 있어요. 다음 두 문장은 동등해요.
ret = javaMethod ("method1", x, 1.0, "a string")
ret = x.method1 (1.0, "a string")
javaMethod는 메서드 호출의 결과를 반환해요.
관련: methods, javaObject.
클래스패스 다루기
다음 세 함수는 자바 가상 머신이 사용하는 클래스패스를 표시하고 수정하는 데 쓰여요. 이 클래스패스는 Octave의 PATH 변수와 완전히 별개이며, JVM이 실행할 올바른 코드를 찾는 데 사용돼요.
javaclasspath ()
dpath = javaclasspath ()
[dpath, spath] = javaclasspath ()
clspath = javaclasspath (what)
자바 가상 머신의 클래스패스를 문자열 셀 배열 형태로 반환해요.
인자 없이 호출하면:
- 출력을 요청하지 않으면 동적·정적 클래스패스를 표준 출력으로 출력해요.
- 출력
dpath를 하나 요청하면 그 값은 동적 클래스패스예요. - 출력
dpath와spath를 둘 요청하면 첫 변수에 동적 클래스패스, 둘째 변수에 정적 클래스패스가 들어가요.
단일 입력 인자 what으로 호출하면:
"-dynamic"– 동적 클래스패스 반환"-static"– 정적 클래스패스 반환"-all"– 정적·동적 클래스패스를 단일 셀 문자열로 반환
관련: javaaddpath, javarmpath.
javaaddpath (clspath)
javaaddpath (clspath1, …)
javaaddpath ({clspath1, …})
javaaddpath (…, "-end")
clspath를 자바 가상 머신의 동적 클래스패스 맨 앞에 추가해요.
clspath는 .class 파일이 있는 디렉터리이거나, 자바 클래스를 담은 .jar 파일일 수 있어요. 추가 인자를 주거나 문자열 셀 배열을 쓰면 여러 경로를 한 번에 추가할 수 있어요.
마지막 인자가 "-end"이면 새 요소를 현재 클래스패스의 맨 끝에 추가해요.
관련: javarmpath, javaclasspath.
javarmpath (clspath)
javarmpath (clspath1, …)
javarmpath ({clspath1, …})
clspath를 자바 가상 머신의 동적 클래스패스에서 제거해요.
clspath는 .class 파일이 있는 디렉터리이거나, 자바 클래스를 담은 .jar 파일일 수 있어요. 추가 인자를 주거나 문자열 셀 배열을 쓰면 여러 경로를 한 번에 제거할 수 있어요.
관련: javaaddpath, javaclasspath.
Octave와 JVM 사이의 인터페이스 제어
다음 함수들은 Octave와 자바 가상 머신 사이의 인터페이스에 대한 정보를 제공하고 제어해요.
msg = javachk (feature)
msg = javachk (feature, caller)
현재 세션에 자바 기능 feature가 있는지 검사해요. feature를 사용할 수 없거나, 활성화되어 있지 않거나, 인식되지 않으면 오류 구조체를 반환해요.
인식되는 기능은 다음과 같아요.
"awt"– GUI용 추상 윈도우 툴킷(Abstract Window Toolkit)"desktop"– 대화형 데스크톱 실행 중"jvm"– 자바 가상 머신"swing"– 가벼운 GUI용 Swing 컴포넌트
feature가 지원되지 않으면 "message"와 "identifier" 필드를 가진 스칼라 구조체를 반환해요. "message" 필드에는 선택적인 사용자 지정 caller와 함께 feature를 언급하는 오류 메시지가 들어 있어요. 이 구조체는 error 함수에 넘기기에 적합해요.
feature가 지원되고 사용 가능하면 "message"와 "identifier" 필드를 가진 빈 구조체 배열을 반환해요.
javachk는 Octave 세션에서 특정 자바 기능을 사용할 수 있는지 판단해요. 이 함수는 자바나 특정 자바 런타임 기능의 사용 가능 여부에 따라 동작을 바꿀 수 있는 스크립트를 위해 제공돼요.
호환성 참고: "desktop" 기능은 Octave에 자바 기반 데스크톱이 없으므로 절대 사용할 수 없어요.
관련: usejava, error.
tf = usejava (feature)
자바 요소 feature를 사용할 수 있으면 true를 반환해요.
가능한 기능은 다음과 같아요.
"awt"– GUI용 추상 윈도우 툴킷"desktop"– 대화형 데스크톱 실행 중"jvm"– 자바 가상 머신"swing"– 가벼운 GUI용 Swing 컴포넌트
usejava는 Octave 세션에서 특정 자바 기능을 사용할 수 있는지 판단해요. 이 함수는 자바 사용 가능 여부에 따라 동작을 바꿀 수 있는 스크립트를 위해 제공돼요. "desktop" 기능은 Octave에 자바 기반 데스크톱이 없으므로 항상 false를 반환해요. Octave가 자바 인터페이스로 컴파일되고 자바가 설치되어 있다면 다른 기능은 사용 가능할 수 있어요.
관련: javachk.
메모리 관리
javamem ()
jmem = javamem ()
자바 가상 머신(JVM)의 현재 메모리 사용량을 보여 주고 가비지 컬렉터를 실행해요.
반환 인자를 주지 않으면 정보를 화면에 출력해요. 그렇지 않으면 출력 셀 배열 jmem에 Maximum, Total, Free 메모리(바이트 단위)가 들어 있어요.
모든 자바 기반 루틴은 JVM의 공유 메모리 풀에서 실행되는데, 이는 JVM이 컴퓨터의 전체 메모리(물리 RAM과 하드디스크의 가상 메모리/스왑 공간을 합한 것)에서 따로 떼어 가는 전용의 분리된 메모리 영역이에요.
최대 허용 메모리 사용량은 java.opts 파일로 설정할 수 있어요. 이 파일이 있는 디렉터리는 환경 변수 OCTAVE_JAVA_DIR로 정해져요. 설정되어 있지 않으면 javaaddpath.m이 있는 디렉터리(보통 OCTAVE_HOME/share/octave/OCTAVE_VERSION/m/java/)를 사용해요.
java.opts는 한 줄에 옵션 하나씩 쓰는 일반 텍스트 파일이에요. 시스템 종속적인 기본 초기 메모리 크기와 기본 최대 메모리 크기는 다음과 같이 재정의할 수 있어요.
-Xms64m
-Xmx512m
(이 예시에서는 메가바이트 단위예요.)
물리 메모리가 부족하거나 자바 메모리 오류가 난다면 이 값을 자신의 환경에 맞게 조정하면 돼요.
"Total memory"는 운영체제가 현재 JVM에 할당한 메모리로, 실제 사용 중인 활성 메모리 양에 따라 달라져요. "Free memory"는 말 그대로 자유 메모리예요. 자바 기반 Octave 함수가 동작하는 동안 Total과 Free 메모리 양은 자바의 정리 작업과 운영체제의 메모리 관리 때문에 변동돼요.
val = java_matrix_autoconversion ()
old_val = java_matrix_autoconversion (new_val)
old_val = java_matrix_autoconversion (new_val, "local")
자바 배열을 Octave 행렬로 자동 변환할지 제어하는 내부 변수를 조회하거나 설정해요.
기본값은 false예요.
함수 안에서 "local" 옵션으로 호출하면 변수가 함수와 그 하위 함수에 대해 로컬로 바뀌고, 함수를 빠져나오면 원래 값으로 복원돼요.
관련: java_unsigned_autoconversion, debug_java.
val = java_unsigned_autoconversion ()
old_val = java_unsigned_autoconversion (new_val)
old_val = java_unsigned_autoconversion (new_val, "local")
java_matrix_autoconversion이 활성화되어 있을 때 정수 클래스를 어떻게 변환할지 제어하는 내부 변수를 조회하거나 설정해요.
활성화되면 Byte 또는 Integer 클래스의 자바 배열이 각각 uint8 또는 uint32 클래스의 행렬로 변환돼요. 기본값은 true예요.
함수 안에서 "local" 옵션으로 호출하면 변수가 함수와 그 하위 함수에 대해 로컬로 바뀌고, 함수를 빠져나오면 원래 값으로 복원돼요.
관련: java_matrix_autoconversion, debug_java.
val = debug_java ()
old_val = debug_java (new_val)
old_val = debug_java (new_val, "local")
JVM 초기화와 자바 예외에 관한 추가 디버깅 정보를 출력할지 결정하는 내부 변수를 조회하거나 설정해요.
함수 안에서 "local" 옵션으로 호출하면 변수가 함수와 그 하위 함수에 대해 로컬로 바뀌고, 함수를 빠져나오면 원래 값으로 복원돼요.
관련: java_matrix_autoconversion, java_unsigned_autoconversion.