안녕하세요, 여행벌입니다.

오늘은 자바 최상위 클래스 Object 클래스의 equals 메소드에 대해서 알아보겠습니다.


equals 메소드

 Object 클래스에는 다음과 같이 equals 메소드가 정의되어있습니다.

public boolean equals(Object obj)

 메소드 이름 그대로 같은지 다른지 판단해서 boolean 값을 return 해주는 메소드로, 오버라이딩을 통해 원하는 내용 비교를 할 수 있도록 최상위 클래스인 Object 클래스에 정의되어 있습니다.

 

 우리가 비교를 생각하면 "==" 연산이 가장 먼저 떠오릅니다. 하지만, "==" 연산은 참조대상이 같은지, 다른지 판단해주는 연산으로 우리가 원하는 내용 비교와는 조금 다릅니다.

 같은 문자열을 담고 있는 2개의 String 인스턴스를 생성해 보도록 하겠습니다.

public class test{
	public static void main(String args[]) {
		String name1 = new String("travelbeeee");
		String name2 = new String("travelbeeee");
		if(name1 == name2) System.out.println("둘이 같습니다");
		else System.out.println("둘이 다릅니다");
	}
}

 name1, name2 인스턴스에는 분명히 같은 문자열이 저장되어있지만, 각각 인스턴스를 생성했기 때문에 서로 다른 인스턴스를 참조하고 있습니다. 따라서, "==" 연산의 결과는 둘이 다르다고 판단합니다.

[Output]
둘이 다릅니다

 그럼 내용 비교를 하고 싶으면 어떻게 해야 될까요? 그럴 때 equals 메소드를 오버라이딩해서 사용하면 됩니다. String 클래스에서는 이미 equals 메소드를 오버라이딩해서 지원해주고 있기 때문에, 다음과 같이 사용하면 됩니다.

public class test{
	public static void main(String args[]) {
		String name1 = new String("travelbeeee");
		String name2 = new String("travelbeeee");
		if(name1.equals(name2)) System.out.println("둘이 내용이 같습니다");
		else System.out.println("둘이 내용이 다릅니다");
	}
}
[Output]
둘이 내용이 같습니다

 x좌표와 y좌표를 담고 있는 클래스를 만든 후, equals 메소드를 좌표가 같은지 판단해주도록 오버라이딩 해보겠습니다.

class Point{
	private int xPos;
	private int yPos;
	public Point(int x, int y) {
		xPos = x;
		yPos = y;
	}
	@Override
	public boolean equals(Object obj) {
		if(((Point)obj).xPos == xPos && ((Point)obj).yPos == yPos) return true;
		return false;
	}
}

public class test{
	public static void main(String args[]) {
		Point p1 = new Point(5, 7);
		Point p2 = new Point(5, 7);
		if(p1 == p2)
			System.out.println("참조대상이 같다");
		else
			System.out.println("참조대상이 다르다");
		
		if(p1.equals(p2))
			System.out.println("내용이 같다");
		else
			System.out.println("내용이 다르다");
	}
}
[Output]
참조대상이 다르다
내용이 같다

 "==" 연산 결과는 서로 다른 인스턴스를 참조하고 있다고 알려주고 있지만, equals 메소드를 둘의 좌표를 비교하도록 오버라이딩 했기 때문에 내용이 같다고 비교해주고 있는 것을 볼 수 있습니다.

 

 이렇듯 두 인스턴스의 내용 비교 결과인 true, false 의 반환 조건은 해당 클래스를 정의하는 프로그래머가 결정해야 합니다. 기본적으로 Object 클래스의 equals 메소드는 "==" 연산자와 마찬가지로 참조변수의 참조 값을 비교하도록 정의되어 있습니다. 하지만, "==" 연산이 참조변수의 참조 값을 비교하는 기능을 지원해주므로 String 클래스 등과 같이 자바에서 제공하는 표준 클래스의 경우 equals 메소드가 내용 비교를 하도록 이미 오버라이딩 되어 있는 경우가 많습니다.


 

+ Recent posts