본문 바로가기
프로그래밍 언어/JAVA

JAVA - == 와 .equals() 차이

by DGDD(Developer) 2023. 6. 19.

데이터 타입


Java에는 원시 타입(Primitive Type)과 참조타입(Reference Type)로 두 가지 데이터 타입이 존재한다.

 

원시 타입: byte, short, int, long, double, float, char, boolean

참조 타입: String, Array, Date, File, Class, Interface etc

 

여기서 원시 타입의 데이터는 '스택' 메모리에 값이 존재한다.

예를 들어 int a = 10 과 int b = 10 이 있다고 가정하자. 여기서 10이라는 값이 a에서 먼저 생겼기 때문에 뒤에 생긴 b는 a와 같은 값을 가지기 때문에 가리키는 주소가 같다.

그렇기 때문에 a == b의 결과는 true가 나올 수 있는 것이다.

 

이번에는 참조 타입인 String을 예시로 들어 설명하겠다.

String은 참조 타입이지만 특별 대우를 받아

String a = "aaa";

String b = "aaa";

 

위와 같이 선언을 하면 원시 타입 처럼 같은 공간을 가르키게 된다.

하지만 String c = new String("aaa"); 이렇게 선언을 하게 되면

위의 내용 처럼 똑같이 c 또한 aaa라는 내용을 가지고 있지만 아래 그림 처럼 a, b와는 다른 주소값을 할당 받게 된다.

c를 선언한것과 같이 d라는 문자열 변수를 선언하면 d 또한 a,b,c와 내용은 같지만 주소가 다른 위치에 할당된다.

이와같은 현상 때문에 a와 b는 == 연산자를 이용하면 같은 주소를 가리키기 때문에 true가 나온다. 하지만 a == c 를 하게되면 a와 b는 가지고 있는 내용은 같지만 가리키고 있는 주소가 다르기 때문에 false가 나온다. 이렇게 내용은 같지만 주소가 달라서 의도하지 않게 false가 나오는 상황에 c.equals(a);를 쓰게 되면 a와 c의 주소가 아닌 내용을 비교하기 때문에 true가 나온다. 그렇기 때문에 만약에 참초 타입의 데이터를 사용한다면 데이터 값을 비교할 경우에는 .equals()를 사용하면 된다.