충분히 쌓여가는
toString(), toString()의 오버라이딩 본문
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
'Java > JAVA2' 카테고리의 다른 글
String 클래스, 문자열 비교, 빈 문자열 (0) | 2023.06.26 |
---|---|
Object 클래스와 equals(), equals(Object obj)의 오버라이딩 (0) | 2023.06.25 |
hashCode() (0) | 2023.06.25 |
연결된 예외(chained exception) (0) | 2023.06.25 |
사용자 정의 예외 만들기, 예외 되던지기 (0) | 2023.06.24 |