[항해99] Pre-onboarding 5일차
항해99 Pre-onboarding 1주차 항해일지 <5day - TIL>
📍Today I Learn(Day 5 - Chapter 5)
배운 것 :
- 참조 타입과 참조 변수
- 메모리 사용 영역
참조타입이란?
📌 객체(object)의 번지를 참조하는 타입으로 배열,열거,클래스,인터페이스를 뜻함
(1.1) 기본타입과 참조타입
- 해당 부분은 1일차 TIL작성시 살펴보았던 내용으로, 작성했던 내용을 인용하였다.
✔ 자바의 기본형과 참조형
Java Data Type
✏️ Primitive Type
ㄴ Boolean Type(boolean)
ㄴ Numeric Type
ㄴ Integral Type
ㄴ Integer Type(short, int, long)
ㄴ Floating Point Type(float, double)
ㄴ Character Type(char)
✏️ Reference Type
ㄴ Class Type
ㄴ Interface Type
ㄴ Array Type
ㄴ Enum Type
ㄴ etc.
👉 기본형의 특징
자바에서 기본 자료형은 반드시 사용하기 전에 선언되어야함
OS에 따라 자료형의 길이가 변하지 않음
비객체 타입으로 따라서 null 값을 가질 수 없음.
(1.2) 참조형변수란 ?
기본형 변수에는 리터럴, 실제값이 저장되지만 참조형 변수에는 실제 값이 아닌 주소값을 저장한다.
번지를 통해 객체를 참조한다는 뜻에서 참조 타입이라고 부른다.
ex) Class Type, Interface Type, Array Type, Enum Type 등
(1.3) 기본형과 참조형 변수의 차이
*) 차이를 알기 위해서는 먼저 간단히 메모리 구조를 알아야한다.
간단하게 3개의 영역으로 나누면 위와 같고, 이 구조에서보는 기본형과 참조형 변수의 차이는,
⬛ 기본형 변수는 실제의 값이 저장되는데, 변수 선언시 Stack영역에 선언한 변수 만큼의 공간이 생성되며 그 공간안에 값이 들어간다
🟥 참조형 변수는 기본형 변수처럼 Stack 영역에 변수의 이름을 가진 공간이 생성되고, new라는 명령어가 Heap 영역에 새로운 공간을 생성한다.
🟥 공간의 크기는 넣으려는 값만큼, 그리고 할당받은 메모리 주소값을 Stack영역에 생성된 변수라는 장소에 저장한다.
🟨 요약)
기본형 변수는 Stack영역에서 실제값을 그대로 저장
참조형 변수는 Stack영역에 공간을 생성하고, Heap영역에도 공간을 생성하여 실제값을 저장한다음 그 공간의 주소값을 Stack영역에 저장한다.
메모리 사용 영역
- jvm의 메모리 구조를 그려보면 아래와 같다.
💡 Class Loader
- JVM내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈
- 런타임시에 동적으로 클래스를 로드한다.
(런타임 환경은 프로그램 실행을 위해 클래스 파일을 로드하고 메모리 및 기타 시스템 리소스에 대한 액세스를 확보한다.)
💡 Execution Engine
- Execution Engine은 메모리(RuntimeDataArea)에 할당된 byteCode를 실행하는 역할을 담당한다.
- 구성 요소 : Interpreter 등
💡 Garbage Collector
- GC는 RuntimeDataArea의 Heap 영역에 생성된 객체들 중에서 더 이상 참조되지 않는 객체를 탐색 후 제거한다.
📍JVM의 메모리 영역
*) Runtime Data Area는 JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역
1️⃣ Method Area
- JVM이 시작할때 생성되고 모든 스레드가 공유하는 영역
- 코드에서 사용되는 Class들을 클래스로더로 읽어 클래스별로 정적 필드와 상수, 메소드 코드, 생성자 등을 분류해서 저장
2️⃣ Heap Area
- 객체와 배열이 생성되는 영역으로, 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조한다.
- 만일 참조하는 변수나 필드가 없다면, 의미없는 객체로 판단하여 GC가 제거한다.
3️⃣ JVM Stack
- 메소드를 호출할 때 마다 각각의 스텍 프레임(메서드만을 위한 공간)을 생성하고,
그 메서드안에서 사용되는 값들을 저장한다. - 호출된 메서드의 매개변수,지역변수,리턴값 및 연산시 일어나는 값들을 임시로 저장하기도한다.
- 메소드가 종료되면 해당 프레임을 제거하는 역할을 수행한다.
4️⃣ PC register, Native method stack
- PC register는 쓰레드가 시작될 때 생성되며, 쓰레드마다 하나씩 존재
ㄴ 쓰레드가 어떤 부분을 무슨 명령어로 실행할지에 대한 부분을 기록하며 현재 수행중인 JVM 명령어의 주소를 갖는다 - Native method stack은 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역
📎 참조 변수의 ==, != 연산
- 참조 타입 변수들간의 ==, != 연산은 동일한 객체를 참조하는지/다른 객체를 참조하는지 알아볼 때 사용함
📎 null과 NullpointerException
- 참조타입변수는 힙 영역의 객체를 참조하지 않는다는 뜻으로 Null값을 가질 수 있다.
- NullpointerException은 참조타입의 변수를 잘못 사용했을때 발생하는 예외로 아래와 같은 경우에 발생한다
- 참조변수가 Null을 가지고 있을 때
( = 변수가 참조하는 객체가 없을 경우 )
- 참조변수가 Null을 가지고 있을 때
📎 String 타입
- 문자열은 직접 변수에 저장되는 것이 아니라, 문자열은 String 객체로 생성되고 변수는 String 객체를 참조
#문자열 생성문
String name1 = new String("신용권");
String name1 = "신용권";
*) 동일한 문자인 리터럴로 String객체를 생성했을 경우 ==의 결과는 true가 나오지만, new 연산자로 String 객체를 생성했을 경우 ==연산의 결과는 flase가 나오게 됨
- 만일 다른 객체인것과 상관없이 내부 문자열을 비교하고 싶을때는 eqals메소드 사용필요
🔍 참조를 잃은 String 객체는 ?
- 참조되지 않는 객체는 쓰레기 객체로 취급하고, GC를 구동시켜 메모리에서 자동 제거한다