본문 바로가기

BackEnd/Java

[java] 이것이 자바다 ch05 참조 타입

728x90
반응형

1. 데이터 타입 분류(참조 타입)

 

   ▷ 객체의 번지를 참조하는 타입

   ▷ 배열, 열거, 클래스, 인터페이스 타입

   ▷ 기본 타입으로 선언된 변수는 값 자체를 저장하지만, 참조 타입으로 선언된 변수는 객체가 생성된 메모리 번지를 저장

 

 

◎ 주소 값 저장 예제

public class ReferenceVariableCompareExample {

	public static void main(String[] args) {
		
		int[] arr1;  // 배열 변수 arr1 선언
		int[] arr2;  // 배열 변수 arr2 선언
		int[] arr3;  // 배열 변수 arr3 선언

		arr1 = new int[] { 1, 2, 3 };  // 배열 { 1, 2, 3 }을 생성하고 arr1 변수에 대입
		arr2 = new int[] { 1, 2, 3 };  // 배열 { 1, 2, 3 }을 생성하고 arr2 변수에 대입
		arr3 = arr2;                   // 배열 변수 arr2의 값을 arr3에 대입
		
		System.out.println(arr1 == arr2);  // 참조하는 주소에 대한 부분이 달라서 false
		System.out.println(arr2 == arr3);  // 참조하는 주소가 같아서 true
		
		System.out.println(arr1);
		System.out.println(arr2);
		System.out.println(arr3);
	}
}

// 출력 : 
// false
// true
// [I@15db9742
// [I@6d06d69c
// [I@6d06d69c


arr1의 주소와 arr2, arr3의 주소는 다릅니다.

대신, arr1[0]와 arr2[0]의 값은 같습니다.

 

 

2. 메모리 사용 영역(메소드, 힙, 스택 영역)

   ▷ JVM은 운영체제에서 할당받은 메모리 영역을 메소드 영역, 힙 영역, 스택 영역으로 구분해서 사용

   ▷ 메소드 영역 : 바이트코드 파일을 읽은 내용이 저장되는 영역

   ▷ 힙 영역 : 객체가 생성되는 영역, 객체의 번지는 메소드 영역과 스택 영역의 상수오 변수에서 참조

   ▷ 스택 영역 : 메소드를 호출할 때마다 생성되는 프레임이 저장되는 영역

 

 

3. 참조 타입 변수의 ==, != 연산

   ▷ ==, != 연산자는 객체의 번지를 비교해 변수의 값이 같은지, 아닌지를 조사

   ▷ 번지가 같다면 동일한 객체를 참조하는 것이고, 다르다면 다른 객체를 참조하는 

   

스택 영역에는 실제 값이 들어가 있는 메모리 번지를 기억하고 있습니다.

실제 값들은 힙 영역에 보관하고 있습니다.

 

 

4. null과 NullPointerException

   ▷ null 값 : 참조 타입 변수는 아직 번지를 저장하고 있지 않다는 뜻

      ▶ null도 초기값으로 사용할 수 있기 때문에 null로 초기화된 참조 변수는 스택 영역에 생성

 

   ▷ NullPointerException : 변수가 null인 상태에서 객체의 데이터나 메소드를 사용하려 할 때 발생하는 예외

      ▶ 참조 변수가 객체를 정확히 참조하도록 번지를 대입해야 해결됨.

 

 

◎ NullPointer 예제

 

public class NullPointerExceptionExample {

	public static void main(String[] args) {
		
		int[] intArray = null;
//		intArray[0] = 10;       
//		배열 크기가 지정되어 있지 않기때문에 nullPointer Error가 나타나게 됩니다.
		
		String str = null;
//		System.out.println("총 문자 수 : " + str.length());
//		null 값이기 때문에 nullPointer Error가 나타나게 됩니다.
	}
}


null로 지정되어 있으면 값을 넣지 않는 이상 관련된 출력은 어렵습니다.

public class GarbageObjectExample {

	public static void main(String[] args) {
		
		String hobby = "여행";
		hobby = null;   // 여행 값을 참조하는 주소가 사라지게 됩니다.
		System.out.println("hobby : " + hobby);

		
		String kind1 = "자동차";
		String kind2 = kind1;
		kind1 = null;   // "자동차"를 참조하고 있던 주소 제거
		System.out.println("kind2 : " + kind2);
	}
}

// 출력 : 
// hobby : null
// kind2 : 자동차

 

데이터 타입과 메모리 사용에 대해서 배워 보았습니다.

 

null이 지금은 잘 안쓰이지만 나중에 사용할 때는 유용하게 사용될 것 같네요!!

 

많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~

 

 

728x90
반응형