메모리 사용 영역 및 참조 타입

이동주·2025년 3월 2일

JAVA

목록 보기
10/30

메모리 사용 영역

자바 가상 머신의 전체 메모리 용량 : 4GB

메소드 영역

-> 바이트코드 파일을 읽은 내용이 저장되는 영역!
-> 클래스별로 상수, 정적 필드, 메소드 코드, 생성자 코드, 함수 등이 저장되는 영역
-> 메소드 코드의 용량은 대략 1MB 정도 밖에 안됨

힙 영역 (데이터 영역)

-> 객체가 생성되는 영역!
-> 객체 생성하고 만들어진 번지 (주소)를 메소드 영역과 스택 영역의 상수와 변수에서 참조 가능
-> 큰 메모리를 할당 받을 때 사용
-> 메소드 영역에 용량이 많이 남기 때문에 사용되는 것
-> new 연산자에 의해 객체가 생성됨
-> 실행되는 도중에 메모리가 할당되는 동적 메모리에 해당됨!

스택 영역 (데이터 영역)

-> 메소드를 호출할 때 생성되는 프레임이 저장되는 곳으로 변수를 선언하면 값을 저장할 수 있게 만들어지는 공간!
-> 함수가 실행될 때 사용되는 변수 영역
-> 메소드의 정보 (인자, 매개변수, 지역변수, 참조변수 등)는 이 곳에 데이터가 쌓임
-> 기본형 변수는 변수의 공간에 값이 저절로 생김
ex) int a라는 변수를 만들고 안에 10이라는 값을 넣으면
a라는 공간 안에 10이라는 값을 하나 저장하는 형태!
-> 함수의 실행이 끝날 때는 데이터가 다 사라짐
-> 용량은 64kb 정도로 지역변수를 많이 사용하지 않는 것이 좋음

참조 타입

객체의 번지를 참조하는 타입으로 사용자가 직접 정의함

  • 객체 : 데이터와 메소드의 기능을 모두 가지고 있는 것!

-> 데이터 타입에는 기본 타입과 참조 타입이 있음
-> 기본 타입에는 int, char, boolean, float 등과 같은 타입이 있음
-> 참조 타입의 종류
1) 배열 타입
2) 열거 타입 (나열)
3) 클래스
4) 인터페이스 (규약)

참조 변수

-> 값이 한 가지가 아닐 수 있기 때문에 일정한 값이 아니므로 배열에 사용되는 변수는 값을 참조하는 것만 가능해서 참조 변수라고 함
-> 직접적인 값이 아니라 값의 주소(번지)를 일컫음 (힙 영역에 생성된 값의 주소!)
-> 참조 변수의 형태에서 변수 부분은 stack, 참조 변수에 저장된 값은 heap!
-> 참조 변수는 무조건!! 4비트

참조 변수의 비교 연산자

-> 참조 변수의 비교 연산은 참조한 값이 저장된 힙 영역의 번지(주소)를 비교하는 것!
-> 값을 비교하는 기본형 변수의 비교 연산자와는 다름
-> 종류
1) a == b : a와 b가 참조하는 주소가 같은지
2) a != b : a와 b가 참조하는 주소가 다른지

package ch05.sec03;

public class ReferenceVariableExam {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr1;
		int[] arr2;
		int[] arr3;
		
		arr1 = new int[] { 1, 2, 3 };
		//new라는 구문을 사용하여 heap에 새로운 번지수를 만들어 값을 넣고, 그 번지수를 참조함
		arr2 = new int[] { 1, 2, 3 };
		//new라는 구문을 사용하여 heap에 새로운 번지수를 만들어 값을 넣고, 그 번지수를 참조함
		arr3 = arr2;
		//arr2의 번지수를 그대로 참조함
		
		System.out.println(arr1 == arr2); 
        // 변수의 값은 같지만 참조하는 heap 주소가 다르기 때문에 false
		System.out.println(arr2 == arr3); 
        // 변수의 값이 같고 참조하는 heap 주소도 같기 때문에 true
	}

}

위의 코드를 설명하자면
-> arr1과 arr2 new라는 연산자를 이용해 객체를 새로 생성하여 각 객체의 번지를 참조함
-> arr3은 arr2를 그대로 대입하여 내부의 값과 참조하는 번지가 같음
-> 따라서 arr1과 arr2는 다른 객체를 참조하므로 false
-> arr2와 arr3은 같은 객체를 참조하므로 true

Null, NullPointerException

Null

-> 참조형 변수에 값이 없는 것을 뜻함
-> 참조형 변수를 사용할 때 지시할 값이 없거나 초기값을 설정할 때 사용됨
-> 참조 변수에 null 값을 넣어주면 기존에 참조변수에 있었던 값은 다 사라짐

package ch05.sec04;

public class GarbageObject {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String hobby = "여행"; 
        // hobby라는 문자열 변수에 "여행"이라는 문자열 값을 넣음 (참조수 +1)
		hobby = null; 
        //hobby에 null 값을 집어넣음으로서 hobby에 있는 값을 쓰레기로 만듬! ("여행"은 사라짐)
		// 참조수 -1 = 0
		
		String kind1 = "자동차"; 
        //kind1 문자열 변수에 "자동차"라는 문자열 넣음 (참조수 +1 = 1)
		String kind2 = kind1; 
        //kind2 문자열 변수에 kind1 문자열 변수를 집어 넣음 (참조수 +1 = 2)
		kind1 = null; 
        // kind1에 있는 문자열 값을 쓰레기로 만듬
		System.out.println(kind2); 
        // 하지만 kind2에 쓰레기값으로 변하기 전의 kind1의 값이 남아있기 때문에 그대로 "자동차" 값이 남아있음

	}

}
  • 참조수란?
    -> 참조하는 변수들의 갯수!
    -> 참조하는 변수가 하나씩 증가할 때마다 1씩 증가
    -> 참조하는 변수 중 하나가 null 값을 가지게 되면 1씩 감소
    -> 참조수가 0이 되면 값이 아예 사라짐

NullPointerException

-> null인 상태의 참조변수를 참조하거나 사용할 때 나타나는 오류

package ch05.sec04;

public class NullPointerExceptionExam {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] intArray = null; 
        //intArray에 null값을 선언 : 아무 값도 넣지 않겠다는 의미
		//intArray[0] = 10; 
        //아무 값도 들어있지 않는 변수를 참조했기 때문에 NullException 발생
		
		String str = null;
		System.out.println("총 문자 수: " + str.length()); 
        //아무 값도 들어있지 않는 변수를 참조하였기 때문에 NullExceptioin 발생!
		

	}

}
profile
끄작끄작

0개의 댓글