[항해99] Pre-onboarding 5일차

kyuu·2022년 11월 11일
0

항해99

목록 보기
10/19
post-thumbnail

항해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을 가지고 있을 때
      ( = 변수가 참조하는 객체가 없을 경우 )

📎 String 타입

  • 문자열은 직접 변수에 저장되는 것이 아니라, 문자열은 String 객체로 생성되고 변수는 String 객체를 참조
#문자열 생성문
String name1 = new String("신용권");
String name1 = "신용권";

*) 동일한 문자인 리터럴로 String객체를 생성했을 경우 ==의 결과는 true가 나오지만, new 연산자로 String 객체를 생성했을 경우 ==연산의 결과는 flase가 나오게 됨

  • 만일 다른 객체인것과 상관없이 내부 문자열을 비교하고 싶을때는 eqals메소드 사용필요

🔍 참조를 잃은 String 객체는 ?

  • 참조되지 않는 객체는 쓰레기 객체로 취급하고, GC를 구동시켜 메모리에서 자동 제거한다
profile
엔지니어 꿈틀 개발자

0개의 댓글

관련 채용 정보