모든 클래스는 Object클래스를 상속받는다고 했습니다..
API찾아보셨죠??
http://docs.oracle.com/javase/8/docs/api/
java.lang.Object API중에서도 equals(), hashCode(), toString()이라는 메소드에 대해 알아보세요..
당연하게도 모든 클래스는 (Object클래스를 상속 받으므로) 위와같은 메소드를 사용할 수 있습니다.
예를 들어 MyPuppy blackDog = new MyPuppy("GGamdol"); 이라고 객체를 하나 만들고,
String str = blackDog.toString(); 하시면
MyPuppy객체에 toString()이라는 메소드를 만들어 놓지 않았다고 하더라도,
str 이라는 로컬변수는 blackDog객체에 대한 정보를 담게 됩니다.
System.out.println(str);하면 출력할 수 있겠지요... (클래스이름@해쉬코드)
위의 내용은 System.out.println(blackDog);과 같습니다.
즉, println이라는 메소드는 객체의 toString()메소드를 찾아 출력합니다.
그런데, toString()이라는 똑같은 메소드를 MyPuppy클래스에 만들어서 객체를 출력하면,
Object클래스의 toString()이 아닌, MyPuppy에서 만들어 놓은 toString()메소드를 호출하겠지요?
MyPuppy클래스의 name(개의 이름)을 출력하게 하는 것이 더욱 보기가 좋겠네요..
-
public String toString()
-
{
-
return name;
-
}
이렇게 한다면 클래스이름@해쉬코드가 나오는 대신 GGamdol이라고 출력되겠지요?
이렇게 상위클래스의 메소드와 똑같은(리턴형과 인자도 같은) 메소드를 하위 클래스에 만드는 것을 메소드 오버라이딩 이라고 합니다.
기능을 바꾸어 쓰는 것이죠..
Object클래스에서 만들어 놓은 여러가지 메소드들은 다른 여러 자바 표준 클래스에서 사용하는 것이므로, 오버라이딩 해서 사용하시면 됩니다.
자!! 프로젝트로 돌아와서...
Card클래스와 CardDeck 클래스에 toString()메소드를 추가해 보세요!!!
그럼 SutDaCard클래스를 만들어 봅시다. 카드 20장을 직접 세팅해야 겠지요??
-
/**
-
* SutDaCard클래스 섯다게임에 필요한 20벌의 카드를 가지고 있습니다. <br />
-
* CardDeck에서 구현한 메소드를 사용할 수 있습니다. <br />
-
* @author 내이름
-
* @version 1.0
-
* @see Card
-
* @see CardDeck
-
*/
-
public class SutDaCard extends CardDeck{
-
/**
-
* stuDaCard : 카드덱클래스의 인스턴스 변수
-
* shape[] : sutDaCard에 배정될 모양
-
* num[] : sutDaCard에 배정될 숫자
-
*/
-
private static final String[] shape={"광", "피"};
-
private static final int[] num = {1,2,3,4,5,6,7,8,9,10};
-
/**
-
* shape[]과, num[]으로 생성자 호출
-
*/
-
public SutDaCard(){
-
super(shape, num);
-
}
-
}
이제 구체적인 SutDaCard가 만들어 졌습니다.
SutDaCard는 CardDeck클래스를 상속받았습니다...
이 클래스의 생성자 에서 호출하는 super(shape, num); 이라는 메소드는
CardDeck클래스의 public CardDeck(String[] shape, int[] num); 이라는 메소드를 호출하여
ArrayList를 생성할 것입니다. 그리고, 이카드는 CardDeck클래스에서 정의한 메소드들을 모두 사용할 수 있습니다.
shuffle(); 섞을수 있고, getOne(); 한 장을 가져올 수 있으며, size(); 크기를 알 수 있습니다.
테스트 클래스를 만들어 한번 사용해 봅시다..
-
public class SutDaTest {
-
public static void main(String[] args) {
-
SutDaCard sd = new SutDaCard(); // SutDatCard클래스의 인스턴스 변수에 객체 연결
-
System.out.println(sd); // sd.toString() 출력
-
sd.shuffle(); // CardDeck 클래스의 shuffle()메소드 .. Collections.shuffle()
-
System.out.println(sd); // sd.toString() 출력
-
int cardSize = sd.size();
-
System.out.println("카드덱의 크기 " + cardSize);
-
Card one = sd.getOne();
-
System.out.println(one);
-
cardSize = sd.size();
-
System.out.println("카드덱의 크기 " + cardSize);
-
}
-
}
테스트 클래스의 SutDaCard 객체 sd의 행동(메소드)들이 잘 테스트 되지요??
SutDaCard클래스는 정말 보잘것 없지만.. 생성자만 덜렁 하나 있습니다..
CardDeck클래스의 모든것을 사용할 수 있습니다.