이번에는 JAVA 프로그래밍 언어에서 == 와 equlas()의 차이를 알아보도록 하겠습니다.
다른 프로그래밍 언어(C, Python 등)을 경험해보셨다면 ==은 '같다'라는 뜻으로 알고 계실 겁니다.
JAVA는 객체 지향 프로그래밍이기 때문에 타입이 2가지로 나뉘게 됩니다.
-> 데이터의 실제 값을 참조하는 것으로 대표적으로 정수, 실수, 논리형 값을 나타낼 수 있습니다.
-> 실제 값을 참조하지 않고 주소 값을 가지고 객체를 참조한다고 나타낼 수 있습니다.
글로만 보면 이해하기 어렵기 때문에 간단하게 예시를 들어보겠습니다.
int one = 1;
int two = 1;
System.out.println(one==two);
true
위와 같이 primitive type인 정수형을 ==을 이용해서 비교를 하게 된다면 결과 값이 'true'로 나오게 됩니다.
primitive type에서 ==은 데이터의 값을 비교하기 one의 값이랑 two의 값을 비교했을 때 동일하다고 생각을 해서 true가 나오는 겁니다.
primitive type은 값을 참조하는 것이기 때문에 equals() 메소드는 사용이 불가하다고 생각하시면 됩니다.
그러면 객체를 생성해서 ==, equals() 메소드를 통해 비교를 해보겠습니다.
String aaa = new String("hello");
String bbb = new String("hello");
System.out.println(aaa==bbb);
System.out.println(aaa.equals(bbb));
false
true
위에 결과를 보시면 aaa랑 bbb의 값이 둘 다 hello인데 왜 ==의 값은 false로 나오는 지 헷갈리시는 분들이 있을 겁니다.
이유는 String으로 aaa, bbb라는 객체를 생성하고 비교를 하게 되면 ==은 객체의 주소번지를 비교를 하게 됩니다.
에를 들어, aaa는 100번지에 생성이 되고 bbb는 200번지에 생성이 되었다면 둘의 주소번지는 다르기 때문에 false라고 나오는 겁니다.
이에 반해 equals() 메소드는 reference type에서 우리가 알고 있는 ==의 의미를 가지게 됩니다. 이때는 주소 번지를 비교하는 게 아니라
주소번지에 갖고 있는 값을 서로 비교를 하게 되서 true로 표시가 됩니다.
그럼 String 객체 선언 방식이 아니라 특별하게 선언을 하면 어떻게 될까?
String aaa = "hello";
String bbb = "hello";
System.out.println(aaa==bbb);
String의 선언 방식이 2가지인 것을 고려해 위와 같이 선언하면 어떻게 될까?
이때는, Heap 영역에 객체가 선언되는 것이 아니라 String Pool에 생성된 'hello' 주소 번지를 aaa, bbb가 같은 곳을 가리키게 된다.
그러니 == 을 통해 비교를 해도 true가 나온다. 더 깊게 들어가자면 메모리부터 설명을 해야하지만 일단은 이 정도만 공부하고
나중에 차차 알아가도록 하겠다.
JAVA :: While 반복문 (0) | 2024.07.19 |
---|---|
JAVA :: FOR 반복문 (0) | 2024.07.18 |
JAVA :: Switch-case (2) | 2024.07.14 |
JAVA :: 조건문 IF (0) | 2024.07.13 |
Java :: 입출력 (0) | 2024.07.11 |