본문 바로가기

Language/Java

일반 변수와 참조 변수 바로 알기

1. 데이터 타입의 종류

크게 기본 타입과 참조 타입으로 나누어진다. 두 타입을 나누는 기준은 무슨 값이 저장되는가 이다. 

2. 각 타입들이 값을 저장하는 원리

기본타입은 해당 변수에 값 자체를 저장한다. (call by value) 따라서 int a = 1 이라면 말 그대로 a에는 1이 저장되어 있다. 

b의 경우에도 마찬가지로 double b = 3.5라면 b에는 3.5가 저장 되어 있다. 

반면, 참조타입은 해당 변수에 "값이 저장되어 있는 주소"가 저장되어있다. 따라서 해당 변수에 저장된 주소로 가서 값을 확인한다.  만약 String c = "첼시는 우승 못한다." 이고, 해당 문자열이 힙에 저장된 주소가 'ae123' 이라면, 힙의 ae123으로 가서 값을 확인한다. 

 

3. String 값을 ==으로 비교하면 안되는 이유? 

만약 

String a = "a"
String b = "a"
String c = new String("a")

 

라고 할 때 값을 비교해보면 

System.out.println(a==b);
System.out.println(a.equals(b));
System.out.println(a==c);
System.out.println(a.equals(c));



// 결과
// 위에서부터 true, true false, true

 

이렇게 나온다. 

이유는 다음과 같다. 

== 은 String의 주소가 가르키는 내용물들을 비교하는 것이 아니라, 단순하게 Stack 속 각 변수가 저장하는 주소값을 서로 비교한다. a와 b의 경우 가르키는 주소값 마저 같으므로, 동일하다고 나오지만, c는 새로 동적할당을 받았기 때문에 a,b와는 주소값이 다르다.

따라서 ==으로 비교시 a와 b는 같다고, a와 c는 같지 않다고 나온다.

같은 원리로 a == "a" 도 서로 주소가 다르므로 같지 않다고 나온다.

 

이 경우 매소드 .equals()를 사용해야한다. 이 매소드는 변수의 주소가 가르키는 내용물 자체를 비교한다. 

따라서 a.equals(c) 혹은 a.equals("a")는 서로 같은 값이라고 정확히 나온다.

 

4.점검

1. 데이터 타입의 종류 


2. 각 타입이 값을 저장하는 원리 


3. String값을 ==으로 비교하면 안되는 이유 무엇을 써야하나? 

'Language > Java' 카테고리의 다른 글

Chap07_13 참조(reference)  (0) 2023.01.29
[JAVA] Super  (0) 2023.01.28
[JAVA] 다형성(polymorphis)  (0) 2023.01.28
[JAVA]Overriding(덮어쓰기)  (0) 2023.01.27
Chap07_09 상속(inheritance)  (0) 2023.01.27