본문 바로가기

프로그래밍

[Java][짧막지식] ==과 equals는 어떤 차이가 있는가? (with Wrapper Class)

Java에서 ==과 equals는 어떤 차이가 있는가?라고 질문이 온다면 무어라 답변할 수 있을까?

나의 경우에는 자바에서는 문자열에서 값이 같은지를 비교하기 위해선 equals를 써야 한다.라고밖에 생각이 나질 않았다.

 

보통은 이정도만 아는 사람이 많을 것이다. 나도 그랬었다.

하지만 오늘 이 둘에 대해 한번 알아보도록 하자.


1. ==와 equals는 어떤 점에서 같은지?

둘 다 어떠한 두 내용을 비교하고 true 나 false를 반환한다는 점에서 같다고 볼 수 있다.

2. 어떤 점에서 다른지?

a) 일단 쓰이는 형태가 다르다고 볼 수 있다.

 

==은 비교연산자이며 equals는 메소드라는 점에서 다르다.

++) equals는 최상위 Class인 Object 클래스에 정의된 메소드 이므로 비교 대상이 객체인 경우에만 호출해 사용이 가능하다.

 

 

b) ==과 equals는 비교하는 대상이 다르다고 볼 수 있다.

 

int와 Integer (Wrapper Class)를 예시로 들어보도록 하자.

public class Main
{
	public static void main(String[] args) {
		int a = 1;
		Integer b = 1;
		Integer c = new Integer(1);
		System.out.println(a==b); //실행결과 true
		System.out.println(a==c); //실행결과 true
		System.out.println(b==c); //실행결과 false
	}
}

 

a, b, c는 모두 1인데 왜 이런 결과가 나올까?

 

그 이유는 바로 ==와 equals의 동작 방식이 다르기 때문이다.

 

equals내부의 값을 비교하는 반면,(필요시 오버라이딩을 통해 재정의 가능)

 

==는 비교 대상에서 둘 중 하나 이상이 primitive type(int)인 경우 값을 비교하고,

비교 대상이 둘다 Wrapper Class(Integer)와 같이 객체인 경우 주소를 비교한다는 차이가 있다.

 

==의 동작 방식을 표로 요약하면 다음과 같다.

  primitive type Wrapper Class(혹은 객체,Class)
primitive type 값을 비교 값을 비교
Wrapper Class(혹은 객체,Class) 값을 비교 주소를 비교

 

용어설명

++Integer이란 정수를 담는 Wrapper Class이다.

++오버라이딩이란? 부모 클래스에서 정의된 메소드를 자식 클래스에서 재정의 하는 것을 의미한다.