Download presentation
Presentation is loading. Please wait.
1
Chap.10 자바 컴파일링의 안쪽 PS Lab. 이지연
2
표현식과 문장 표현식(expression) : 값을 산출해 내는 자바 코드 조각
문장(statement) : 값을 산출해 내지 않지만 실행되면서 생겨난 결과가 프로그램 상태에 영향을 주는 코드 단위 세미콜론(;)으로 끝남 블록(block) : 여러 개의 문장을 중괄호로 묶음
3
표현식의 여러 형태들 숫자 타입 : int, double, long, float, byte, boolean, short, char 강제변환 : 예) int집합에 속해 있는 원소를 short집합에 있는 원소로 매핑하는 일 객체타입 : 클래스는 객체를 만들 수 있는 타입이고 객체는 클래스의 인스턴스이다. 서브타입 : 그 타입과 함께 그 타입이 포함하고 있는 모든 타입 서브클래스는 수퍼클래스의 서브타입이다.
4
표현식 결과값의 타입 런타임 타입 : 표현식이 실행될 때 실제로 만들어지는 결과값의 타입
vector.elementAt(5) 자바 컴파일러가 정확한 런타임 타입을 예측하는 것은 어려움 컴파일 타입 타입 : 자바 컴파일러가 타입에 대해 추론할 수 있는 가장 구체적인 것
5
표현식 결과값의 타입(계속) 컴파일러가 표현식의 컴파일 타임 타입을 찾아내는 규칙
2개의 int르 함께 더한 표현식의 컴파일 타임 타입은 int이다. 메소드 호출 표현식의 컴파일 타임 타입은 그 메소드의 반환 타입이다. 상수 값의 컴파일 타임 타입은 그 상수의 타입이다. 지역 변수를 읽는 표현식의 컴파일 타입은 그 지역 변수에 선언된 타입이다.
6
컴파일 타임 타입과 타입 제약 타입 제약 : 어떤 타입에 대하여 어떤 연산을 수행할 수 있는지에 대한 제한을 두는 것
class Point{ // 구현 생략 } class Rectangle{ boolean contains(Point p) void move(Point p) } int a,b; float f1, f2; Point p; Rectangle r; Object o; P. 281, 282 합법적, 비합법적인 표현식들
7
문장과 표현식의 컴파일 스택에 대하여 따르는 일반적인 법칙
각 문장의 컴파일이 시작되었을 때 스택은 비어있고 끝날 때도 스택은 비어있다. 각 문장은 스택의 상단(top)에 추가적인 요소를 하나 더 푸시하는 것 외엔 스택에 아무 영향도 끼치지 않는다. 복합표현식 또는 복합문에 부분 표현식으로 이루어졌을 경우 일단 부분 표현식이 처리되고 그 결과가 스택에 푸시된다. 이들 부분 표현식의 결과는 복합 표현식 또는 복합문에 대하여 피연산자로 사용되며, 복합 표현식 또는 복합문은 스택에서 이것들을 제거(팝)하며 자신의 처리를 수행한다.
8
문장과 표현식의 컴파일(계속) System.out.write(bytes, 0, byes.length);
getstatic java/lang/System/out Ljava/io/PrintStream ;System.out aload_ ;bytes iconst_ ;0 arrayLength ;.length invokevirtual java/io/PrintStream/write([BII)V
9
지역 변수 선언 a int b long name String state boolean output String message
스코프(scope) : 지역 변수는 자신이 선언된 블록 안에서만 의미를 가진다. void foo(int a, long b) { String name=“Joshua”; boolean state=false; while(state) String output=“Hello,world”; System.out.println(output); state=true; } if(name==null) String msg=“No name” int output=b-a; a int b long name String state boolean output String message String output int
10
필드와 변수 지역 변수의 load명령어 : fload, aload, iload 객체 필드의 명령어 : getfield
정적 필드의 명령어 : getstatic 대입(assignment) <지역변수, 객체필드, 정적필드> = <대입하려는 값을 주는 표현식> 필드에 대한 대입 : <표현식>.<필드 이름> = <표현식>
11
축약표기(컴파일러의 식별자 구별) 고려사항 컴파일러는 주어진 이름을 가진 지역변수가 있는지 체크한다.
실패하면 이 이름을 가지고 있는 정적이지 않은 필드가 현재의 클래스 안에 있는지 살핀다. 마지막으로 이 이름을 가지고 있는 정적 필드가 현재의 클래스 안에 있는 지 살핀다.
12
대입문 P. 293 [표 10.5]이외의 대입 표현식들 joe.print_employee().salary *= 1.15
1)joe.print_employee().salary=joe.print_employee().salary *1.15 2)Employee temporary=jeo.print_employee(); temporary.salary=temporary.salary * 1.15; x=y=z=0; x=(y=(z=0));
13
대입문에서의 타입 점검 class Employee{} class Supervisor extends Employee{}
Object object; Employee employee1, employee2; supervisor supervisor; object=employee1; //OK employee2=supervisor; //OK object=supervisor; //OK employee1=employee2; //OK employee1=object; //에러! supervisor=employee2; //에러! supervisor=object; //에러! employee2=employee1; //OK
14
new Person(“James”, “Gosling”)
새 객체의 생성 class Person { String firstName; String lastName; Person(String first, String last){ firstName=first; lastName=last; } new Person(“James”, “Gosling”) new Person ;초기화되지 않은 Person 생성 dup ;참조자의 사본을 만듦 ldc “James” ;첫째 인자를 푸시 ldc “Gosling” ;둘째 인자를 푸시 ;생성자를 호출한다. invokespecial Person/<init> (Ljava/lang/String;Ljava/lang/String;)V
15
클래스 이름의 축약 표기 package your.package; import my.package.Person;
import java.util.Hashtable; import java.io.*; : new Hashtable() new java/util/Hashtable dup inokespecial java/util/Hashtable/<init> ()V
16
산술 표현식 숫자 타입의 계층 double float long int P.301 [표10.7]타입변환 명령어
17
산술 표현식(계속) 1.0 + 1 P.302 [표 10.8]산술 표현식에서의 강제 타입 변환 예
fconst_ ;1.0을 푸시 iconst_ ;1을 푸시 fadd ;에러! float을 int에 더할 수 없다. fconst_ ;float 1.0을 푸시 iconst_ ;int 1을 푸시 i2f ;이제 스택에는 2개의 float가 들어있다. fadd P.302 [표 10.8]산술 표현식에서의 강제 타입 변환 예 P.303 [표 10.9]int를 만들어 내는 산술 표현식들
18
숫자 값의 캐스팅 캐스팅 : 프로그래머에 의한 강제적 타입변환 P. 305 [표 10.10]숫자 타입의 캐스팅
(int)1.0+1 의 코드 fconst_1 f2i iconst_1 iadd (int)(1.5*2) // 결과값은 3 ((int)1.5)*2 // 결과값은 2 P. 305 [표 10.10]숫자 타입의 캐스팅
19
~연산자 int나 long값을 받아 각각의 비트를 반대로 바꾼다. x ^ -1 과 같은 연산 예) ~x iload_1
iconst_m1 ixor lload_1 ldc2_w-1L lxor
20
test class test { public static void main(String[] args) float a=1.5f;
int b=2; System.out.println(a*b); System.out.println((int)a*b); System.out.println(((int)a)*b); System.out.println((int)(a*b)); int x=1; System.out.println(~x); }
Similar presentations