언어 및 도구들 공부/Java

toString 에서의 출력값(해시코드)

Dr.Mlem 2024. 9. 24. 12:19

Q

/** * 프로토스 종족의 기본 특성을 정의하는 클래스 * - public이 적용된 클래스는 다른 파일에 정의된 class가 활용가능 * - public이 적용된 클래스는 소스 파일당 단 하나만 존재할 수 있다. */ public class Protoss { /** 이름 */ private String name; /** 체력 */ private int hp; /** 속도 */ private int speed; /** 초당 공격력 */ private int dps; /** * 프로토스 객체를 만들기 위한 생성자 * @param name Unit의 이름 * @param hp 체력 * @param speed 속소 * @param dps 초당 공격력 */ public Protoss(String name, int hp, int speed, int dps){ this.name = name; this.hp = hp; this.speed = speed; this.dps = dps; System.out.printf(">> 유닛이 생성되었습니다. --> 이름: %s, 체력: %d, 공격력: %d\n", name, hp, dps); } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public int getHp() { return this.hp; } public void setHp(int hp) { this.hp = hp; } public int getSpeed() { return this.speed; } public void setSpeed(int speed) { this.speed = speed; } public int getDps() { return this.dps; } public void setDps(int dps) { this.dps = dps; } /** * 지정된 위치로 이동한다. * @param position 이동할 위치 */ public void move(String position){ System.out.printf("%s(이)가 %s까지 이동합니다.\n", this.name, position); } /** * 지정된 개상을 공격한다. * @param target 공격할 대상. */ public void attack(String target){ System.out.printf("%s(이)가 %s까지 이동합니다. --> 데미지: %d\n", this.name, target, this.dps); } @Override // 어노테이션, 난 밑의 이 코드를 이 기능으로 쓰겠다고 알리는 것, 오타 방지용. public String toString() { return "{" + " name='" + getName() + "'" + ", hp='" + getHp() + "'" + ", speed='" + getSpeed() + "'" + ", dps='" + getDps() + "'" + "}"; } } .

(18단원 실습 Protoss 클래스)


이런 클래스에서, toString 오버라이드를 제거하고,

public class Ex01_toString { public static void main(String[] args) throws Exception{ Protoss probe = new Protoss("프로브 1호", 50, 30, 1); System.out.println(probe.toString()); // Protoss 클래스에서 toString을 오버라이드 했기에 나오는 출력문. } // 안하면 나오는건 프로브 객체의 해쉬값? 아마도. }
(실습 18-01 toString)

라고 코드를 작성한다면, 출력되는 결과값은 probe 객체의 해쉬값이 나오는 것인가?


 

네, 정확합니다!

toString 메서드를 오버라이드하지 않으면, 기본적으로 Object 클래스에서 제공하는 toString() 메서드가 호출됩니다. Object 클래스의 toString()은 객체의 클래스 이름과 해시 코드를 반환하는데, 이는 객체의 고유한 식별자(메모리 주소와 연관)와 관련된 값입니다.

예를 들어, Protoss 클래스에서 toString() 메서드를 오버라이드하지 않으면, 아래와 같은 형식의 값이 출력될 것입니다:

Protoss@1a2b3c4d

이 출력은 다음과 같은 구조를 따릅니다:

  • 클래스 이름 (Protoss)
  • 해시코드 (16진수로 나타낸 고유 식별 값, 예: 1a2b3c4d)

따라서, 질문하신 것처럼 toString() 메서드를 오버라이드한 경우에는 오버라이딩된 메서드에서 지정한 형식으로 출력이 되겠지만, toString() 오버라이드를 제거한 경우에는 객체의 클래스 이름과 해시 코드가 출력됩니다.

java
 
System.out.println(probe.toString()); 

위 코드에서 오버라이드된 toString()을 제거하면, Protoss@hashcode와 같은 값이 출력될 것입니다.