-
[Java] #1 변수(Variable)와 메모리(Memory)Software engineer/Java 2023. 4. 27. 23:44
변수
변수는 값을 저장하는 공간이다.
변수란?
"Hello World!"라는 문자를 사용하는 프로그램이 있다고 가정했을 때, 사용하는 부분마다 "Hello World!", "Hello World!", "Hello World!", "Hello World!",.... 계속해서 이렇게 쓸 수도 있겠지만.
String str = "Hello World!";위와 같이 str이라는 변수에 저장해서 필요한 곳에서 str을 호출해서 사용할 수 있다.
변수의 타입
변수는 그 공간에 저장되는 데이터의 형태에 따라 기본형(Primitive)과 참조형(Reference)으로 구분됩니다.
구분 타입 크기 기본값 범위 정수 byte 1 byte 0 -128 ~ 127 short 2 bytes 0 -32,768 ~ 32,767 int 4 bytes 0 -2,147,483,648 ~ 2,147,483,647 long 8 bytes 0L -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 실수 float 4 bytes 0.0F 1.4E-45 ~ 3.4E38 double 8 bytes 0.0 4.9E-324 ~ 1.8E308 논리 boolean 1 byte false true, false 문자 char 2 bytes `\u0000` '\u0000' ~ '\uffff' (0 ~ 65535) 기본형 타입 표
기본형 변수타입의 대한 특징으로는 다음과 같습니다.
- 모두 소문자로 시작한다.
- 비객체 타입으로 null값을 가질 수 없다.
- 변수의 선언과 동시에 메모리에 생성된다.
- 메모리의 스택 영역에 저장한다.
- 기본타입 변수는 실제 자료값을 갖는다.
참조형 타입은 위의 8가지 기본형 타입을 제외한 나머지 모두를 말합니다.
- null 값을 가질 수 있다.
- 실제값이 저장된 주소값을 갖는다.
- 실제값은 메모리의 Heap 영역에 저장되며, Heap 영역의 주소값을 Stack 영역에 저장한다.
Long refLong = null; long priLong = 0L; // long priLong = null; syntax error System.out.println("refLong=" + refLong); System.out.println("priLong=" + priLong);사용 중인 IntelliJ에서 위에 코드를 작성하면 Long 타입은 참조형 타입으로 null값을 가질 수 있지만, long은 기본형 타입으로 null을 선언하면 syntax error가 발생했습니다.
메모리

JVM 구조 Java는 컴파일러를 통해 컴퓨터가 이해할 수 있는 바이트코드(*. class)로 만들어집니다. 만들어진 바이트코드(*. class)는 JVM에 의해 동작합니다. JVM은 바이트코드를 실행하기 위해 저장공간을 할당받아 사용하는데 이 부분을 Runtime Data Areas라고 합니다. 이중 Stack 영역과 Heap 영역이 변수가 저장되는 공간입니다.
변수가 메모리에 저장되는 형태
// primitive type int a = 34; // reference type String b = "java";
a, b의 메모리 구조 기본 타입인 a는 Stack 영역에 a=34라고 저장되지만, 참조 타입인 b는 실제 값은 Heap 영역에 있으며 해당 영역의 주소값을 Stack에서 가지고 있습니다.
참고!
boolean 타입의 크기에 대해서 찾아보던 중 여러가지 의견들이 있었습니다.
Java의 boolean의 크기는 몇일까?
논리형 type 'boolean'은 왜 1bit가 아닌 1byte의 크기를 가질까?'Software engineer > Java' 카테고리의 다른 글
[Java] #5 제네릭(Generics), 이넘(Enum), 어노테이션(@, Annotation) (3) 2023.05.01 [Java] #4 배열(Array), 컬렉션(Collection), 맵(Map) (3) 2023.04.30 [Java] #3 제어문(Control statements) (2) 2023.04.28 [Java] #2 연산자(Operator) (0) 2023.04.28 [Java] #0 Java의 탄생 (1) 2023.04.25