728x90
객체비교 equals()
Object의 equals() 메소드
package sec03.exam01_equals;
public class Member {
public String id;
//생성자 (클래스를 토대로 인스턴스를 처음 만들때 세팅하는 것)
//String 매개변수 id를 받아서 필드값 id에 할당(전달, 대입)
public Member(String id) {
this.id = id;
}
/*메서드 : 이 인스턴스가 가지고있는 기능!
메서드 : Object에 있는 eauals 매서드를 재정의
오버라이딩은 상속을 받아서 재정의하는 것인데, Member은 상속 어디서?
모든클래스는 Object라는 클래스에서 시작되며, 상속을 받습니다.
equals를 재정의해서 새로운 비교구문을 스스로 만들기
@ : 어노테이션은 아래메서드의 성질을 JVM에게 선언해주는 구문
public : 접근제한자로서 모두다 접근가능
boolean : 이 메서드가 실행되고 최종적으로 반환 (리턴)되는 "타입"이 boolean(true/fasle 둘중하나반환)
(Object obj) : 매개변수로서 어떤 인스턴스든 Object로 형변환 된다
어떤 클래스든 Object 객체를 모두 상속받기 때문에 최고 부모클래스인 Object로 "자동형변환"이 가능하다
어디까지나 타입의 형변환입니다 (인스턴스의 타입이 바뀌는 게 아님)
Member obj4 = new Member("blue"); > Object obj4 = new Member("blue")*/
@Override
public boolean equals(Object obj) {
//실제로 구현된 인스턴스의 타입은 Member이기 때문에 if문에 true가 뜸
if(obj instanceof Member) {
//Member 타입으로 obj매개변수를 형변환
//Member라는 변수명으로 obj(주소)가 연결
Member member = (Member) obj;
//id = member의 필드값
//id = String이기 때문에 참조타입이므로 equals를 통해 비교
//인스턴스의 id라는 필드값과 매개변수 obj(member)의 id를 비교
if(id.equals(member.id)) {
return true;
}
}
//매개값이 Member타입이 아니거나 id 필드값이 다른 경우 false를 리턴
return false;
}
}
new연산자로 만든 것은 주소값이 다르다...
멤버객체가 다르더라도, 그안의 id값이 같으면 true를 리턴하도록 만듦
package sec03.exam01_equals;
public class MemberExample {
/*main 클래스는 프로그램이 시작할때 처음 동작하는 메서드(객체안에 무조건 메서드가있고, 실행시킨다)
String[] 배열은 os(윈도우)에서 초기에 데이터를 받는 입구
public : 접근제한자로서 모두다 접근가능
static : 프로그램에서 딱1개로 인스턴스로 못만듬
void : return값이 없어서 메서드가 실행되고 바로 끝*/
public static void main(String[] args) {
/*인스턴스 생성
선언 부분 : (선언)Member타입으로 obj1 변수명으로 선언
= : 대입연산자 (우측에 있는 인스턴스를 좌측에 있는 선언부분에 할당 (연결))
new : 인스턴스 부분으로 실제로 메모리에 할당되는 값
(실제)Member타입으로 실제로 구현(인자값 string 넣기기)*/
Member obj1 = new Member("blue");
Member obj2 = new Member("blue");
Member obj3 = new Member("red");
//메모리에 obj라는 객체가 3개 할당된 상황 (주소값)
//재정의된 equals사용
if(obj1.equals(obj2)){
System.out.println("obj obj2 같음");
//obj와 obj2 객체를 비교(단, 참조타입이어서 equals 메서드를 써서 비교)
//기본타입끼리 비교시 == 사용
} else {
System.out.println("obj1 obj2 같지 않음");
}
if(obj1.equals(obj3)){
System.out.println("obj1 obj3 같음");
} else {
System.out.println("obj1 obj3 같지 않음");
}
/*obj3라는 변수명(선언부분)에 obj2의 실제값을 대입(주소연결)
기존, obj3에 할당된 인스턴스대신에, obj2의 인스턴스가 연결되어서
원래있던 obj에 할당된 인스턴스는 연결 끊어짐 (가비지컬렉터가 찾아서 회수)*/
obj3 = obj2;
if(obj2.equals(obj3)){
System.out.println("obj2 obj3 같음"); //같은 인스턴스 주소를 가르키기 때문에
//인스턴스가 같다고보고, if문의 true 값이 나옴
System.out.println(obj3.id);
System.out.println(obj2.id);
} else {
System.out.println("obj2 obj3 같지 않음");
}
}
}
기본적으로 equals는 현재객체와 지금 매개값으로 들어오는 (Object obj)객체의 번지를 비교한다.
.equals() 메소드는 두객체를 비교해서 논리적으로 동등하면 true를 리턴하고 그렇지 않으면 false를 리턴한다.
(논리적으로 동등하다는것 = 같은객체이건 다른 객체이건 상관없이 객체가 저장하고 잇는 데이터가 동일함을 뜻)
예: String 클래스는 equals()를 재정의해서 String 객체간에 문자열을 비교한다.
Object의 equals() 메소드는 직접 사용되지않고, 하위 클래스에서 재정의하여 논리적으로 동등 비교할 때 이용된다.
예: Member객체는 다르지만 id 필드값이 같으면 논리적으로 동등한 객체로 취급하고 싶을 경우 Object의 equals()메소드를 재정의해서 id 필드값이 같음을 비교하면된다.
객체비교 equals() 문제
학생이름과 조번호를 갖고있는 class를 만들고 getter, setter를 통해 데이터를 조회할수있도록 구성하시오
학생이름과 조번호를 갖고 equals 를 오버라이딩으로 동명이인이라도 다른사람인지 같은사람인지 구분할수있도록 구성
"김준석" 1(조) , "김준석" 2(조) 가 같은이름이더라도 "다르다고" equals를 오버라이딩 구현하시오
package sec03.exam01_equals;
public class Student {
//접근제한자
/*private 같은 클래스내에서만 접근가능
public 모두다 접근가능
default 같은 패키지 내에서 접근 가능
protect 같은 패키지 + 상속 내에서 접근 가능*/
//필드
private String name;
private int groupNum;
/*생성자 : 생성자는 class이름과 동일
오버로딩 : 생성자의 매개변수를 통해 다양한 타입으로 생성
기본적으로 생성자(매개변수 없는)1개는 있다 - 안보일 뿐
public Student(){}*/
public Student(String input_name, int input_groupNum){
//this : 제일 가까운 객체를 지칭 > Student 라는 클래스
//this.name = Student의 필드 name
//this.groupNum = Studetn의 필드 groupNum
this.name = input_name;
this.groupNum = input_groupNum;
}
//메서드
/*getter,setter쓰는이유 : 객체의 캡슐화, 데이터 입출력이라는 기능의 메서드는 기능을 잘쓰기 위해서
외부에서 필드값을 바로 조회 또는 수정을 막기 위해서! 객체는 딱 닫혀야 한다.*/
public int getGroupNum() {
return groupNum;
}
public String getName() {
return name;
}
public void setGroupNum(int input_groupNum) {
this.groupNum = input_groupNum;
}
public void setName(String input_name) {
this.name = input_name;
}
//Student 인스턴스 타입으로 아래 equals라는 메서드의 매개변수로 들어감(단 Object로 "타입"형변환)
//equals재정의
@Override
public boolean equals(Object obj){
//instanceof : 메모리 heap에 있는 인스턴스끼리 비교
//상속 받았다면 부모클래스도 동일하다고 true가 나온다.
if(obj instanceof Student) {
Student student = (Student) obj;
if(groupNum == student.getGroupNum() && name.equals(student.getName())){
return true;
}
}
return false;
}
}
equals를 재정의★↑
package sec03.exam01_equals;
public class StudentExample {
public static void main(String[] args) {
Student obj1 = new Student("김준석", 1);
Student obj2 = new Student("김준석", 2);
if(obj1.equals(obj2)){
System.out.println("student1과 student2 같음");
} else {
System.out.println("student1과 student2 같지않음");
}
/*obj1라는 변수명(선언부분)에 obj2의 실제값을 대입(주소연결)*/
obj1 = obj2;
if(obj1.equals(obj2)){
System.out.println("student1과 student2 같음");
System.out.println(obj1.getName());
System.out.println(obj1.getGroupNum());
} else {
System.out.println("student1과 student2 같지않음");
}
}
}
이미지출처 : 이것이자바다
728x90
'STUDY > JAVA' 카테고리의 다른 글
[JAVA-이것이자바다.9장] 중첩 클래스와 중첩 인터페이스 확인 문제 (0) | 2022.07.20 |
---|---|
[JAVA] 22-07-20 자바 API / Object 클래스 ☑ (0) | 2022.07.20 |
[JAVA-이것이자바다.8장] 인터페이스 확인 문제 (0) | 2022.07.19 |
[JAVA] 22-07-19 예외(Exception) ☑ (0) | 2022.07.19 |
[JAVA-이것이자바다.7장] 상속 확인 문제 (0) | 2022.07.18 |