[CS] Primitive type & Reference type

박상민·2023년 3월 1일
0

Computer Science

목록 보기
6/29

💡 JVM Runtime Data Area

  • 모든 스레드 공유하는 메모리 영역 (GC 대상)
    1. 힙 영역 : new 키워드로 생성된 객체와 배열이 생성되는 영역
    2. 메서드 영역 : 클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보와 같은 각종 필드 정보들과 메서드 정보, 데이터 type 정보, Constant Pool, static 변수, final class 등이 생성되는 영역
  • 특정 스레드에 국한되는 메모리 영역
    1. 스택 영역 : 지역변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값 등이 생성되는 영역
    2. PC 레지스터 : Thread가 생성될 때마다 생성되는 영역으로 프로그램 카운터, 현재 스레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역
    3. 네이티브 메서드 스택 : Java가 아닌 C, C++로 작성된 메서드의 실행 스택 영역

💡 Constant Pool

  • 런타임 영역에 생성되는 static 상수 저장소이다.
  • 상수 풀은 Method Area, 정적영역에 있는 메모리기 때문에 GC의 대상에서 제외된다.
  • Constant Pool 객체에 저장되며 아래와 같은 상수 객체를 가진다.
// 상수 풀에 저장되는 상수 객체
cp_info {
	u1 tag;		//태그
    u1 info[];	// 값
}
/*
tag는 1바이트 숫자로 구성되며 JVM 에게 아래와 같은 타입을 제공한다.
Utf8: 1
Integer: 3 (Boolean, Short, Byte도 여기에 해당됨)
Float: 4
Long: 5
Double: 6
Class reference: 7
String reference: 8
*/

📌 Primitive type (기본형 타입)

Primitive type

  • 8가지의 Primitive type을 미리 정의하고 제공하고 있다.
  • 기본 자료형은 반드시 사용하기 전에 선언되어야 한다.
  • OS에 따라 자료형의 길이가 변하지 않는다.
  • 비객체 타입이기 떄문에 null의 값을 가질 수 없으며, 넣기 위해서는 Wrapper Class으로 박싱하여 사용해야 한다.
  • 스택 메모리에 저장된다.
  1. boolean

    • 논리형인 boolean의 기본값은 false이며 참과 거짓을 저장하는 타입이다.
    • 두가지 값만 표현하므로 가장 크기가 작다.
    • 데이터를 다루는 최소 단위가 1byte 이므로 메모리 크기가 1byte 이다.
  2. byte

    • 이진 데이터를 다루는데 사용되는 타입이다.
  3. short

    • C언어와의 호환을 위해 사용되는 타입으로 잘 사용되지 않는 타입이다.
  4. int

    • 정수 연산을 하기 위한 기본 타입이다.
    • byte 또는 short의 변수가 연산을 하면 연산의 결과는 int형이 된다.
  5. long

    • 수치가 큰 데이터를 다루는 프로그램에서 주로 사용되는 타입이다.
    • long 타입의 변수를 초기화 할 때에는 정수값 뒤에 'L'을 붙혀서 long타입의 정수 데이터임을 명시해야 한다.
      long longTypeValue = 2147483648;	// 컴파일 에러 발생 (int의 범위를 넘는다.)
      long longTypeValue = 2147483648L;	// 'L'을 붙혀 long타입의 값이라는 것을 명시하면 컴파일 에러가 발생하지 않는다.
    • 만약 정수값이 int의 범위를 넘는 정수에서 L을 붙히지 않는다면 컴파일 에러가 발생한다.
  6. float, double

    • 실수를 가수와 지수 형식으로 저장하는 부동소수점 방식으로 저장되는 타입이다.
    • 가수를 표현하는데에 있어 double형이 float형보다 표현 가능 범위가 더 크기 때문에 double형이 보다 정밀하게 표현할 수 있다.
    • 자바에서 실수의 기본타입은 double형이기 때문에 float형에는 'F'를 붙여서 float 형임을 명시해야 한다.
      float f = 1234.567;		// double형이 기본형이기 때문에 컴파일 에러 발생
      float f = 1234.567F;	// 'F'를 붙혀 float타입이라는 것을 명시하면 컴파일 에러가 발생하지 않는다.

📌 Reference type (참조형 타입)

  • 클래스 타입(class type), 인터페이스 타입(interface type), 배열 타입(array type), 열거 타입(enum type)으로 나눠진다.
  • Primitive type을 제외한 타입들이 모두 Reference type이다.
  • Java에서 최상위 클래스인 'java.long.Object' 클래스를 상속하는 모든 클래스를 뜻한다.
  • new로 인해서 생성되는 객체들은 메모리 영역인 Heap영역에 생성되고, Garbage Collector가 돌면서 메모리를 해제한다.
  • 빈 객체를 의미하는 null이 존재한다.
  • Heap메모리에 생성된 객체들은 메소드나 각종 인터페이스에서 접근하기 위해 JVM의 Stack영역에 존재하는 Frame에 일종의 포인터인 참조값을 가지고 있어 이를 통해 인스턴스를 핸들링한다.
    Java의 인스턴스 핸들링

📌 String Class

  • 형식은 참조형에 속하지만 기본적인 사용은 기본형처럼 사용한다.
  • 불변하는 객체이다. ( = 한번 생성하면 수정할 수 없고, 새로 생성해야만 한다.)
  • 값을 변경하는 메소드들이 존재하지만, 해당 메소드를 통해 데이터를 바꾼다해도 수정하는 것이 아닌 새로운 String클래스 객체를 생성하는 것이다.
  • 일반적으로 기본형은 비교연산자(=)를 사용하지만 String은 참조형이기 떄문에 객체간 비교메서드인 equals()를 사용해야 한다.
profile
💡 클린코드를 지향하는 Backend Developer

0개의 댓글