우리가 == 이라는 비교 연산자를 공부 혹은 강의를 듣다보면 int, double 의 경우 비교연산자를 사용을 하라고 하고 string의 경우 equals를 사용하라고 배운다.
== 와 equals 의 경우 같은 기능을 하며 같은 리턴 타입(boolean) 을 넘겨준다. 하지만 속은 다르다. == 의 경우 비교를 위한 연산자 그리고 equals의 경우 메소드이다.
그리고 == 연산자는 주소값을 비교를 한다. 여기서 주소값이란 jvm 메모리에서 우리가 인스턴스를 만들기 때문에 heap 메모리에 올라가는 주소값을 의미한다.
(단순히 인스턴스화라 heap에 할당된다고 했으나 자바코드를 어떻게 사용을 하느냐에 따라 stack에 올라가기도 한다)
주소값을 get 하기 위해서는 hashCode
라는 메소드로 확인 할 수 있다. 여기서 주소값이란 jvm 에 올라가는 메모리 주소값이다.
위와 같이 코드를 작성을 하였다. 일단 test 와 test2 변수의 경우 'A' 라는 값으로 인스턴스화 하여 heap 메모리에 올렸다.
결과를 보왔을때 equals 는 값을 비교를 하기 때문에 true를 == 의 경우 주소값을 비교하기 때문에 false 를 리턴시켰다.
new String
의 경우 새로운 문자열의 선언이기 때문에 새로운 주소값을 가지게 된다.
더 나아가서 hascode 와 equals 의 경우 equals 의 경우 값 비교 그리고 hashcode 는 주소 값 반환이다.
coffee 라는 객체에 아이스 아메리카노 그리고 자바칩프라포치노라고 객체를 인스턴스화 해서 jvm heap 메모리에 할당 시켰다.
그렇다면 위의 코드로 결과를 알아보자
coffee 와 coffee1 을 비교를 했을때 false 그리고 주소값을 보며 coffee 와 coffee2 는 같고 coffee1 이 다른것을 볼 수 있다.
object 객체에 먼저 정의가 된다. class 객체의 경우 object 가 부모 객체이기 때문에 hashcode, equals 가 재정이 할 수 있다.
분류 | 설명 |
---|---|
== | 비교 연산자의 경우 주소값을 비교한다. |
equals | 주소값이 아닌 값을 비교한다. |
hascode | 주소값을 반환한다. |