Notice
Recent Posts
Recent Comments
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

toString(), toString()의 오버라이딩 본문

Java/JAVA2

toString(), toString()의 오버라이딩

빌드이너프 2023. 6. 25. 16:38

toString()

객체를 문자열(String)으로 변환하기 위한 메서드

getClass(): 설계도 객체

getName(): 클래스 이름

"@": at이라고 하고, 위치를 의미함

Interger.toHexString: 16진

hashCode(): 객체 주소

public String toString() { // Object 클래스의 toString()
    return getClass().getName()+"@"+Interger.toHexString(hashCode());
}

 

Card@7c75222b

클래스 이름: Card

주소값: 7c75222b

class Card {
    String kind ;  // 카드의 무늬 - 인스턴스 변수
    int number;  // 카드의 숫자 - 인스턴스 변수

    Card() {
        this("SPADE", 1);
    }

    Card(String kind, int number) {
        this.kind = kind;
        this.number = number;
    }
}


class CardTest{
    public static void main(String args[]) {
        Card c1 = new Card();
        Card c2 = new Card();

        System.out.println(c1.toString());
        System.out.println(c2.toString());
    }
}

Card@7c75222b
Card@4c203ea1

 

 

toString()의 오버라이딩

iv 값을 출력하도록 오버라이딩

iv 값을 출력하는 이유: 객체가 iv 집합이므로 객체를 문자열로 변환한다는 것은 iv 값을 문자열로 변환한다는 것과 같다

class Card {
    String kind ;  // 카드의 무늬 - 인스턴스 변수
    int number;  // 카드의 숫자 - 인스턴스 변수

    Card() {
        this("SPADE", 1);
    }
    
    Card(String kind, int number) {
        this.kind = kind;
        this.number = number;
    }

    // Object 클래스의 toString()을 오버라이딩
    public String toString() {
        return "kind: " + kind + ", number: " + number;
    }
}


class CardTest{
    public static void main(String args[]) {
        Card c1 = new Card();
        Card c2 = new Card();

        System.out.println(c1.toString());
        System.out.println(c2.toString());
    }
}

kind: SPADE, number: 1
kind: SPADE, number: 1

 

equals로 알아볼 수 있다(대신 equals 오버라이딩하기)

equlas를 오버라이딩 했기 때문에 hashCode()도 오버라이딩해야 된다

Objects 클래스는 객체와 관련된 유용한 메서드를 제공하는 util 클래스이다

int hash(Object... values) {...}: 매개변수가 가변인자(Objects...)라서 호출 시 지정하는 값의 개수가 정해져있지 않다

*equals가 true일 때 hashCode는 똑같이 나와야 한다(-1842861219)

import java.util.Objects;

class Card {
    String kind ;  // 카드의 무늬 - 인스턴스 변수
    int number;  // 카드의 숫자 - 인스턴스 변수

    Card() {
        this("SPADE", 1);
    }

    Card(String kind, int number) {
        this.kind = kind;
        this.number = number;
    }

    // equals()를 오버라이딩하면 hashCode()도 오버라이딩 해야한다
    public int hashCode() {
        return Objects.hash(kind, number);
    }

    public boolean equals(Object obj) {
        if (!(obj instanceof Card)) {
            return false;
        }
        Card c = (Card)obj;
        return this.kind.equals(c.kind) && this.number == c.number;

    }

    // Object 클래스의 toString()을 오버라이딩
    public String toString() {
        return "kind: " + kind + ", number: " + number;
    }
}


class CardTest{
    public static void main(String args[]) {
        Card c1 = new Card();
        Card c2 = new Card();

        System.out.println(c1.equals(c2));

        System.out.println(c1.hashCode());
        System.out.println(c2.hashCode());
    }
}

-1842861219
-1842861219

 

 

hashCode를 주석처리하면 다른 값 나옴

import java.util.Objects;

class Card {
    String kind ;  // 카드의 무늬 - 인스턴스 변수
    int number;  // 카드의 숫자 - 인스턴스 변수

    Card() {
        this("SPADE", 1);
    }

    Card(String kind, int number) {
        this.kind = kind;
        this.number = number;
    }

    // equals()를 오버라이딩하면 hashCode()도 오버라이딩 해야한다
//    public int hashCode() {
//        return Objects.hash(kind, number);
//    }

    public boolean equals(Object obj) {
        if (!(obj instanceof Card)) {
            return false;
        }
        Card c = (Card)obj;
        return this.kind.equals(c.kind) && this.number == c.number;

    }

    // Object 클래스의 toString()을 오버라이딩
    public String toString() {
        return "kind: " + kind + ", number: " + number;
    }
}


class CardTest{
    public static void main(String args[]) {
        Card c1 = new Card();
        Card c2 = new Card();

        System.out.println(c1.equals(c2));

        System.out.println(c1.hashCode());
        System.out.println(c2.hashCode());
    }
}

2088051243
1277181601