4. Java Virtual Machine
Class Loader System
Operating System
Java Threads
Execution
Engine
Run-time
Data Area
Garbage
Collector
Java Application
Java
API
Native
Method
Libraries
5. ByteCode
Link
Verify
Prepare
Class
Load
Class Loader
Resolve Initialize
ByteCode
Class File
Memory
6. Java API Execution
Class Loader
Engine Java Class
System
Runtime Data Areas
PC
Registers
JVM
Stacks
Files
Native
Method
Libraries
Method
Area
Heap Native
Method
Stacks
JVM은 Class Loader를 활용해 컴파일한 Byte Code를 Runtime Data Areas의 Method Area에 실행
가능한 상태로 Load한다.
7. Execution Engine
Class Loader System
Operating System
Java
Threads
Execution
Engine
Run-time
Data Area
Garbage
Collector
Java Application
Java
API
Native
Method
Libraries
8. Java API Execution
Class Loader
Engine Java Class
System
Runtime Data Areas
PC
Registers
JVM
Stacks
Files
Native
Method
Libraries
Method
Area
Heap Native
Method
Stacks
JVM의 Execution Engine은 Method Area에 Load되어 있는 Byte Code 정보를 활용해 자바
프로그램을 실행한다.
Execution Engine은 ByteCode를 한 라인씩 실행(interpreting 방식)한다.
9. Method Area
모든 Thread 들이 공유하는 메모리 영역이다.
자바 프로그램을 실행하기 위한 Class(Type), Method, Field 정보를 가진다.
프로그램에서 공유할 필요가 있는 정보를 가진다.
10. Method Area
모든 Thread 들이 공유하는 메모리 영역이다.
Method Area에 저장되는 정보
Type Information : 클래스와 관련한 모든 정보
Constant Pool : 문자열 상수와 같은 리터럴 상수, Symbolic Reference
Field Information : Field 이름, Data Type, Modifier 등
Method Information : Method 이름, 입출력 DataType, Modifier 등
Class Variables : static으로 선언되는 모든 클래스 변수
Reference to Class Class Loader : 특정 Type을 Load한 ClassLoader 정보를 관리
Reference to Class class
Method Table : Class의 Method에 대한 Direct Reference를 가진다.
11. Java API Execution
Class Loader
Engine Java Class
System
Runtime Data Areas
PC
Registers
JVM
Stacks
Files
Native
Method
Libraries
Method
Area
Heap Native
Method
Stacks
Method Area의 Byte Code 정보를 활용해 프로그램을 실행할 때는 JVM Stacks, Native Method
Stacks 공간을 활용한다.
12. JVM Stacks, Native Method Stacks
각 Thread마다 서로 다른 메모리가 할당된다.
Thread가 시작할 때 생성된다.
각 Thread마다 서로 다른 메모리를 사용하기 때문에 여러 명의 사용자가 동시에 같은 method에
접근해도 문제가 발생하지 않는다.
13. Java API Execution
Class Loader
Engine Java Class
System
Runtime Data Areas
PC
Registers
JVM
Stacks
Files
Native
Method
Libraries
Method
Area
Heap Native
Method
Stacks
JVM은 Heap에서 자바 프로그램을 실행할 때 자바 클래스의 인스턴스와 Array에 대한 메모리를
관리한다.
14. Method
Area
Thread A
(사용자 A)
JVM Stacks
main() Stack frame
Operand Stack
Local Variable
0 args
constant
pool
프로그램을 실행하면 사용자마다 독립적인 JVM Stack이 생성된다.
JVM Stack 안에는 메서드가 호출 될 때마다 Stack Frame이 생성된다.
JVM Stacks
main() Stack frame
Operand Stack
Local Variable
0 args
JVM Heap
Thread B
(사용자 B)
15. JVM Heap과 Method Area는 Thread가 메모리를 공유한다.
Method
Area
constant
pool
JVM Heap
Thread A
(사용자 A)
Thread B
(사용자 B)
16. Method Area는 클래스 ByteCode와 변하지 않는 값이 존재하기 때문에 이슈가 없다.
Thread가 데이터를 공유함으로써 이슈가 있는 부분은 JVM Heap 메모리이다.
Method
Area
constant
pool
JVM Heap
Thread A
(사용자 A)
Thread B
(사용자 B)
17. Heap
모든 Thread 들이 공유하는 메모리 영역이다.
JVM에서 대부분의 메모리 이슈가 집중되어 있는 부분이다.
JVM에서 Memory가 할당, 해제(Garbage Collection)의 이슈는 대부분 Heap 메모리이다.
18. package net.slipp;
public class Adder {
int add(int i, int j) {
return i + j;
}
public static void main(String[] args) {
Adder adder = new Adder();
int result = adder.add(5,2);
System.out.println(result);
}
}
19. package net.slipp;
public class Adder {
int add(int i, int j) {
return i + j;
}
public static void main(String[] args) {
Adder adder = new Adder();
int result = adder.add(5,2);
System.out.println(result);
}
}
JVM Stacks
main() Stack frame
Operand Stack
Local Variable
0 args
1. main method 실행을 위한 stack frame
생성
20. package net.slipp;
public class Adder {
int add(int i, int j) {
return i + j;
}
public static void main(String[] args) {
Adder adder = new Adder();
int result = adder.add(5,2);
System.out.println(result);
}
}
JVM Stacks
main() Stack frame
Operand Stack
Local Variable
0 args
1. main method 실행을 위한 stack frame
생성
2. Adder 생성자를 위한 stack frame 생성
Adder 생성자
Stack frame
Operand Stack
Local Variable
0 this
21. package net.slipp;
public class Adder {
int add(int i, int j) {
return i + j;
}
public static void main(String[] args) {
Adder adder = new Adder();
int result = adder.add(5,2);
System.out.println(result);
}
}
JVM Stacks
main() Stack frame
Operand Stack
Local Variable
0 args
1. main method 실행을 위한 stack frame
생성
2. Adder 생성자를 위한 stack frame 생성
3. 생성자 실행이 끝나면 Adder 생성자를
위한 stack frame 제거
22. JVM Stacks
main() Stack frame
Operand Stack
Local Variable
0 args
package net.slipp;
public class Adder {
int add(int i, int j) {
return i + j;
}
public static void main(String[] args) {
Adder adder = new Adder();
int result = adder.add(5,2);
System.out.println(result);
}
1. main method 실행을 위한 stack frame
생성
2. Adder 생성자를 위한 stack frame 생성
3. 생성자 실행이 끝나면 Adder 생성자를
위한 stack frame 제거
4. add method를 위한 stack frame 생성
}
add method
Stack frame
Operand Stack
Local Variable
2 2
1 5
0 this
23. JVM Stacks
main() Stack frame
Operand Stack
Local Variable
0 args
package net.slipp;
public class Adder {
int add(int i, int j) {
return i + j;
}
public static void main(String[] args) {
Adder adder = new Adder();
int result = adder.add(5,2);
System.out.println(result);
}
1. main method 실행을 위한 stack frame
생성
2. Adder 생성자를 위한 stack frame 생성
3. 생성자 실행이 끝나면 Adder 생성자를
위한 stack frame 제거
4. add method를 위한 stack frame 생성
5. add method에 대한 stack frame 제거
}
24. JVM Stacks
package net.slipp;
public class Adder {
int add(int i, int j) {
return i + j;
}
public static void main(String[] args) {
Adder adder = new Adder();
int result = adder.add(5,2);
System.out.println(result);
}
1. main method 실행을 위한 stack frame
생성
2. Adder 생성자를 위한 stack frame 생성
3. 생성자 실행이 끝나면 Adder 생성자를
위한 stack frame 제거
4. add method를 위한 stack frame 생성
5. add method에 대한 stack frame 제거
6. main method에 대한 stack frame 제거
}
32. Prefix/
Suffix
Operand Type
i integer
l long
s short
b byte
c character
f float
d double
z boolean
a reference
33. JVM Stacks
add method
Stack frame
Operand Stack
Local Variable
2 2
1 5
0 this
load opcode
Local Variable 영역의 값을
Operand Stack 영역으로
복사하는
명령어(instruction)
JVM Stacks
add method
Stack frame
Operand Stack
Local Variable
2 2
1 5
0 this
iload_1
실행 후
0 5
34. JVM Stacks
main method
Stack frame
Operand Stack
Local Variable
1 adder
0 this
store opcode
Operand Stack 영역의 값을
Local Variable 영역으로
이동하는
명령어(instruction)
istore_2
실행 후
0 7
JVM Stacks
main method
Stack frame
Operand Stack
Local Variable
2 7
1 adder
0 this
36. Case 1
public class StringConcatenations {
public String concat1(String start, String end) {
return start + end;
}
public void concat2(StringBuffer start, String end) {
start.append(end);
}
}
37. Case 2
public class StringLiterals {
public static void main(String[] args) {
String one = "Test";
String two = "Test";
String three = "T" + "e" + "s" + "t";
String four = new String("Test");
}
}
39. Case 3
public class MyFor {
public int sum(int[] values) {
int sum = 0;
for (int i = 0; i < values.length; i++) {
sum +=- values[i];
}
return sum;
}
}
41. package net.slipp;
public class Adder {
int add(int i, int j) {
return i + j;
}
public static void main(String[] args) {
Adder adder = new Adder();
int result = adder.add(5,2);
System.out.println(result);
}
}
42. D:next-workspaceworkspacejavabin>javap -c net/slipp/Adder
Compiled from "Adder.java"
public class net.slipp.Adder {
public net.slipp.Adder();
Code:
0: aload_0
1: invokespecial #8 // Method java/lang/Object."<init>":()V
4: return
int add(int, int);
Code:
0: iload_1
1: iload_2
2: iadd
3: ireturn
public static void main(java.lang.String[]);
Code:
0: new #1 // class net/slipp/Adder
3: dup
4: invokespecial #21 // Method "<init>":()V
7: astore_1
8: aload_1
9: iconst_5
10: iconst_2
11: invokevirtual #22 // Method add:(II)I
14: istore_2
15: getstatic #24 // Field java/lang/System.out:Ljava/io/PrintStream;
18: iload_2
19: invokevirtual #30 // Method java/io/PrintStream.println:(I)V
22: return
}
43. D:next-workspaceworkspacejavabin>javap -c Adder.class
Compiled from "Adder.java"
public class Adder {
public Adder();
Code:
0: aload_0
1: invokespecial #8 // Method
java/lang/Object."<init>":()V
4: return
int add(int, int);
Code:
0: iload_1
1: iload_2
2: iadd
3: ireturn
public static void main(java.lang.String[]);
Code:
0: new #1 // class Adder
3: dup
4: invokespecial #21 // Method "<init>":()V
7: astore_1
8: aload_1
9: iconst_5
10: iconst_2
11: invokevirtual #22 // Method add:(II)I
14: istore_2
15: getstatic #24 // Field
java/lang/System.out:Ljava/io/PrintStream;
18: iload_2
19: invokevirtual #30 // Method
java/io/PrintStream.println:(I)V
22: return
}
Execution Engine은
interpreting 방식으로 한번에
한 라인씩 실행한다.
한 라인을 instruction이라고
한다.
instruction은 offset,
opcode(operation code),
피연산자(operand)로
구성된다.
44. JVM Stacks Method
Area
JVM Heap
JVM은 Method Area에 저장되어 있는 Bytecode를 interpreting 방식으로 읽어
실행해 나간다. 먼저 Adder의 main()가 Entry Point가 된다.
main() Stack frame
Operand Stack
Local Variable
0 args
45. public static void main(java.lang.String[]);
Code:
0: new #1 // class net/slipp/Adder
JVM Stacks JVM Heap
main() Stack frame
Operand Stack
Local Variable
0 args
Method Area에 있는 Adder 정보를 활용해 Heap
메모리에 Adder Instance를 생성한 후 Operand Stack
0에 Adder Instance에 대한 reference를 저장
Adder Instance
0 adder
Method
Area
46. public static void main(java.lang.String[]);
Code:
0: new #1 // class net/slipp/Adder
3: dup
JVM Stacks JVM Heap
main() Stack frame
Operand Stack
1 adder
Local Variable
0 args
Operand Stack 0에 Adder Instance에 대한
reference를 Operand Stack 1에 복사한다.
Adder Instance
0 adder
Method
Area
47. public static void main(java.lang.String[]);
Code:
3: dup
4: invokespecial #21 // Method "<init>":()V
JVM Stacks JVM Heap
main() Stack frame
Operand Stack
Local Variable
0 args
Adder 클래스의 기본 생성자(Object 기본
생성자)를 호출한다. Adder 기본 생성자 Stack
Frame이 생성된다.
Adder Instance
0 adder
Adder 생성자
Stack frame
Operand Stack
Local Variable
0 this
Method
Area
48. public net.slipp.Adder();
Code:
0: aload_0
JVM Stacks JVM Heap
main() Stack frame
Operand Stack
Local Variable
0 args
Adder 생성자 Stack Frame의 Local Variable의
index 0의 값을 Operand Stack으로 로드한다.
Adder Instance
0 adder
Adder 생성자
Stack frame
Operand Stack
0 this
Local Variable
0 this
Method
Area
49. public net.slipp.Adder();
Code:
0: aload_0
1: invokespecial #8 // Method java/lang/Object."<init>":()V
JVM Stacks JVM Heap
main() Stack frame
Operand Stack
Local Variable
0 args
Adder Instance에 대한 실질적인 초기화가 이
단계에서 진행된다.
초기화가 완료된
Adder Instance
0 adder
Adder 생성자
Stack frame
Operand Stack
Local Variable
0 this
Method
Area
50. public net.slipp.Adder();
Code:
0: aload_0
1: invokespecial #8 // Method java/lang/Object."<init>":()V
4: return
JVM Stacks JVM Heap
main() Stack frame
Operand Stack
Local Variable
0 args
Adder 기본 생성자에 대한 Stack Frame이 JVM
Stack에서 제거된다.
0 adder
초기화가 완료된
Adder Instance
Method
Area
51. public static void main(java.lang.String[]);
Code:
[…]
4: invokespecial #21 // Method "<init>":()V
7: astore_1
JVM Stacks JVM Heap
main() Stack frame
Operand Stack
Local Variable
0 args
Operand Stack에서 pop한 결과를 Local
Variable의 index 1번에 저장한다.
1 adder
초기화가 완료된
Adder Instance
Method
Area
52. public static void main(java.lang.String[]);
Code:
[…]
7: astore_1
8: aload_1
JVM Stacks JVM Heap
main() Stack frame
Operand Stack
Local Variable
0 args
Variable의 index 1번에 저장된 값을 Operand
Stack에 push한다.
1 adder
초기화가 완료된
Adder Instance
0 adder
Method
Area
60. public static void main(java.lang.String[]);
Code:
[…]
11: invokevirtual #22 // Method add:(II)I
14: istore_2
JVM Stacks JVM Heap
main() Stack frame
Operand Stack
Local Variable
0 args
Operand Stack 값을 pop해서 Local Variable의
index 2번에 저장한다.
1 adder
초기화가 완료된
Adder Instance
constant
pool
1
2
…
5
2 7
Method
Area
61. public static void main(java.lang.String[]);
Code:
[…]
14: istore_2
15: getstatic #24 // Field java/lang/System.out:Ljava/io/PrintStream;
JVM Stacks JVM Heap
main() Stack frame
Operand Stack
Local Variable
0 args
PrintStream에 대한 reference를 얻어 operand
stack index 0에 저장한다.
1 adder
초기화가 완료된
Adder Instance
constant
pool
1
2
…
5
2 7
PrintStream
Instance
0 out
Method
Area
class
variables
62. public static void main(java.lang.String[]);
Code:
[…]
15: getstatic #24 // Field java/lang/System.out:Ljava/io/PrintStream;
18: iload_2
JVM Stacks JVM Heap
main() Stack frame
Operand Stack
1 7
0 out
Local Variable
0 args
Local Variable index 2 값을 operand stack에
push 한다.
1 adder
초기화가 완료된
Adder Instance
class
variables
constant
pool
1
2
…
5
2 7
Method
Area
PrintStream
Instance
63. public static void main(java.lang.String[]);
Code:
[…]
18: iload_2
19: invokevirtual #30 // Method java/io/PrintStream.println:(I)V
JVM Stacks JVM Heap
main() Stack frame
Operand Stack
Local Variable
0 args
PrintStream 인스턴스의 println() 메소드에
operand 값을 인자로 전달한다.
1 adder
초기화가 완료된
Adder Instance
class
variables
constant
pool
1
2
…
5
2 7
Method
Area
PrintStream
Instance
println() Stack frame
Operand Stack
Local Variable
1 7
0 this
64. 애플리케이션을 종료한다.
JVM Stacks JVM Heap
class
variables
constant
pool
1
2
…
5
public static void main(java.lang.String[]);
Code:
[…]
19: invokevirtual #30 // Method java/io/PrintStream.println:(I)V
22: return
초기화가 완료된
Adder Instance
시간이 지나면 Garbage
Collector에 의해 GC
대상이 된다.
Method
Area
PrintStream
Instance
66. package net.slipp;
public class Adder {
private int i;
private int j;
Adder(int i, int j) {
this.i = i;
this.j = j;
}
public int add() {
return i + j;
}
public static void main(String[] args) {
Adder adder = new Adder(5, 2);
int result = adder.add();
System.out.println(result);
}
}
67. D:next-workspaceworkspacejavabin>javap -c net/slipp/Adder
Compiled from "Adder.java"
public class net.slipp.Adder {
net.slipp.Adder(int, int);
Code:
0: aload_0
1: invokespecial #11 // Method java/lang/Object."<init>":()V
4: aload_0
5: iload_1
6: putfield #14 // Field i:I
9: aload_0
10: iload_2
11: putfield #16 // Field j:I
14: return
public int add();
Code:
0: aload_0
1: getfield #14 // Field i:I
4: aload_0
5: getfield #16 // Field j:I
8: iadd
9: ireturn
public static void main(java.lang.String[]);
Code:
0: new #1 // class net/slipp/Adder
3: dup
4: iconst_5
5: iconst_2
6: invokespecial #26 // Method "<init>":(II)V
9: astore_1
10: aload_1
11: invokevirtual #28 // Method add:()I
14: istore_2
15: getstatic #30 // Field
java/lang/System.out:Ljava/io/PrintStream;
18: iload_2
19: invokevirtual #36 // Method java/io/PrintStream.println:(I)V
22: return
}
68. public static void main(java.lang.String[]);
Code:
0: new #1 // class net/slipp/Adder
3: dup
JVM Stacks Method
Area
JVM Heap
main() Stack frame
Operand Stack
1 adder
Local Variable
0 args
Adder Instance
0 adder
78. public class Adder {
int add(int i, int j) {
return i + j;
}
}
JVM Stacks
main() Stack frame
Operand Stack
Local Variable
1 adder
0 args
add() Stack frame
Operand Stack
1 2
0 5
Local Variable
2 2
1 5
0 adder
사용자 1 = Thread 1
JVM Stacks
main() Stack frame
Operand Stack
Local Variable
1 adder
0 args
add() Stack frame
Operand Stack
1 2
0 5
Local Variable
2 2
1 5
0 adder
사용자 2 = Thread 2
79. JVM Stacks JVM Heap
main() Stack frame
Operand Stack
Local Variable
1 adder
0 args
constant
pool
1
2
…
5
Adder Instance
int i = 5
int j = 2
Method
Area
80. JVM Heap
Adder Instance
int i = 5
int j = 2
사용자 1 = Thread 1
사용자 2 = Thread 2
public class Adder {
private int i;
private int j;
Adder(int i, int j) {
this.i = i;
this.j = j;
}
}
81. Java API Execution
Class Loader
Engine Java Class
System
Runtime Data Areas
PC
Registers
JVM
Stacks
Files
Native
Method
Libraries
Method
Area
Heap Native
Method
Stacks
JVM의 Stacks 영역은 Thread 별로(사용자) 생성된다. 따라서 각 Stacks 영역 사이에는
영향을 미치지 않는다. 이를 Thread Safe하다고 한다.
JVM의 Heap 영역은 모든 Thread가 공유한다. 따라서 Heap에 존재하는 Object의 상태
값은 Thread 사이에 영향을 받는다. 이를 Thread Safe하지 않다고 한다.
82. public class Adder {
int add(int i, int j) {
return i + j;
}
public static void main(String[] args)
{
Adder adder = new Adder();
int result = adder.add(5,2);
}
}
사용자 1 = Thread 1
사용자 2 = Thread 2
Adder는 Heap 영역에서 관리하는 상태 값은 없다. 모든 값은 각 Thread별로 생성되는
Stacks에서 관리한다.
위 Adder 클래스는 Heap 영역에 인스턴스 하나를 생성한 후 모든 Thread에서
재사용할 수 있다.
83. public class Adder {
private int i;
private int j;
Adder(int i, int j) {
this.i = i;
this.j = j;
}
public int add() {
return i + j;
}
public static void main(String[] args) {
Adder adder = new Adder(5, 2);
int result = adder.add();
System.out.println(result);
}
}
사용자 1 = Thread 1
사용자 2 = Thread 2
Adder는 Heap 영역에서 i, j에 대한 상태 값을 관리하고 있다. 즉, Thread Safe하지 않다.
위 Adder 클래스는 각 Thread별로 독립적으로 실행하려면 매번 인스턴스를 생성해야 한다.
85. public class Calculator {
int add(int i, int j) {
i = 5;
j = 3;
return i + j;
}
public static void main(String[] args) {
Calculator calculator = new Calculator();
int i = 3;
int j = 2;
System.out.println("before i : " + i);
System.out.println("before j : " + j);
calculator.add(i, j);
System.out.println("after i : " + i);
System.out.println("after j : " + j);
}
}
86. public static void main(String[] args) {
Calculator calculator = new Calculator();
int i = 3;
int j = 2;
calculator.add(i, j);
JVM Stacks Method
Area
JVM Heap
main() Stack frame
Operand Stack
Local Variable
2
3
1 calculator
0 args
초기화가 완료된
add() Stack frame Calculator Instance
Operand Stack
Local Variable
3
2
}
87. int add(int i, int j) {
i = 5;
j = 3;
return i + j;
JVM Stacks Method
Area
JVM Heap
main() Stack frame
Operand Stack
Local Variable
3 2 2
3
1 calculator
0 args
초기화가 완료된
add() Stack frame Calculator Instance
Operand Stack
Local Variable
1 3
0 calculator
2
2
}
88. int add(int i, int j) {
i = 5;
j = 3;
return i + j;
JVM Stacks Method
Area
JVM Heap
main() Stack frame
Operand Stack
Local Variable
3 2 3
3
1 calculator
0 args
초기화가 완료된
add() Stack frame Calculator Instance
Operand Stack
Local Variable
1 5
0 calculator
2
2
}
89. Call by value
자바의 기본 자료형(primitive type)은 call by value에 의해서 동작한다.
즉, 메소드를 호출할 때 전달되는 인자의 값이 복사된다.
90. public class Student {
String name;
public Student(String name) {
this.name = name;
}
}
public class MessageRenderer {
public void callByReference(Student student) {
student.name = "예은";
}
public static void main(String[] args) {
Student student = new Student("주한");
MessageRenderer mr = new MessageRenderer();
mr.callByReference(student);
System.out.println("Name : " + student.name);
}
}
Case 1
91. JVM Stacks Method
Area
JVM Heap
main() Stack frame
Operand Stack
Local Variable
1 student
0 args
name = “주한”
Student Instance
callByReference()
Stack frame
Operand Stack
Local Variable
Case 1
public static void main(String[] args) {
Student student = new Student("주한");
MessageRenderer mr = new MessageRenderer();
mr.callByReference(student);
System.out.println("Name : " + student.name);
}
92. JVM Stacks Method
Area
JVM Heap
main() Stack frame
Operand Stack
Local Variable
1 student
0 args
name = “주한”
Student Instance
callByReference()
Stack frame
Operand Stack
Local Variable
Case 1
public static void main(String[] args) {
Student student = new Student("주한");
MessageRenderer mr = new MessageRenderer();
mr.callByReference(student);
System.out.println("Name : " + student.name);
}
public void callByReference(Student student) {
student.name = "예은";
}
0 student
93. JVM Stacks Method
Area
JVM Heap
main() Stack frame
Operand Stack
Local Variable
1 student
0 args
name = “예은”
Student Instance
callByReference()
Stack frame
Operand Stack
Local Variable
Case 1
public static void main(String[] args) {
Student student = new Student("주한");
MessageRenderer mr = new MessageRenderer();
mr.callByReference(student);
System.out.println("Name : " + student.name);
}
public void callByReference(Student student) {
student.name = "예은";
}
0 student
94. JVM Stacks Method
Area
JVM Heap
main() Stack frame
Operand Stack
Local Variable
1 student
0 args
name = “예은”
Student Instance
Case 1
public static void main(String[] args) {
Student student = new Student("주한");
MessageRenderer mr = new MessageRenderer();
mr.callByReference(student);
System.out.println("Name : " + student.name);
}
95. public class Student {
String name;
public Student(String name) {
this.name = name;
}
}
public class MessageRenderer {
public void callByReference(Student student) {
student = new Student("예은");
}
public static void main(String[] args) {
Student student = new Student("주한");
MessageRenderer mr = new MessageRenderer();
mr.callByReference(student);
System.out.println("Name : " + student.name);
}
}
Case 2
96. JVM Stacks Method
Area
JVM Heap
main() Stack frame
Operand Stack
Local Variable
1 student
0 args
name = “주한”
Student Instance
callByReference()
Stack frame
Operand Stack
Local Variable
Case 2
public static void main(String[] args) {
Student student = new Student("주한");
MessageRenderer mr = new MessageRenderer();
mr.callByReference(student);
System.out.println("Name : " + student.name);
}
97. JVM Stacks Method
Area
JVM Heap
main() Stack frame
Operand Stack
Local Variable
1 student
0 args
name = “주한”
Student Instance
callByReference()
Stack frame
Operand Stack
Local Variable
Case 1
public static void main(String[] args) {
Student student = new Student("주한");
MessageRenderer mr = new MessageRenderer();
mr.callByReference(student);
System.out.println("Name : " + student.name);
}
public void callByReference(Student student) {
student = new Student(“예은”);
}
0 student
98. JVM Stacks Method
Area
JVM Heap
main() Stack frame
Operand Stack
Local Variable
1 student
0 args
name = “주한”
Student Instance
callByReference()
Stack frame
Operand Stack
Local Variable
Case 1
public static void main(String[] args) {
Student student = new Student("주한");
MessageRenderer mr = new MessageRenderer();
mr.callByReference(student);
System.out.println("Name : " + student.name);
}
public void callByReference(Student student) {
student = new Student(“예은”);
}
0 student
name = “예은”
Student Instance
99. JVM Stacks Method
Area
JVM Heap
main() Stack frame
Operand Stack
Local Variable
1 student
0 args
name = “주한”
Student Instance
Case 1
public static void main(String[] args) {
Student student = new Student("주한");
MessageRenderer mr = new MessageRenderer();
mr.callByReference(student);
System.out.println("Name : " + student.name);
}
100. Call by reference
자바의 모든 객체(인스턴스)는 call by reference에 의해서 동작한다.
즉, 메소드를 호출할 때 전달되는 인자는 값이 아니라 참조하고 있는 주소 값이 전달된다.