자바 참조 타입과 참조 변수

이영광·2022년 7월 12일

자바

목록 보기
17/34

메모리 사용 영역

JVM은 운영체제에서 할당받은 메모리영역 을 다음과 같이 세부 영역으로 구분해서 사용합니다.

메소드 영역

  • 메소드 영역은 JVM이 시작할때 생성되고 모든 스레드가 공유하는 영역이다. 메소드 영역에는 코드에서 사용되는 클래스 들을 클래스 로더로 읽어 클래스별로 정적 필드 와 상수 , 메소드 코드, 생성자 코드 등을 분류해서 저장한다.

힙 영역

  • 힙 영역 은 객체와 배열이 생성되는 여역이다. 여기에 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조한다. 만일 참조하는 변수나 필드가 없다면 의미 없는 객체가 되기 때문에 JVM이 이것을 쓰레기 취급하고 있어 가비지 컬렉터를 실행기켜 자동으로 제거한다. 따라서 객체를 제거하기 위해 별도의 코드를 작성할 필요가 없다.

JVM 스택 영역

  • JVM스택은 메소드를 호출 할때마다 프레임을 추가하고 메소드가 종료되면 해당 프레임을 제거하는 동작을 수행한다.

프레임 내부에는 로컬 변수 스택이 있는데, 기본타입 변수와 참조 타입 변수가 추가 되거나 제거 된다. 스택 영역에 변수가 생성되는 시점은 초기화가 될때, 즉 최초로 변수에 값이 저장될 때이다. 변수는 선언된 블록 안에서만 스택에 존재하고 블록을 벗어나면 스택에서 제거된다.

char v1= 'A'  ===== 1

if(v1 == 'A'){ ====== 2
	int v2 = 100;
  	double = 3.14;
}

boolean v4 = true; ====== 3

int[] scores = {10,20,30};

1,3 은 변수에 할당되어 변수가 값을 가지고 있고

if 안의 변수는 실행될때 스택에 채워지지만 if이 끝나면 소멸된다

scores 는 배열이며 참조 변수이다. 자바에서는 객체로 취급한다.

참조 변수의 == , != 연산

기본 타입 변수의 ==, != 연산은 변수의 값이 같은지, 아닌지를 조사하지만 참조 타입 변수들 간의 ==, != 연산은 동일한 객체를 참조하는지, 다른 객체를 참조하는지 알아 볼 때 사용된다, 참조 타입 변수의 값은 힙 영역의 객체 주소이므로 ==, != 연산은 결국 번지 값을 비교하는 것이 된다. 동일한 번지 값을 갖고 있다는 것은 동일한 객체를 참조한다는 의미이다. 따라서 동일한 객체를 참조하고 있을경우 == 연산의 결과는 true이고 =! 의 연산의 결과는 false이다.

null과 NullPointerException

  • 참조 타입 변수는 힙 영역의 객체를 참조하지 않는다는 뜻으로 null값도 초기값으로 사용할 수 있기 때문에 null로 초기화된 참조 변수는 스택 영역에 생성된다.

  • 자바는 프로그램 실행 도중에 발생하는 오류를 예외(Exception)라고 부른다. 예외는 사용자의 잘못된 입력으로 발생할 수 있고, 프로그래머가 코드를 잘못 작성해서 발생할 수도 있다. 참조변수를 사용하려면 가장 많이 발생하는 예외중 하나로 NullPointerException이 있습니다. 이예외는 참조 타입 변수를 잘못 사용하면 발생한다

참조 변수가 null을 가지고 있을경우, 참조 객체가 없으므로 변수를 통해 객체를 사용할수 없다. 만약 null상테에서 있지도 않은 객체의 데이터나 메소드를 사용하는 코드를 실행하면 발생한다.

int[] intArray = null;
intArray[0] = 10; -> NullPointerException

위 코드에서 intArray는 배열 변수이므로 참조 변수입니다. null로 초기화가 가능합니다. 이상태에서 intArray[0]에 10을 저장하려고 하면 NullPointerException이 발생한다. intArray변수가 참조하는 배열 객체가 없기 때문이다.

String str = null;

System.out.println("총 문자수: " str.length());

String

profile
《REACT》《JAVASCRIPT 》 만지고있어욤

0개의 댓글