Java/OOP

[OOP] ==과 equals()의 차이점

JoonYong 2024. 2. 3. 16:03

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] equals와 ==의 차이점

equals (데이터 값 비교) == (주소값 비교) 차이 equals 는 데이터 값을 비교하는 메소드 이며, == 은 주소값을 비교해주는 비교 연산자 이다. public class Test{ public static void main(String[] args){ Stirng A = "Java";

joonpyo-hong.tistory.com