Download presentation
Presentation is loading. Please wait.
1
자바 가상 머신 프로그래밍 Chapter 3. 메소드 작성하기 Pslab 오민경
2
목차 기본적인 용어 데이터 타입 반환 상수 지역변수 연산 타입변환 기타 명령어
3
기본적인 용어 메소드(method) 명령어(instruction) 니모닉(mnemonic) 인자(argument)
특정 작업을 수행하도록 명령어들을 구성해 놓은 것 메소드의 몸체는 명령어들의 리스트 명령어(instruction) 작업 수행의 기본 단위 형태 : mnemonic argument1 argument2 … Ex. aload 99, iadd 니모닉(mnemonic) 어떠한 작업을 하기를 원하는 가를 나타내어준다. 니모닉 이름을 정하는 규칙은 [표3.1]의 니모닉 타입 문자 참고 인자(argument) 항상 니모닉 뒤에 덧붙어 나오는 부가적인 정보를 의미 프로그램이 수행되는 동안 절대로 바뀌지 않는다. 피연산자(operand) 피연산자 스택에 들어있는 데이터를 가리킨다. 프로그램이 수행되는 도중 얼마든지 바뀔 수 있다.
4
데이터 타입 숫자 타입 (Numeric Type) 객체 타입 (Object Type) int, float
작은 범위의 숫자 표현 슬롯 하나에 하나의 데이터 저장 long, double 큰 범위의 숫자 표현 슬롯 2개에 하나의 데이터 저장 Boolean, byte, short, char 모두 int 값으로 다루어진다. 객체 타입 (Object Type) 참조자(reference) 어떤 클래스의 자바 객체를 가리키는 데이터를 의미 Foo x; => 참조자를 저장하는 필드를 생성 스택상에서 하나의 슬롯만을 차지 참조자는 힙 상에 존재하는 객체를 가리킨다. C의 포인터와 비슷, 그러나 JVM의 참조자는 객체만을 가리킬 수 있다.
5
예제코드 다음의 코드를 Oolong 어셈블러를 사용해 어셈블 하면 Test.class 파일이 생긴다.
.class Test ; 클래스 생성 .method static run()I ; 정적 메소드 추가 bipush 6 ; 6을 스택에 push bipush 9 ; 9를 스택에 push imul ; 두수를 곱함 ireturn ; 결과를 반환 .endmthod ; 메소드 끝 다음의 코드를 자바 컴파일러로 컴파일하고 실행하면 결과가 출력될 것이다. Class RunTest { public static void main(String a[]) { System.out.println(“The result is: “ + Test.run()); } 결과화면 The result is: 54
6
반환(return) 메소드가 실행을 끝내면, 메소드는 자신을 호출한 부분으로 제어권을 반환한다.
xreturn 명령어가 실행되면 프로그램의 제어권은 메소드를 호출한 invoke 명령어로 넘어간다. -> invoke 명령어의 다음 명령어를 수행 [표 3.2] return 명령어 참고
7
상수(Constant) Int, float, long, double, String 타입의 상수를 지원
상수값을 스택에 집어넣을 때 사용하는 명령어 Ldc : int, float, String 상수에 사용 Ldc2_w : long, double상수에 사용 Ex. Ldc 1.0 작은 상수를 로드하는 명령어 자주 사용되는 숫자의 경우 대부분 xconst_n 명령어가 존재 (x: 타입, n : 스택에 집어넣을 숫자) [표 3.3] 상수를 로드하는 명령어들
8
지역변수 지역변수 .limit locals 지시자 이름을 갖지 않는다. 숫자로 구분
Load, store 명령어를 이용해, 스택으로부터 데이터를 읽고 쓴다. 지역변수 배열에서 타입은 동적으로 바뀌어 질 수 있다. [표 3.4]와 [표 3.5]의 로드와 저장 명령어 참고 .limit locals 지시자 메소드에서 사용하는 지역 변수의 개수를 명시 명시하지 않는다면, Oolong 어셈블러가 알아서 추측함
9
지역변수(cont.) 변수의 초기화 메소드의 인자로서 쓰이는 지역변수들은 자동으로 초기화가 된다.
모든 변수는 사용되기 전에 초기화 되어야 한다. 즉, 변수에서 데이터를 읽기 전에, 변수에 먼저 데이터를 집어 넣어 주어야 한다. 메소드의 인자로서 쓰이는 지역변수들은 자동으로 초기화가 된다. 지역변수 0번 슬롯부터 차례대로 인자가 할당된다. 정적 메소드가 아니라면, 자기자신을 가리키는 참조자를 0번 슬롯에 저장하게 된다. (자바의 this에 해당) 반환값은 피연산자 스택을 사용하여 반환된다. (반환값에 대해서는 지역변수가 할당되지 않는다.)
10
연산 수식연산 비트 연산 Strictfp 덧셈, 뺄셈, 곱셈, 나눗셈의 기본적인 연산 [표 3.6] 수식연산자 참고
이 명령어들은 모두 인자를 받아들이지 않고, 자신의 피연산자를 스택에서 가져온다. Double, float 데이터는 숫자가 아닌 세가지 데이터도 표현 NaN (숫자가 아니라는 것을 의미) : 0을 0으로 나누었을 때… 양과 음의 무한대 : 숫자를 0으로 나누었을 때… 비트 연산 Int나 long 에디터의 비트를 사용하여 불리언 연산을 수행하는데 자주 사용된다. [표 3.7] 비트 연산 명령어들 참고 Strictfp 사용 : 자바 가상머신에서 지원해주는 부동 소수점 연산을 사용 사용 X : 컴퓨터에서 제공해 주는 고성능의 부동 소수점 연산을 사용
11
타입변환 타입 캐스팅 데이터 타입의 변환 확대, 축소 변환
객체 그 자체를 전혀 바꾸지 않으면서, 프로그래머가 객체를 다루는 방식만을 바꾸어 주는 것 String o = (String) x; 데이터 타입의 변환 데이터 타입의 값 그 자체를 변화시킨다. int I = (int) 7.9; X2y의 형식 (x: 원래의 데이터 타입, y: 바뀌어질 데이터 타입) [표 3.8] 숫자 데이터 변환 참고 확대, 축소 변환 확대변환 : 더 큰 범위를 갖는 타입으로 변환 축소 변환 : 더 작은 범위를 갖는 타입으로 변환 축소 변환을 할 경우, 데이터의 크기에 대한 정보를 잃어버릴 수도 있다.
12
기타 명령어 pop 명령어 pop2 명령어 swap 명령어 dup 명령어 dup_x1 명령어
하나의 슬롯을 차지하는 데이터를 제거 pop2 명령어 두개의 슬롯을 차지하는 데이터를 제거 swap 명령어 스택의 최상단에 있는 2개의 슬롯을 서로 바꿈 dup 명령어 스택의 최상단 슬롯을 복사하여, 다시 스택에 푸쉬 dup_x1 명령어 스택의 최상단 슬롯을 복사한 뒤, 그것을 스택의 맨 위에서 두번째 슬롯 아래에 삽입 [표 3.9] 스택을 조작하는 명령어들 참고
13
기타 명령어(cont.) newarray 명령어 xaload, xastore 명령어 nop 명령어
숫자타입의 배열을 생성하는 명령어 인자 : 생성하기 원하는 배열의 타입 배열의 길이는 스택으로부터 얻어낸다. 결과는 생성된 배열의 참조자이다. xaload, xastore 명령어 배열의 정보를 다루는 명령어 [표 3.10] 배열을 다루는 명령어들 참고 nop 명령어 아무런 일도 하지 않는 명령어 Oolong 언어를 사용하지 않고 클래스 파일에 직접 바이트 코드를 써 넣고 싶다면, nop 명령어를 채워 넣으면 된다.
Similar presentations