⚒️객체의 주소값
String str1 = "test"; //리터럴을 이용한 선언
String str2 = "test";
String str3 = new String("test");//new 연산자를 사용한 선언
String str4 = new String("test");
리터럴을 사용하여 객체를 선언한 경우, 선언한 값이 같다면 자바 컴파일러는 Java Constant Pool이라는 영역에 같은 값을 공유하여 메모리를 최적화하는 방법을 사용하기 때문에 두 객체 str1과 str2의 주소값은 같다.
하지만 new 연산자를 사용하여 객체를 선언한다면, JVM 의 Heap 메모리 영역에 객체 각각 고유의 주소값을 가지게 된다.
🧐 == 와 equal의 차이
== 연산자 (기본 데이터 타입) :
- 기본 데이터 타입(int, float, double, boolean 등)을 비교할 때 객체의 참조(reference) 를 비교합니다. 이말은 곧 두 객체가 같은 메모리 주소를 가리키는지를 확인할 때 사용된다는 뜻이다.
Equals() 메서드(객체 타입):
- 객체가 같은지 비교하기 위해 equals() 메서드를 사용한다.
- equals() 메서드는 객체의 내용을 비교하도록 설계되었다.
- 두 객체가 논리적으로 동일한 값을 가지는지를 확인할 때 사용됩니다.
- 기본적으로 Object 클래스의 equals() 메서드는 ==와 같은 방식으로 참조를 비교하지만, 많은 클래스들은 이를 오버라이드(재정의)하여 객체의 내부 값을 비교한다
🔍예제
public class Main {
public static void main(String[] args) {
// 기본 데이터 타입 비교
int a = 5;
int b = 5;
System.out.println(a == b); // true, 값이 같음
// 객체 비교
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2); // false, 다른 메모리 주소
System.out.println(s1.equals(s2)); // true, 같은 문자열 값
// 참조 비교
String s3 = s1;
System.out.println(s1 == s3); // true, 같은 메모리 주소
System.out.println(s1.equals(s3)); // true, 같은 문자열 값
}
}
- == : 기본 타입의 값 비교 또는 두 객체가 같은 메모리 주소를 가리키는지를 확인할 때 사용된다
- equals() : 객체의 내용(값) 비교, 객체가 논리적으로 같은 값을 가지는지 확인할 때 사용합니다.
일반적으로 객체의 값을 비교하고자 할 때는 equals() 메서드를 사용해야 한다. == 연산자는 참조가 동일한지를 확인할 때 사용한다. 알고리즘 문제를 풀다 보면 가끔 == 연산자를 사용하면 같은 값이라도 false가 나왔는데 깊은 내용은 알지 못한 체 습관적으로 equals() method를 사용해 왔다. 이제 이유를 알았으니 앞으로 문제풀이를 할 때 헷갈리지 않고 도움이 될 거 같다
'Java' 카테고리의 다른 글
[Java]인터페이스 (0) | 2024.08.12 |
---|---|
[Java]모던자바 Stream (0) | 2024.08.09 |
[Java]실행시간 계산법 (0) | 2024.08.05 |
[Java]HashMap 사용법 (0) | 2024.07.31 |
자바 메모리 (Heap & Stack) (0) | 2024.07.29 |