equals()메서드
정의
두 인스턴스의 주소값을 비교하여 true/false값(boolean값)을 을 반환하고
인스턴스가 다르더라도 주어진 정보값들이 동일한 경우(논리적인 경우) true을 반환하도록 재정의 가능한 메서드
특징
- 멤버변수 값이 동일하다면 서로 다른 주소 값을 가질 때도 같은 인스턴스라고 정의할 수 있음.
참고)
물리적 동일성뿐 아니라 논리적 동일성을 구현할 때도 equals()메서드를 재정의해서 사용가능
물리적 동일성 = 인스턴스의 메모리 주소가 같은 것
논리적 동일성 = 논리적으로 두 인스턴스가 같은 것
- 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 |