자바의 타입은 기본 타입(primitive type)과 참조 타입(reference type)으로 나뉜다
기본 타입 변수 - 변수와 값이 stack영역에 직접 저장
참조 타입 변수 - 값은 주소를 할당받아 heap영역에 저장되고 stack영역에는 변수와 값을 참조할 수 있는 주소가 저장
Java를 실행하기 위한 가상의 기계로 JVM은 Java를 OS에 종속받지 않고 실행하기 위해서 사용한다
JVM을 사용함으로써 CPU가 Java를 인식하고 실행할 수 있게된다
이전 C/C++은 컴파일된 플랫폼과 실행될 타겟 플랫폼이 다를 경우 프로그램이 동작하지 않았다
OS마다 지원하는 System Call interface가 다르고
CPU마다 지원하는 Instruction Set Architecture이 달라
바이트코드의 변환 방법이 달라 코드가 동작하지 않기 때문이다
C/C++는 이 문제를 크로스 컴파일(Cross Compile)로 해결했다
크로스 컴파일이란 타겟이 될 플랫폼에 맞춰 컴파일 하는것이다
크로스 컴파일을 함으로써 C/C++도 여러 플랫폼에서 동작할 수 있게 되었다
하지만 Java의 bytecode는 타겟 플랫폼과 관계없이 JVM 위에서 동작하게 된다
사용자는 플랫폼에 맞는 전용 JVM을 설치하기만 하면 된다
Java의 소스코드(?.java)는 CPU가 인식할 수 있도록 기계어로 compile 해야한다
Java는 JVM을 거쳐서 Java bytecode(?.class)로 하게된다
(.class 파일은 Java bytecode를 담고있는 파일이다)
Java compiler가 .java를 .class라는 Java bytecode로 변환한다
하지만 변환된 Java bytecode는 기계어가 아니기 때문에 바로 실행되지않고
JVM이 OS가 Java bytecode를 이해할 수 있도록 해석해주면서 실행되게 된다
class loader
runtime date area
JVM이 Java bytecode를 실행할 때 사용하는 메모리 영역
method area
heap
Java stack
PC registers
native method stacks
execution engine
GC(Garbage Collector)은 Mark와 Sweep과정으로 수행된다
public class Self_04_1_5 {
public static void main(String[] args) {
String name1 = "홍길동";
String name2 = "홍길동";
String name3 = new String("홍길동");
String name4 = new String("홍길동");
String name5 = new String("홍길동").intern();
System.out.println(name1 == name2);
System.out.println(name3 == name4);
System.out.println(name1 == name5);
}
}
> Task :Self_04_1_5.main()
true
false
true
String name1 = "홍길동" 의 경우
String name3 = new String("홍길동") 의 경우
new String으로 생성한 Object를 String pool에 저장하기 위해서 intern()을 사용한다
그러면 heap영역내부 String pool외부에 있던 name5의 홍길동이 String pool내부로 들어가
name1과 name5를 비교하면 같은 주소를 참조하여 true가 나오게 된다