[Java 07] 자바 - 참조변수 (1)
학습목표
- 참조변수의 ==, != 연산을 활용할 수 있다.
- NullPointException이 왜 발생하는지 정확이 이해하고 있다.
- String 타입의 참조에 대해 알고 있다.
참조 변수의 ==, != 연산
기본 타입 변수의 ==, !=
연산은 변수의 값이 같은지, 아닌지를 조사하지만 참조 타입 변수들 간의 ==, !=
연산은 동일한 객체를 참조하는지, 다른 객체를 참조하는지 알아볼 때 사용됩니다.
참조 타입의 변수의 값은 힙 영역의 객체 주소이므로 결국 주소 값을 비교하는 것이 됩니다. 동일한 객체를 참조하고 있는 경우 ==
연산의 결과는 true이고 !=
연산의 결과는 false입니다.
위의 그림을 코드로 표현하면 아래와 같이 작성할 수 있습니다.
refVar1 != refVar2 // 결과 : true
refVar2 == refVar3 // 결과 : true
참조변수의 ==, !=
연산은 if문에서 많이 활용되고 아래처럼 작성하면 됩니다.
if( refVar2 == refVar3) {...}
null과 NullPointException
null값은 초기값으로 사용할 수 있기 때문에 null로 초기화된 참조 변수는 스택 영역에 생성됩니다. 이를 다르게 말하면 힙의 객체를 참조하지 않았다는 뜻을 의미합니다.
참조변수에서 가장 많이 발생하는 예외가 바로 ‘NullPointException’인데 참조변수를 잘못 사용하면 발생합니다. 참조변수를 사용한다는 것은 객체를 사용한다는 것을 의미하는데, null의 경우 참조할 객체가 없다는 것을 의미하므로 ‘NullPointException’ 발생하는 것입니다.
다음 코드는 intArr는 배열 타입 변수이므로 참조 타입 변수이기 때문에 null로 초기화가 가능합니다. 이 상태에서 inArr[0]에 10을 저장하려고 하면 객체가 없기 때문에 NullPointException이 발생합니다.
int[] intArr = null;
intArrr[0] = 10; 'NullPointException'
String 타입
다음 코드는 ‘name’과 ‘hobby’라는 변수 두개가 각각 “김자바”와 “운동”이라는 객체를 참조합니다. ‘name’과 ‘hobby’ 변수는 각각의 String 객체의 주소값이 저장됩니다.
String name = "김자바";
String hobby = "운동";
다음 코드는 name1과 name2가 “김자바”라는 동일한 객체를 참조하는 변수입니다.
String name1 = "김자바";
String name2 = "김자바";
만약에 name1과 name2가 ‘김자바’라는 서로 다른 String 객체를 참조하게 만드려면 아래와 같이 코드를 구성하면 됩니다.
String name1 = new String("김자바");
String name2 = new String("김자바");
다음 코드는 hobby 변수가 String 객체를 참조했으나, null을 대입해 더 이상 String 객체를 참조하지 않도록 하는 것이 가능합니다.
String hobby = "축구";
hobby = null;
문자열 비교를 통한 참조변수 이해
public class Practice01 {
public static void main(String[] args) {
String strVar1 = "자바";
String strVar2 = "자바";
if (strVar1 == strVar2) {
System.out.println("strVar1과 strVae2는 참조가 같음");
} else {
System.out.println("strVar1과 strVae2는 참조가 다름");
}
if (strVar1.equals(strVar2)) {
System.out.println("strVar1과 strVar2는 문자열이 같음");
}
String strVar3 = new String("자바");
String strVar4 = new String("자바");
if(strVar3 == strVar4) {
System.out.println("strVar3과 strVar4는 참조가 같음");
} else {
System.out.println("strVar3과 strVar4는 참조가 다름");
}
if (strVar3.contentEquals(strVar4)) {
System.out.println("strVar3과 strVar4는 문자열이 같음");
}
}
}
실행결과
strVar1과 strVae2는 참조가 같음
strVar1과 strVar2는 문자열이 같음
strVar3과 strVar4는 참조가 다름
strVar3과 strVar4는 문자열이 같음
댓글남기기