class SutdaCard {
int num;
boolean isKwang;
SutdaCard() {
this(1, true);
}
SutdaCard(int num, boolean isKwang) {
this.num = num;
this.isKwang = isKwang;
}
public boolean equals(Object obj) {
/*
(1) 매개변수로 넘겨진 객체의 num, isKwang과 멤버변수 num, isKwang을 비교하도록 오버라이딩 하시오.
*/
}
public String toString() {
return num + ( isKwang ? "K":"");
}
}
[실행결과] c1 = 3K c2 = 3K c1.equals(c2) : true 위 처럼 나와야 함. |
<나의 풀이>
class SutdaCard {
int num;
boolean isKwang;
SutdaCard() {
this(1, true);
}
SutdaCard(int num, boolean isKwang) {
this.num = num;
this.isKwang = isKwang;
}
public boolean equals(Object obj) {
/*
(1) 매개변수로 넘겨진 객체의 num, isKwang과 멤버변수 num, isKwang을 비교하도록 오버라이딩 하시오.
*/
if ( obj.equals(num) == super.equals(num) && obj.equals(isKwang) == super.equals(isKwang) ){
return true;
}else{
return false;
}
}
public String toString() {
return num + ( isKwang ? "K":"");
}
}
잘못된 풀이 방법이다.
매개변수와 멤버변수를 비교하는 것인데
obj.equals(num)이나 super.equals(num)이나 똑같은 멤버변수를 가리키때문에 true를 반환한다.
바보처럼 이게 정답인 줄 알았다.
public boolean equals(Object obj) {
if(obj instanceof SutdaCard) {
SutdaCard c = (SutdaCard)obj;
return num==c.num && isKwang==c.isKwang;
}
return false;
}
매개변수가 Object타입이므로 어떤 타입의 인스턴스도 매개변수로 가능하다.
그래서 반드시 instanceof로 확인한 후에 형변환해서 멤버변수 num과 isKwang의 값을 비
교해야한다. 만일 instanceof의 결과가 false라면 멤버변수의 값을 비교할 필요도 없이
그냥 false만 반환하면 된다.
내 친구는 아래와 같은 방법을 썼다.
SutdaCard tempCard = (SutdaCard)obj;
if ( tempCard.num == num && tempCard.isKwang == isKwang ){
return true;
} else {
return false;
}
[배운 점]
1. Object 클래스
Object 클래스는 모든 클래스의 최고 조상이다라는 것은 알고 있다.
따라서 아무렇게나 abcdefg 라는 클래스를 만들어도 인스턴스 생성없이
equals 메서드 등을 사용할 수 있다.
2. instanceof 연산자
public boolean equals(Object obj) {
if(obj instanceof SutdaCard) {
SutdaCard c = (SutdaCard)obj;
return num==c.num && isKwang==c.isKwang;
}
return false;
}
위 예제를 통해서 알아보자.
연산결과가 true라면 참조변수가 검사한 타입으로 형변환이 가능하다는 것을 의미한다.
(즉, SutdaCard로 형변환이 가능!)
조상타입의 참조변수(obj)로는 실제 인스턴스의 멤버들을 모두 사용할 수 없기 때문에
"instanceof" 연산자를 이용해서 참조변수 obj가 가리키는 인스턴스 타입을 체크하고,
실제 인스턴스와 같은 타입의 참조변수로 형변환을 해야만 인스턴스의 모든 멤버를 사용할 수 있다.
'프로그래밍 > 코드분석' 카테고리의 다른 글
자바의 정석 연습문제 6-2 (0) | 2016.08.16 |
---|---|
자바의 정석 연습문제 9-4 (0) | 2016.08.13 |
자바의 정석 연습문제 9-3 (0) | 2016.08.13 |
자바의 정석 9-20 코드분석 (0) | 2016.08.12 |
자바의 정석 8-9 코드분석 (0) | 2016.08.09 |