반응형
우선 아래 자바코드를 보자. 이 자바코드는 간단하게 랜덤 덱을 생성하고, 덱에서 랜덤 카드를 뽑는 기능을 하고 있습니다. 이 코드를 실행하고 보면 이러한 결과가 나옵니다
Card2@6bc7c054
class Card2{
static int typeNumber = 2;
static int MaxNumber = 10;
static String[] types = {"Spade","Heart","Diamond"};
private String Shape;
private int Number;
Card2(String Shape, int Number){
this.Shape =Shape;
this.Number = Number;
}
Card2(){
this(types[(int)(Math.random() * typeNumber)],(int)(Math.random() * MaxNumber) + 1);
}
}
//덱은 카드를 '가지고 있다'의 개념이므로 상속이 아닌 포함관계를 가져야한다.
class Deck2{
static int DeckSize = 30;
private Card2 decks[] = new Card2[DeckSize];
//인스턴스 초기화 블록
{
int ind = 0;
for(int i = Card2.typeNumber; i >= 0;i--){
for(int j = 0; j < Card2.MaxNumber;j++){
decks[ind++] = new Card2(Card2.types[i], j + 1);
}
}
}
Card2 returnRandom(){
int randInd = (int)(Math.random() * DeckSize);
return decks[randInd];
}
}
public class composite3 {
public static void main(String[] args){
Deck2 d2 = new Deck2();
System.out.println(d2.returnRandom());
}
}
이 값은 무엇을 의미하는것일까요? d2의 returnRandom()에 의해서 Card2객체를 반환하게 됩니다. 그리고 이를 System.out.println을 통해서 일반 출력을 하게 되죠. 이 값은 결론적으로
System.out.println(d2.returnRandom().toString());
과 동일하게 출력을 합니다.toString()메소드는 모든 객체의 부모 객체인 Object에 존재하는 메소드입니다. 이 toString()메소드는 객체가 가지고 있는 정보들을 문자열로 반환하는 성질을 가지고 있습니다.
결론적으로 객체를 출력하면, JVM에 의해 자동적으로 toString()으로 객체를 반환한다는 의미입니다. Object객체는 모든 객체가 기본적으로 상속받는 상태이기 때문에, 메소드 오버라이딩(상위클래스가 가지고있는 메소드를 하위클래스에서 재정의하여 사용하는것을 의미)을 통해서 활용을 할 수 있습니다. 예를 들어 저는 카드 객체의 Shape와 Number를 반환하게끔 toString()을 오버라이딩 해보도록 하겠습니다. 아래와 같이 Card2에 toString()메소드를 추가해 보았습니다.
class Card2{
static int typeNumber;
static int MaxNumber;
static String[] types;
static {
System.out.println("Initiate Static variables");
typeNumber = 2;
MaxNumber = 10;
types = new String[]{"Spade", "Heart", "Diamond"};
}
private String Shape;
private int Number;
Card2(String Shape, int Number){
this.Shape =Shape;
this.Number = Number;
}
Card2(){
this(types[(int)(Math.random() * typeNumber)],(int)(Math.random() * MaxNumber) + 1);
}
@Override
public String toString(){
String info = "Card Shape : " + this.Shape + " | Card Number : " + this.Number;
return info;
}
}
//덱은 카드를 '가지고 있다'의 개념이므로 상속이 아닌 포함관계를 가져야한다.
class Deck2{
static int DeckSize = 30;
private Card2 decks[] = new Card2[DeckSize];
//인스턴스 초기화 블록
{
int ind = 0;
for(int i = Card2.typeNumber; i >= 0;i--){
for(int j = 0; j < Card2.MaxNumber;j++){
decks[ind++] = new Card2(Card2.types[i], j + 1);
}
}
}
Card2 returnRandom(){
int randInd = (int)(Math.random() * DeckSize);
return decks[randInd];
}
}
public class composite3 {
public static void main(String[] args){
Deck2 d2 = new Deck2();
System.out.println(d2.returnRandom());
}
}
이렇게 하면 결과값은 아래와 같이 나오게 됩니다.
Initiate Static variables
Card Shape : Spade | Card Number : 6
반응형
'Language > Java' 카테고리의 다른 글
[Java]super (1) | 2021.12.28 |
---|---|
[Java]오버라이딩(Overriding) (0) | 2021.12.28 |
[Java]변수의 초기화 (0) | 2021.12.27 |
[Java]Java 문자열 보간표현식(Formatter) (0) | 2021.12.27 |
[Java]JVM메모리 구조 (0) | 2021.12.26 |