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이 지금은 잘 안쓰이지만 나중에 사용할 때는 유용하게 사용될 것 같네요!!
많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~
'BackEnd > Java' 카테고리의 다른 글
[java] 문자열을 이용한 추가 연습문제(indexOf, substring, charAt ) (0) | 2023.01.09 |
---|---|
[java] 이것이 자바다 ch05 문자열 타입 (0) | 2023.01.09 |
[java] 메모리 구조 (0) | 2023.01.09 |
[java] 이것이 자바다 ch4 조건문과 반복문 (0) | 2023.01.07 |
[java] 이것이 자바다 ch2 변수 확인 문제 풀이 (0) | 2023.01.05 |