본문 바로가기
JAVA/자바의 클래스

equals()-Object클래스의 메서드

by 김꾸꾸(하트) 2022. 11. 16.

     equals()메서드     

정의

두 인스턴스의 주소값을 비교하여 true/false값(boolean값)을 을 반환하고

인스턴스가 다르더라도 주어진 정보값들이 동일한 경우(논리적인 경우) true을 반환하도록 재정의 가능한 메서드

특징

  1. 멤버변수 값이 동일하다면 서로 다른 주소 값을 가질 때도 같은 인스턴스라고 정의할 수 있음.
참고)
물리적 동일성뿐 아니라 논리적 동일성을 구현할 때도 equals()메서드를 재정의해서 사용가능

물리적 동일성 = 인스턴스의 메모리 주소가 같은 것

논리적 동일성 = 논리적으로 두 인스턴스가 같은 것
  1. JDK에서 제공하는 String클래스(문자열)와 integer클래스(정수)는 이미 재정의 되어있음

멤버변수에 같은 값이 들어간 인스턴스는 ==기호로는 달라도 equals()메서드에서는 같다고 나옴.

 

 

 

물리적 동일성과 논리적 동일성

물리적 동일성( = 두개의 인스턴스의 메모리 주소가 같음)

Person personKim = new Person(981013 , "김제하");
Person personKim2 = personKim;//생성된 인스턴스를 가리키는 참조변수 personKim 복붙.(주소복사)

personKim과 personKim2는 동일한 인스턴스를 가리킴 이때 equals()메서드를 이용해 두 변수를 비교하면 동일하다는 결과나옴

 

 

 

논리적 동일성 ( = 두 개의 인스턴스의 멤버변수 정보가 같음 )

Person personKim = new Person(981013 , "김제하");
Person personKim2 = personKim;
Person personHa = new Person(981013 , "김제하");

 

personKim,personKim2가 가리키는 인스턴스와 personHa가 가리키는 인스턴스는 서로 다른 주소를 가지고 있지만, 저장된 사람의 정보는 같다. 이런 경우 논리적으로 personKim, personKim2 , personHa 모두 같은 사람으로 처리하는 것이 맞다.

물리적 동일성과 논리적 동일성 예제

class Person{

int personID;
String personName;

public Student(int personID , String personName){
this.personID = personID;
this.personName = personName;

}

public String toString(){
return personID + "," + personName;
   }

}

public class PersonTest{
public static void main(String[] args){

     Person personKim = new Person(981013, "김제하");
		 Person personKim2 = PersonKim;
		 person personHa = new Person(981013, "김제하");	

//주소가 같은 인스턴스 비교
	if(personKim == personKim2){// ==
     System.out.println("personKim과 personKim2의 주소는 같다.");}
  else{
     System.out.println("personKim과 personKim2의 주소는 다르다.");}

	if(personKim.equals(personKim2)){// equals()메서드
      System.out.println("personKim과 personKim2는 동일하다.");}
	else{
     System.out.println("personKim과 personKim2은 동일하지 않다.");}

//정보는 같지만, 주소가 다른 인스턴스 비교
if(personKim == personHa){// ==
     System.out.println("personKim과 personHa의 주소는 같다.");}
  else{
     System.out.println("personKim과 personHa의 주소는 다르다.");}

	if(personKim.equals(personHa)){// equals()메서드
      System.out.println("personKim과 personHa는 동일하다..");}
	else{
     System.out.println("personKim과 personHa는 동일하지 않다.");}

       }

}

 

 

==기호와 equals()메서드의 차이점

== → 두 인스턴스가 있을 때 ==기호는 물리적으로 메모리 주소값이 같은 지만 여부를 확인

equals() → 메모리 주소가 다르더라도 재정의해서 논리적으로 같은 인스턴스인지 확인하도록 구현 가능

 

 

equals() 메서드 재정의하기


@Override //equals()메서드 재정의
public  boolean equals(Object obj){//모든 클래스를 객체로 받음
  if(obj instanceof Person){ //*해당 객체타입이 Person이 맞는 지 여부 체크
      Person per = (Person)obj;//Person타입으로 다운캐스팅
  if(this.personID == per.personID){ //서로의 PersonID가 같으면 true반환.
      return true;    }
  else{  return false;  }
}

return false;//*매게변수로 받은 객체 타입이 Person이 아니면 false반환.
}

 

 

최종

class Person{

int personID;
String personName;

public Person(int personID , String personName){
this.personID = personID;
this.personName = personName;   }

@Override //equals()메서드 재정의
public  boolean equals(Object obj){//모든 클래스를 객체로 받음
  if(obj instanceof Person){ //*해당 객체타입이 Person이 맞는 지 여부 체크
      Person per = (Person)obj;//Person타입으로 다운캐스팅
  if(this.personID == per.personID){ //서로의 personID가 같으면 true반환.
      return true;    }
  else{  return false;  }
}

return false;//*매게변수로 받은 객체 타입이 Person이 아니면 false반환. 
}

public String toString(){
return personID + "," + personName;  }

}

public class PersonTest{
public static void main(String[] args){
        Person personKim = new Person(981013, "김제하");
		 Person personKim2 = personKim;
		 Person personHa = new Person(981013, "김제하");	

//주소가 같은 인스턴스 비교
	if(personKim == personKim2){// ==
     System.out.println("personKim과 personKim2의 주소는 같다.");}
  else{
     System.out.println("personKim과 personKim2의 주소는 다르다.");}

	if(personKim.equals(personKim2)){// equals()메서드
      System.out.println("personKim과 personKim2는 동일하다.");}
	else{
     System.out.println("personKim과 personKim2은 동일하지 않다.");}

//정보는 같지만, 주소가 다른 인스턴스 비교
if(personKim == personHa){// ==
     System.out.println("personKim과 personHa의 주소는 같다.");}
  else{
     System.out.println("personKim과 personHa의 주소는 다르다.");}

	if(personKim.equals(personHa)){// equals()메서드
      System.out.println("personKim과 personHa는 동일하다.");}
	else{
     System.out.println("personKim과 personHa는 동일하지 않다.");}

/*personKim과 personHa는 서로 다른 메모리 주소에 존재하는 인스턴스여서
  ==기호의 값으로는 false를 제공하지만, 
  personID는 같아서 equals()메서드는 true를 제공함*/

       }

}
class Person{

int personID;
String personName;

public Person(int personID , String personName){
this.personID = personID;
this.personName = personName;   }




@Override //equals()메서드 재정의
public  boolean equals(Object obj){//모든 클래스를 객체로 받음
  if(obj instanceof Person){ //*해당 객체타입이 Person이 맞는 지 여부 체크
      Person per = (Person)obj;//Person타입으로 다운캐스팅
  if(this.personID == per.personID){ //서로의 personID가 같으면 true반환.
      return true;    }
  else{  return false;
  }
}

return false;//*매게변수로 받은 객체 타입이 Person이 아니면 false반환. 
}




public String toString(){
return personID + "," + personName;  }


}


public class PersonTest{
public static void main(String[] args){
        Person personKim = new Person(981013, "김제하");
		 Person personKim2 = personKim;
		 Person personHa = new Person(981013, "김제하");	


//주소가 같은 인스턴스 비교
	if(personKim == personKim2){// ==
     System.out.println("personKim과 personKim2의 주소는 같다.");}
  else{
     System.out.println("personKim과 personKim2의 주소는 다르다.");}

	if(personKim.equals(personKim2)){// equals()메서드
      System.out.println("personKim과 personKim2는 동일하다.");}
	else{
     System.out.println("personKim과 personKim2은 동일하지 않다.");}


//정보는 같지만, 주소가 다른 인스턴스 비교
if(personKim == personHa){// ==
     System.out.println("personKim과 personHa의 주소는 같다.");}
  else{
     System.out.println("personKim과 personHa의 주소는 다르다.");}

	if(personKim.equals(personHa)){// equals()메서드
      System.out.println("personKim과 personHa는 동일하다.");}
	else{
     System.out.println("personKim과 personHa는 동일하지 않다.");}


/*personKim과 personHa는 서로 다른 메모리 주소에 존재하는 인스턴스여서
  ==기호의 값으로는 false를 제공하지만, 
  personID는 같아서 equals()메서드는 true를 제공함*/

       }

}

 

 

 

 

 

 

 

 

출처 - Do it! 자바 프로그래밍 입문 (박은종 선생님) 

https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=157852460 

'JAVA > 자바의 클래스' 카테고리의 다른 글

Class클래스- 정보가져오기  (0) 2022.11.21
String클래스  (0) 2022.11.19
clone()메서드 - Object클래스의 메서드  (0) 2022.11.18
hashCode() 메서드 - Object클래스의 메서드  (0) 2022.11.17
Object 클래스  (0) 2022.11.15