[JAVA] 변수, 메모리 구조

hyoogii·2022년 12월 15일
0

JAVA

목록 보기
1/3
post-thumbnail

1.변수와 타입

변수(variable)

변수란 값을 저장할 수 있는 메모리의 특정 번지에 붙이는 이름이다. 프로그램은 변수를통해 번지에 값을 저장하고 읽을 수 있다.

변수를 메모리의 어디에 저장하고 어떤 방식으로 저장할지는 프로그래밍 언어와 운영체제가 정하는데, 자바의 경우 JVM이 하게 된다.

** JVM (Java Virtual Machine)

자바가상머신으로, 자바 바이트 코드를 해석하고 실행하는 역할을 한다.
java 는 OS에 종속적이지 않는다는 특징을 가지고 있다.

일단 프로그램이 실행되면 JVM은 OS로부터 프로그램을 수행하는데 필요한 메모리를 할당받는다

이 메모리를 가지고 JVM은 용도에 따라 구분해서 사용한다.

  1. 자바 소스코드인 .java 파일을 컴파일러가 자바 바이트 코드인 .class 로 변환

** java 컴파일러?
JDK 를 설치하면 bin에 존재하는 javac.exe를 말한다.

  1. .class 코드를 JVM 클래스 로더에게 보낸다.
  2. 클래스 로더는 JVM 런타임 데이터 영역으로 로딩해 JVM의 메모리에 올린다.

cr. https://m.blog.naver.com/heartflow89/220954420688


2.메모리 영역

Static 영역(== class, Method 영역으로도 불림)

**: 전역변수나 static으로 선언되는 것들을 메모리에 상주시킨다. **
  • 클래스 정보, static변수, 변수정보, 메소드 정보 등을 저장
  • 패키지나 클래스 정보가 올라감
  • static이 선언된 클래스 멤버도 올라감
  • static 변수는 어디든 접근이 가능해지므로 읽기 전용이 아닌 경우 가능한 사용하지 않는다.
  • JVM이 시작할때 생성되는 공간으로 바이트코드가 이 영역에 저장됨. 클래스가 로딩될 때 생성된다.
  • JVM이 종료될때까지 유지된다.

Heap 영역

**: 힙 영역은 인스턴스를 생성할 때 생성되는 메모리 형식이다.**
Instance instance = new Instance(); 
  • "new"를 사용하여 객체를 만들 때 저장된다.
  • 참조형(class, interface, enum, Array 등) 자료형도 같이 저장된다.
    : 해당 객체가 소멸되기전이나 Garbage Collection 가 정리하기 전까지 이 영역에 남아 있음
  • Garbage Collection의 정리 대상임
  • 힙의 참조 주소는 "스택"이 갖고 있고 해당 객체를 통해서만 힙 영역에 있는 인스턴스를 핸들링 할 수 있습니다.

Stack 영역

: **지역변수나 메서드의 매개변수, 임시적으로 사용되는 변수, 메서드의 정보가 저장되는 영역**
  • 쓰레드 별로 1개만 생성된다.
  • 하나의 쓰레드는 내부적으로 static,stack,heap 영역을 갖게 된다.
  • 메서드가 호출될 때마다 생성하고, 메서드 실행이 끝나면 pop되어 제거된다.
Person p = new Person("홍길동",20);

p --> Stack 영역 저장
Person --> Heap 영역 저장

PC Register

: 스레드가 시작될때 생성되며, 현재 수행중인 JVM 명령어 주소를 저장하는 영역 
스레드가 어떤 부분을 어떤 명령어로 수행할지 저장하는 공간

Native Method Stack

:JAVA가 아닌 다른언어로 작성된 코드를 위한 영역


1-1.변수타입

기본형 (primitive type)

: 계산에 대한 실제 값을 저장한다. 총 8개
  • 논리형(boolean)
  • 문자형(char)
  • 정수형(byte,short,int,long)
  • 실수형(float,double)

참조형(reference type)

: 객체의 주소를 저장한다 기본형을 제외한 나머지 타입.

상수와 리터럴

상수

상수는 변수와 달리 한번 값을 저장하면 다른 값으로 변경할 수 없으며, 반드시 선언과 동시에 초기화 해야한다.
그 후 부터는 상수의 값을 변경하는 것이 허용되지 않는다.

** Jdk 1.6 부터 사용하기 전에만 초기화하면 되도록 바뀜

상수를 선언하는 방법은 변수와 동일하며, 단지 변수타입 앞에 키워드 'final'을 붙여주기만 하면 된다.

상수의 이름은 모두 대문자, 여러단어로 이루어져 있는 경우 '_'로 구분한다.

리터럴

: 그 자체로 값을 의미하는 것
int year = 2014;
final int MAX_VALUE = 100; 

/* year = 변수
	2014, 100 = 리터럴
    MAX_VALUE = 상수
*/

final int MAX_SPEED = 10; // 상수 선언&초기화 

profile
기록자

0개의 댓글