목차
■ 데이터 타입 분류:
#기본형변수와 참조형변수
자바가 가지는 데이터 타입 크게 두 가지: Primitive vs Reference
int age = 25; age는 기본타입이다. (원시타입이라고도 말한다)
그래서 age는 25란 값을 실제로 가지는 것이다. 25란 값을 age에 바로 저장한다. (참고로 25는 스택 영역에 있다)
String hobby = "독서"; String은 참조타입이다.
hobby가 가지는 값은, "독서" 자체가 아니라, "독서"란 값을 가지는 객체의 주소이다. (
그래서 참조 타입 변수를 비교할 때는 살짝 더 깊게 생각해야 한다.
아래 그림을 보자
price의 값은 100.5이다. age의 값은 25이다.
하지만 name의 값은 100이 아니라 100번지로 보아야하고, hobby의 값은 200이 아니라 200번지로 보아야한다.
100번지는 신용권이 있고, 200번지에는 독서가 있는 것이다.
그래스 문자열을 String 변수에 저장한다는 말은 사실 틀린 표현이다. 문자열이 직접 변수에 저장되는 것이 아니기 때문이다. 문자열은 String 객체로 생성되고, 변수는 String 객체를 참조한다.
String hobby = "jogging"; 이라고 하였을 때...
hobby변수는 스택 영역에 생성되고, 문자열 리터럴인 "jogging"은 힙 영역에 스트링 객체로 생성되는 것이고, hobby 변수에 저 스트링 객체의 주소값이 저장된다는 것을 꼭 명심하자.
기본타입 변수에서는 리터럴이 같으면 같은 값이다. int a = 5; int b = 5;라면. a와 b는 무조건 같은 변수다.
하지만, 참조타입에서는 같은 주소값이다 = 같은 객체를 가리킨다 = 같은 변수다. 라는 개념으로 접근해야한다.
달리 말하면, 다른 주소값이다 = 다른 객체를 가리킨다라는 뜻이다. 옆 동네 살고 있을지도 모를 동명이인을 상상해보자. 주소가 다르면, 다른 사람이다. 똑같은 "Justin", "Justin"이더라도, 주소가 다르면 비교 연산 (==)에서 false가 뜰 것이다.
스트링은 리터럴이 같으면 일단은 같은 객체를 참조하게 된다.
■ 메모리 사용 영역
컴퓨터 프로그램이 실행되기 위해 필요한 메모리 = 메인 메모리 = 램.
이 메인 메모리를 관리하는 것이 OS이고 JVM은 OS로부터 필요한만큼의 메모리를 할당 받는다.
전문 용어로 OS로부터 받은 메모리 공간을 Runtime Data Area라고 하는데, 이 Area를 5개 영역으로 쪼개서 관리한다.
Method Area /Heap Area/JVM Stack Area/Native Method Stack Area/PC Register크게는 메소드, 힙, 스택 영역이라고 볼 수 있다.
**메소드 영역 추가 설명**
Recall: 자바 프로그램 실행 절차 from Chapter 1
자바 소스 파일 (.java)가 작성되면 → 컴파일러는 javac.exe로 클래스 바이트 코드 (.class) 파일을 생성하고
→ java.exe로 JVM을 구동시키면 → JVM은 main() 메소드를 찾아 그 메소드 블록을 실행!
즉 JVM이 메인 메소드를 부르는 것부터가 프로그램의 시작이다. 그러려면, 먼저 그 바이트 코드(.class) 파일이 메모리 공간에 저장/준비되어있어야 한다. 바이트 코드 파일이 메소드 영역에 올라가는 것을 "클래스 로딩"이라고 부른다. 만약, 어떤 메소드를 호출하는 문장을 만났는데, 그 메소드를 가진 바이트 코드가 아직 로딩된적 이 없다면 (=메소드 영역에 없다면), 곧바로 JVM은 JRE 라이브러리 폴더에서 해당 클래스를 찾는다. 그래도 없으면, classpath 환경변수 지정된 폴더에서 찾아낼 것이다.
계속 Push & Pop 되는 JVM Stack 영역, 가비지 콜랙터가 가동되어 참조 안되는 객채/배열이 지워지는 힙 영역과는 달리, 한 번 로딩된 클래스 바이트 코드는 JVM이 종료될 때까지 유지된다.
◆ Null , NullPointerException
참조 타입 변수는 힙 영역의 객체를 참조하지 않는다는 뜻으로 null값을 가질 수 있으며, 이 null 값도 초기화 선언할 때 지정 가능하다. 만약 참조 타입 변수가 null을 가리키는지 확인하려면, == null; 이라고 boolean 연산식을 써보자.
※ 출처: 이것이 자바다 신용권의 Java 프로그래밍 정복 - 한빛미디어