Java/Java

참조타입, 참조변수

이게뭐여 2021. 10. 11. 19:07

1. 참조 타입

자바의 데이터 타입은 크게 기본 타입과 참조 타입이 존재한다.

기본 타입은 정수, 실수, 문자, 논리 리터럴를 저장하는 타입이다.

참조 타입은 객체의 번지를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스가 있다.

 

기본 타입으로 선언된 변수와 참조 타입으로 선언된 변수는 저장되는 값에 차이가 있다.

기본 타입으로 선언된 변수들은 실제 값을 변수에 직접 저장한다.

그러나 참조 타입으로 선언된 변수들은 객체가 존재하고 있는 메모리의 번지를 저장한다.

그 후, 그 번지를 통해 객체를 참조한다.

 

 

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

참조 변수의 ==, != 연산은 기본 변수의 그것과는 의미가 다르다.

기본 변수의 경우, 변수에 저장된 값 자체를 비교하지만

참조 변수의 경우, 각각의 참조 변수에 저장된 메모리 번지 즉, 참조하고 있는 객체를 비교하게 된다.

 

그래서 참조 변수 A, 참조 변수 B가 동일한 값을 가진 다른 객체를 참조하고 있다면

값이 같더라도 == 연산의 결과는 false다.

 

 

3. null, NullPointerException

참조 변수는 객체를 참조하지 않는다는 의미로 null 값으로 초기화 될 수 있다.

그러나 null값을 가진 참조 변수를 사용하려고 할 경우, NullPointerException 예외가 발생한다.

참조변수가 참조하고 있는 객체가 없으므로 사용할 수 없다는 예외이다.

 

이런 경우에 참조변수를 사용하고 싶을 경우, 참조 변수가 객체를 참조하도록 수정해줘야 한다. 

 

 

4. String

String도 참조 타입 중 하나이며, String 변수 또한 문자열 리터럴을 직접 저장하는 것이 아닌, 객체를 참조한다.

 

Stirng 변수의 한 가지 특징이 있다.

기본 변수처럼 String 변수를 초기화 할 경우, 문자열 리터럴이 동일하다면 동일한 객체를 참조한다.

그러나 각각의 String 변수를 new 연산자를 통해 초기화 한다면, 문자열 리터럴이 동일하더라도 각각 다른 객체를 참조한다.

new 연산자는 새로운 객체를 생성하기 때문이다. 

 

만약 두 String 변수가 동일한 객체를 참조하고 있느냐를 비교하는 것이 아니라

참조하는 객체들의 문자열 자체가 동일한지를 비교하고 싶다면

== 연산자가 아닌, equals() 메소드를 통해 비교하면 된다.

 

 

public class StringEqualsExample {

	public static void main(String[] args) {
		//string 변수에 동일한 리터럴을 사용하여 초기화할 경우, 동일한 리터럴이 사용된 string 변수들은 동일한 객체를 참조하게 된다. 
		String strVar1 = "kmk";
		String strVar2 = "kmk";
		
		if(strVar1 == strVar2) {
			System.out.println("strVar1과 strVar2는 참조가 같음.");
		} else {
			System.out.println("strVar1과 strVar2는 참조가 다름.");
		}
		
		if(strVar1.equals(strVar2)) {
			System.out.println("strVar1과 strVar2는 문자열이 같음.");
		}
		
		//new를 통해 각각의 객체를 생성하고 
		String strVar3 = new String("kmk");
		String strVar4 = new String("kmk");
		
		if(strVar3 == strVar4) {
			System.out.println("strVar3과 strVar4는 참조가 같음.");
		} else {
			System.out.println("strVar3과 strVar4는 참조가 다름.");
		}
		
		if(strVar3.equals(strVar4)) {
			System.out.println("strVar3과 strVar4는 문자열이 같음.");
		}

	}

}

 

출처: 혼자 공부하는 자바(신용권)