출력문에서 toString() 메서드 생략하고, 객체만 출력해도 toString() 결과와 동일
⇒ 즉, 출력문에서 toString() 메서드는 생략 가능하다! (단, 출력문에서만 가능)
객체를 문자열 변수에 저장 불가
p.toString() 으로는 가능하다 (String 타입이기 때문)
4. equals(); 대상 객체와 현재 객체가 같은지를 비교
기본적으로 객체의 주소값을 비교
p와 p2 가 같은지 비교
출력창
이유는 나중에 설명!!
======== Ex5.java ⇒ equals() 메서드를 좀 더 자세하게 알아보자
< Object 클래스의 equals() 메서드 특징 >
두 객체에 대한 동등비교 수행
기본적으로 두 객체의 주소값을 비교하므로 동등비교연산자(==) 사용 결과 동일
일반적으로 '두 객체가 같다' 라는 의미는, 두 객체의 데이터(멤버변수 값)가 동일하다는 의미로 사용되는 것이 대부분이다.
⇒ 따라서, 클래스 정의 시 equals() 메서드를 오버라이딩하여 해당 객체 내의 모든 멤버변수 비교를 통해 동등여부를 리턴하도록 해야함(단축키 Alt + Shift + S → H)
자바에서 제공하는 대부분의 API 는 equals() 메서드가 오버라이딩되어 있으므로 객체간의 실제 데이터 비교를 쉽게 할 수 있다.
(ex. String, ArrayList 등)
출력창
new 할 때마다 주소값은 달라진다!
출력창
Person p2 = p1; → p1 인스턴스의 주소값을 p2 에 저장(복사)
출력창
이렇게 해도 위와 결과값은 동일
Person5 클래스 만들기
Object class 의 equals() 메서드를 오버라이딩하여 모든 멤버변수(name, age)가 같은지 비교한 후 같으면 true, 아니면 false 리턴
오버라이딩 단축키 Alt + Shift + R → V
equals 체크
Person5 생성자도 만들어주기
<Ex5.java → main()>
출력창
p3와 p4 구분 잘하기!!! ⇒ 나중에 이 부분 혼동하기 쉽습니다!!
equals() 는 누구꺼? p3 꺼, equals 에서 받아오는 파라미터값은? p4
p3 의 equals() 에서 p4를 obj 로 넣어줌
Person5 → Object 타입으로 업캐스팅 일어남(obj 는 Object 타입이기 때문)
⇒ Object는 최상위 클래스이기 때문에 어떤 클래스든 Object 로 변환하면 업캐스팅이라고 할 수 있다.
obj.name 이 없다! 왜? obj는 name을 모르기때문!
ex) 우리 업캐스팅 할 때 배운거 → 엄마한테 스마트폰을 줘도(업캐스팅) 스마트폰에 있는 카카오톡 기능을 몰라서 사용하지 못한다! )
그럼 어떻게 해야할까?
⇒ 다시 다운캐스팅 (Object 타입을 Person5 타입으로) 한 뒤 불러주면 가능하다.
( 앞에서 업캐스팅 / 다운캐스팅 배웠을 때랑 똑같음! → 모르면 앞부분 다시 공부하기 )
Obj 를 p로 다운캐스팅 후 p. 하면 name이 보임!
String 타입이므로 equals 로 비교
age 는 int 타입이므로 동등비교연산자(==)를 사용하면 됨
<Ex5.java → class Person5 {} 내부>
@Override
public boolean equals(Object obj) {
boolean result = false;
// Person5 타입 인스턴스가 파라미터로 전달될 때
// Object 타입으로 업캐스팅 일어남
⇒ Person5 타입 멤버에 접근하려면 다시 다운캐스팅 필수!
// instanceof 연산자를 사용하여
// Person5 타입으로 다운캐스팅 가능 여부 판별
if(obj instanceof Person5) {
// obj 를 Person5 타입으로 다운캐스팅 수행
Person5 p = (Person5)obj;
if(name.equals(p.name) && age == p.age) {
// 멤버변수 name 비교 && age 비교
result = true;
}
}
return result;
}
최종 코드
지금은 원리를 이해하기 위해서 하나하나 코드를 쳐봤지만, 나중엔 이렇게 따로 안만들어줘도 단축키로 자동생성 가능!