Java

메모리

징주 2021. 8. 8. 19:35

Reference Type

int [] a = {0,1};
stack에는 {0,1}의 주소를 가리키는 a가 저장되고
heap에는 {0,1}이 저장되어
a가 참조할때 {0,1}의 주소를 찾아가서 불러옴
변수가 선언된 괄호 끝나면 참조가 끝나서 가비지콜렉터에 의해 삭제된다

2차원배열 메모리

1차원배열은 생성과 동시에 자료형에 대한 디폴트 초기화를 진행한다.

예시)
int [] a = new int[2]; 일 경우
a[0] = 0;
a[1] = 0;

참조형변수는 디폴트 기본값이 null이고
2차원 배열은 1차원배열에 1차원 배열을 저장하는 것이므로 행에는 null값이 저장되어 있다.
열은 그냥 1차원 배열이므로 자료형에 맞게 디폴트초기화가 된다.

예시)
int [] [] a = new int[2][1]; 일 경우
a[0] = null , a[0][0] = 0
a[1] = null , a[1][0] = 0

인스턴스 멤버변수의 메모리

  • 클래스 {} 영역에 선언
public class Person{ 
    String name; 
}
  • 인스턴스 멤버변수의 생성 : 객체가 만들어질 때, 인스턴스 멤버변수는 객체 별로 생성된다. (객체마다 고유한 변수 값 유지)
  • 생성 메모리 영역 : heap
  • 인스턴스 멤버변수 초기화 : 타입 별로 디폴트 초기화
  • 인스턴스 멤버변수 접근 : 객체 생성 후 (메모리에 올린 후) 객체 이름으로 접근
Person p1 = new Person();
Person p2 = new Person();

p1.name = "김사람";
p2.name = "차도현";
  • Garbace Collector에 의해 객체가 없어질 때 소멸된다.

클래스 멤버변수의 메모리

  • 클래스 {} 영역에 선언, static 키워드
  • 클래스 멤버변수의 생성 : 클래스 로딩 시 메모리 등록
  • 모든 객체가 공유, 공유변수라고도 불린다.
  • 클래스 멤버변수의 초기화 : 타입 별로 디폴트 초기화
public class Person { 
    static String scientificName = "Homo Sapiens"; 
}
  • 클래스 멤버변수의 접근 : 클래스 이름으로 접근
Person.scientificName = "클래스를 통한 변경";
  • 프로그램 종료 시 소멸

지역변수 & 파라미터 변수

  • 선언위치 : 클래스 영역 이외의 모든 중괄호 안에 선언되는 변수들
  • 변수의 생성 : 선언된 라인이 실행될 때
  • 메모리 영역 : thread 별로 생성된 stack 영역
  • 초기화 : 사용 전 명시적 초기화
  • 접근 : 외부에서는 불가, 내부에서 변수이름으로 바로 접근
void call(String to){ //파라미터 변수 
    String beep = "삐"; //로컬변수 
    for(int i=0;i<5; i++){ //로컬변수 
        System.out.print(beep); 
    } 
}
  • 선언된 {}를 벗어나면 소멸

 

객체 메모리

Thread : 데이터, 메모리 등의 프로세스 자원을 이용해 실제로 작업을 수행하는 것.
Process : 프로그램을 수행하기 위해 필요한 데이터, 메모리, 쓰레드 등으로 구성되어 있는 것.