저번 시간엔 주로 기본타입에 대해 알아봤습니다.
이번 시간엔 참조타입에 대해서 깊이 알아보겠습니다!
참조타입
기본타입(primitive type) : 정수, 실수, 문자, 논리리터럴을 변수에 직접 값으로 지정합니다.
참조타입(reference type) : 객체(object)의 번지를 참조하는 타입입니다.
객체 = 배열, 열거, 클래스, 인터페이스
기본 타입들은 크기가 명확하기 때문에 그 값 자체가 변수에 저장되는 반면,
객체들은 크기가 일정하지 않고 정의하는 대로 크기가 변경되기 때문에 특정 공간을 할당하는 것은 쉽지 않습니다.
그래서 주소값을 가지고 변수에 저장합니다.

이렇게 기본타입과 참조타입은 모두 스택영역에 저장됩니다.
기본타입은 그 값이 그대로 스택영역에 저장되는 반면,
참조타입은 힙영역에 저장된 주소값이 스택영역에 저장되는 것을 볼 수 있습니다.
참조변수의 == , != 연산
참조 타입 변수간의 ==, != 연산은 동일 객체를 참조하는지, 다른 객체를 참조하는지 알아볼 때 사용합니다.
참조 타입 변수 간의 == 연산자는 메모리 주소 번지 값의 비교를 합니다.
(같으면 true, 다르면 false 반환)

refVar2와 refVar3가 같은 메모리를 사용하고 있는 객체이기 때문에 == 연산을 수행했을 때 true 값이 반환됩니다.
🚨유의할 점🚨
객체 안에 있는 값에 대한 비교가 아니라
동일한 메모리를 사용하고 있는 객체인지를 비교하는 것!
null과 NullPointerException
참조 타입 변수는 객체를 참조하지 않는다는 뜻으로 아무 값도 없다는 의미의 null값을 가질 수 있습니다.
🚨기본타입은 null값을 가질 수 없습니다!🚨

다음과 같이 null로 초기화된 참조변수도 여전히 참조변수이므로 스택영역에 생성됩니다.
❓ 하지만 이 과정에서 문득 참조값이 있었다가 null이 된 경우에 힙 영역에 있던 객체는 어떻게 되는건지 궁금해졌습니다!

힙 영역의 객체를 참조하다가 null이 들어오면서 객체에 대한 참조가 끊어지게 되는 상황이 발생했습니다.
이 객체는 "쓰레기 객체"가 되어 앞 시간에 배웠던 JVM의 Garbage Collector에 의해 메모리에서 자동으로 제거됩니다.
- NullPointerException
알고리즘 문제를 풀다가 많이 접했던 예외라서 상당히 익숙합니다.😂
예외는 프로그램 실행 도중 발생하는 오류를 의미합니다.
NullPointerException은 참조타입 변수가 null상태에서 존재하지 않는 객체의 데이터나 메소드를 사용할 경우에 발생합니다.
- 예시 1
int[] intArray = null;
intArray[0] = 10;
- 예시2
String str = null;
System.out.println("총 문자수: " +str.length());
String 타입
String 변수에 문자열 리터럴을 대입할 경우 String 객체로 생성되고 변수가 String 객체를 참조합니다.

String 타입도 다른 객체와 마찬가지로 문자열 리터럴이 동일한 경우 String 객체를 공유합니다.

하지만 new 연산자는 객체 생성 연산자입니다.
new를 사용하면 문자열 리터럴이 같더라도 힙 영역에 새로운 String 객체르 생성합니다.
결과적으로 객체를 생성했기 때문에 이 두 객체는 주소값이 다릅니다.
String name1 = "홍길동"; String name2 = "홍길동"; String name3 = new String("홍길동");
이런 상황일 때,name1 == name2 : true (객체가 같기 때문에)
name1 == name3 : false (객체가 다르기 때문에)
이런 결과가 나옵니다.
그렇다면 객체가 다르지만 문자열 값 자체를 비교해야할 땐 어떻게 해야 할까요?
String 타입의 문자열 값 자체를 비교할 땐 equals() 메소드를 활용해야 합니다.
사용하는 방식은 이렇습니다.
boolean result = str1.equals(str2);
같다면 true, 다르다면 false를 반환합니다.
🔆새로 배운점🔆
항상 스택과 힙 영역에 대한 지식이 부족했었습니다.
하지만 이번 기회로 스택과 힙 영역에 대한 이해를 할 수 있었으며,
사실 의도하진 않았지만 사소한 궁금증에서 출발해서 얼떨결에 Garbage Collector의 역할에 대해서도 알아볼 수 있었습니다.
사소한 것이라도 궁금한 점이 있으면 찾아보는 데에서 실력이 성장한다는 것을 느낄 수 있었던 과정이였습니다.😄
'🧮Programming > Java' 카테고리의 다른 글
| [Java] 패키지와 접근 제한자 (0) | 2024.02.06 |
|---|---|
| [Java] 객체와 클래스 (0) | 2024.02.06 |
| [Java] 배열(Array) (0) | 2024.02.05 |
| [Java] Java기초 문법 (0) | 2024.02.04 |
| [Java] Java의 개념적 원리 (0) | 2024.02.04 |