들어가면서
Java에서는 데이터 타입이 기본타입(8가지)와 참조타입으로 나뉘게 된다.
여기서 참조타입은 기본타입이 아닌 모든 것들이 참조타입이 되게 되는데, 배열과 클래스, 인터페이스가 모두 참조타입에 속하게 된다.
이번 글에서는 참조타입의 개념과 참조타입의 특징에 대해 살펴볼 것이다.
참조타입이란?
참조타입이란 동적으로 할당된 객체의 메모리 주소를 저장하는 타입을 의미한다.
Java에서 모든 객체은 stack이 아닌 heap에서 생성되는데, 이때 모두 new 키워드를 사용하여 동적으로 생성된다.
동적으로 생성된 객체는 heap에서 생성되어서 해당 객체의 이름이 없게 되는데, 이를 참조타입 변수를 사용하여 연결시켜 주면 된다.
따라서, 모든 참조타입 변수는 객체의 데이터가 아닌 메모리 주소를 저장하게 된다.
C++에서는 메모리의 주소는 포인터 변수에 저장하여 사용하지만, Java에서는 포인터 개념이 없고 대신 참조라는 개념을 사용한다.
Java에서 참조는 포인터의 개념과 유사하지만, 안전성과 동작과정에서는 서로 다르므로 개념을 각각 받아들여야한다.
참조타입의 특징
1 | 참조타입은 기본타입과 다르게 null 리터럴을 할당할 수가 있다.
//int a = null; 에러! 기본타입에 null 할당할 수 없음.
String str1 = null;
기본타입과 다르게 참조타입 변수에는 null 리터럴을 할당할 수 있는데, 이는 해당 변수가 어떠한 객체도 참조하지 않는다는 것을 명시적으로 나타낼 수가 있게 된다.
2 | 참조타입은 메모리 주소를 저장하므로 두 문자열을 비교할 때 동등비교연산자(==)를 사용해서는 안 된다.
String str1 = new String("hi");
String str2 = new String("hi");
if (str1 == str2) {
System.out.print("true");
} else {
System.out.print("false");
}
기본적으로 String 타입 변수는 참조타입이므로 heap 공간에 있는 객체의 메모리 주소를 저장하게 된다.
따라서, str1과 str2는 각각 서로 다른 주소를 저장하게 된다.
그러므로, 아래 if문 조건식에서 str1과 str2에 대해 동등비교연산자(==)의 의미는 서로 메모리 주소가 같은지를 판단하는 조건식으로서 false가 되므로 else문이 실행이 될 것이다.
이는 C++와 동작과정이 다르기 때문에 실수가 많으므로 주의해야한다.
'Java' 카테고리의 다른 글
Java : switch (expr)에서 expr는 정수 뿐만 아니라 문자열도 가능하다 (C++과 차이점도 알아보자) (0) | 2024.03.17 |
---|