1. 자바에서 ==와 equals()의 차이점
자바에서 매우 중요한 개념인 == 연산자와 equals() 메서드의 차이점에 대해 알아보려고 합니다. 이 두 가지는 모두 객체를 비교하는 데 사용되지만, 그 방식과 결과는 상황에 따라 매우 다를 수 있습니다. 그러니 자세히 살펴보도록 하겠습니다.
2. == 연산자
2.1) 기본 데이터 타입(리터널 선언) - 값
자바에서 == 연산자는 주로 기본 데이터 타입의 값을 비교할 때 사용됩니다.
byte, short, int, long, float, double, char, boolea 등의 값이 같은지 비교할 때는 == 연산자를 사용하면 됩니다!!
// 리터널로 선언
int a = 2024;
int b = 2024;
System.out.println(a == b); // true
2.2) String (리터널 선언) - 값
String은 참조 데이터 타입 중 하나로 객체이지만 String을 리터널 선언하게되면 자바 컴파일러는 String Contant Pool이라는 영역에 같은 값을 같은 메모리에 공유하여 저장한다.(메모리 사용량 최적화)
따라서 Sting의 주소가 아닌 값을 비교할때 사용할 수 있다!!
// 리터널로 선언
String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1 == str2); // true
2.3) String (new 연산자 선언) - 주소
하지만 new 연산자로 선언한 객체를 비교할 때는 조금 다릅니다.
new 연산자로 선언한 객체의 == 연산자는 두 객체가 동일한 객체인지를 비교합니다. 즉, 두 객체의 메모리 주소가 같은지를 확인하는 것입니다.
따라서, 두 객체의 내용이 같아도 == 연산자로 비교하면 false가 반환될 수 있습니다.
// new 연산자로 선언
String str3 = new String("Hello");
String str4 = new String("Hello");
System.out.println(str3 == str4); // false
위의 코드에서 str1과 str2는 내용은 같지만 메모리상에서는 다른 위치에 있기 때문에 == 연산자는 false를 반환합니다.
3. equals() 메서드
equals() 메서드는 Object 클래스에 정의된 메서드로, 기본적으로는 == 연산자와 동일하게 동작합니다. 즉, 두 객체의 메모리 주소를 비교합니다.
하지만 equals() 메서드는 오버라이딩이 가능하므로, 특정 클래스에서는 이 메서드를 재정의하여 객체의 내용을 비교하도록 만들 수 있습니다. String 클래스와 Integer 클래스, Date 클래스 등 많은 자바의 내장 클래스에서는 equals() 메서드가 내용 비교로 오버라이딩되어 있습니다.
// new 연산자로 선언
String str3 = new String("Hello");
String str4 = new String("Hello");
System.out.println(str3.equals(str4)); // true
이번에는 equals() 메서드를 사용하여 str3과 str4를 비교하였고, 결과는 true가 나왔습니다. 왜냐하면 String 클래스에서는 equals() 메서드가 문자열의 내용을 비교하도록 오버라이딩되어 있기 때문입니다.
4. 결론
기본 타입의 값 비교, 객체의 동일성(주소) 비교에는 == 연산자를 사용합니다.
객체의 동등성(내용) 비교에는 equals() 메서드를 사용합니다.
특히 equals() 메서드는 클래스에 따라 동작 방식이 다르므로, 해당 클래스의 문서를 잘 읽어보고 사용하는 것이 중요합니다.
// 기본형(리터널로 선언)
int a = 2024;
int b = 2024;
System.out.println(a == b); // true
System.out.println(a.equals(b)); // 컴파일 에러
//(기본형은 equals() 메소드를 사용할 수 없고 객체의 동등성을 비교할 때 사용한다.)
// 참조형(리터널로 선언)
String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1 == str2); // true
System.out.println(str1.equals(str2)); // true
// 참조형(new 연산자로 선언)
String str3 = new String("Hello");
String str4 = new String("Hello");
System.out.println(str3 == str4); // false
System.out.println(str3.equals(str4)); // true
[참고]
https://joonpyo-hong.tistory.com/entry/Java-equals%EC%99%80-%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90
'Java > OOP' 카테고리의 다른 글
[OOP] C3. 자바와 객체지향 (1) | 2024.02.05 |
---|---|
[OOP] 업캐스팅(Upcasting), 다운캐스팅(Downcasting) (0) | 2024.01.30 |
[OOP] C6. SOLID: 효율적인 객체지향 설계를 위한 5대 원칙 (0) | 2024.01.29 |
[OOP] 가비지 컬렉션(Garbage Collection) - 생성과 소멸 (1) | 2024.01.29 |
[OOP] Call by Value 와 Call by Reference (0) | 2024.01.28 |