본문 바로가기

언어공부/Java

자바 Object클래스의 메소드 - equals()

자바 Object클래스의 메소드 equals()에 대해서 알아보자.

Object클래스

java.lang패키지는 자바프로그래밍에 가장 기본이 되는 클래스들을 포함하고 있다. 그래서 java.lang패키지의 클래스들은 import문 없이도 사용할 수 있게 되어있다. Object클래스는 모든 클래스의 최고 조상이기 때문에 Object클래스의 멤버들은 모든 클래스에서 바로 사용가능하다. Object클래스는 멤버변수는 없고 오직 11개의 메소드만 가지고 있다.

 


equals() 메소드

매개변수로 객체의 참조변수를 받아서 비교하여 그 결과를 boolean값으로 알려주는 역할을 한다. equals()메소드는 아래와 같다.

public boolean equals(Object obj) { return (this==obj); }

위의 코드에서 보듯이 두 객체의 같고 다름을 참조변수의 값으로 판단한다. 그렇기 때문에 서로 다른 두 객체를 equals메소드로 비교하면 항상 false결과를 얻게된다. equals()메소드는 주소값으로 비교를 한다.

 

오버라이딩 된 equals()메소드

Object클래스로부터 상속받은 equals()메소드는 결국 두 개의 참조변수가 같은 객체를 참조하고 있는지, 즉 두 참조변수에 저장된 값(주소값)이 같은지를 판단하는 기능밖에 할 수 없다.  주소값이 아닌 내용물을 비교하기 위해서는 아래와 같이 오버라이딩을 할 수 있다.

 

ex) 

 

Point14 타입의 p01과 p02객체를 생성하는데, new연산자로 생성하므로 두 객체의 주소는 서로 다르다. 그래서 p01==p02로 비교하게 되면 주소값을 비교하므로 두 객체주소가 다르다라고 출력된다.

 

두 번째 조건인 p01.equals(p02)는 오버라이딩한 equals()메소드에서 매개변수가 Object obj로 Point14의 멤버변수 x와 y를 참조하기 위해서는 다운캐스팅 형변환을 해줘야 한다. 그래서 if조건문에서 p01의 x,y와 p02의 x,y 값을 비교하고 일치하면 true를 리턴한다.

 

출력화면

 

ex)

 

Person 타입의 p01과 p02객체를 생성하는데, new연산자로 생성하므로 두 객체의 주소는 서로 다르다. 그래서 p01==p02로 비교하게 되면 주소값을 비교하므로 두 객체주소가 다르다라고 출력된다.

 

두 번째 조건인 p01.equals(p02)는 오버라이딩한 equals()메소드에서 매개변수가 Object obj로 Object obj=p02;로 업캐스팅 되었다가 if조건문에서 Person으로 다운캐스팅 할수 있는지 instanceof로 판단되고, 다운캐스팅 가능하다 판단이 되면 p01의 id와 (Person)p02로 다운캐스팅해 Person의 id와 값을 비교하고 일치하면 true를 리턴한다.

 

출력화면