본문 바로가기

프로그래밍/코드분석

자바의 정석 연습문제 9-1

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