본문 바로가기
개발 공부/Java

[자바다] int string등 각 타입에서 'equals' 와 '==' 구별하는 법

by 반달bear 2022. 9. 22.
반응형

자바를 공부하면서 제일 헷갈리는게 equals와 ==여서 한 번 정리하고 넘어가려 합니다.

 

우선 제일 상위 클래스고 모든 클래스를 포함하는 Object 클래스에서 equals와 == 는 '주소값 비교'라는 같은 역할을 수행합니다. 그런데 단 한가지 클래스! String 클래스에선 equals가 주소값이 아닌 '값을 비교'하도록 오버라이딩 되어 있습니다. 

 

그러니 String 외의 다른 모든 클래스를 equals로 비교하면 주소값을 비교해서 리턴하고 String 클래스의 값을 equals로 비교하면 값을 비교합니다.

//같은 값을 가졌지만 주소값은 다르게 두 객체를 만들어주기
String str1 = new String("str");
String str2 = new String("str");
    
//equals 와 == 비교    
System.out.println(str1.equals(str2));

System.out.println(str1==str2);

 

 

위의 코드에서 String 변수들을 비교해주기 위해 두 객체를 생성해주었는데 이렇게 한 이유는 객체를 강제로 생성해주지 않는 이상 자바는 존재하는 객체를 참조하기만 하기 때문입니다!

<객체를 따로 생성해주지 않으면>

1. str1에 "str" 저장
     - 자바는 3000이라는 주소값에 원본 "str" 저장 
     -  str1에 3000이라는 주소값을 저장
2.str2에 "str" 저장 (new 사용x)
     - str2에 3000이라는 주소값을 저장

 

그리고 String은 클래스이고 int형은 원시타입입니다. int, double 등 이러한 타입은 모두 primitive 타입으로 클래스가 아닌데요. 이러한 변수 타입에서 ==를 사용할 경우 '값 비교'를 합니다.

 

 

기본적으로 equals와 == 모두 '주소값 비교'
String 클래스는 equals가 값 비교 ==는 주소값 비교
원시타입은 equals(객체가 아님으로 해당없음) ==는 값비교 

 

끝!

반응형

댓글