NAVER

질문 자바 toString()메소드를 안쓸경우 @1540e19d처럼 깨집니다. 해결좀 부탁드립니다.
비공개 조회수 1,166 작성일2018.04.16
public class Product {
int price;
int bonusPoint;
Product()
{
price=0;
bonusPoint=0;
}
Product(int price)
{
this.price=price;
this.bonusPoint=(int)(price/10.0);
}
}

class Tv extends Product {
Tv() {
super(100);
}

public String getInfo() {
return "Tv";
}
}

public class Buyer {
void buy(Product p){
System.out.println(p+"을/를 구입하셨습니다.");
}


public class main {
public static void main(String[] args){
Buyer b =new Buyer();
Tv tv = new Tv();
b.buy(tv);
}
}

여기서 getInfo()메소드를 toString()메소드로 바꾸면 문제가 없지만 getInfo()메소드를 쓰면 제목처럼 깨져 나오는 이유가 뭔가요? 그리고 해결방법도 부탁드립니다.
프로필 사진

답변자님,

정보를 공유해 주세요.

2 개 답변
1번째 답변
프로필 사진
비공개시채택불가
절대신 열심답변자
IT/인터넷업 #네이버운영진은 #똑바로일하세요 휴대전화서비스 5위, SKT 3위, LGU+ 4위 분야에서 활동
본인 입력 포함 정보
기본적으로 Java에서 모든 조상 클래스는 Object입니다. 또한 Object 타입의 toString() 메소드는 "클래스명@해쉬값"을 출력하게 되어 있습니다. 하지만 이를 오버라이딩을 하게 된다면 이를 바꿀 수 있습니다. 왜 그 메소드가 상속이 되나면 "+" 연산을 위해서입니다. System.out.println에서 "+" 연산을 통해서 출력을 하게 되는데 이게 바로 toString() 메소드가 호출되면서 결합이 되는 것입니다.

System.out.println(p+"을/를 구입하셨습니다.");
여기서 p는 Product 객체의 인스턴스이며, 그냥 p를 출력하기에 Object에서 상속된 toString() 메소드를 호출해서 그렇습니다.
만약 p.getInfo() 를 호출하게 된다면 오류가 발생하게 됩니다. 왜냐?? p는 현재 Product 쪽을 위주로 생각하고 있고 Product 클래스는 getInfo() 라는 메소드가 없기에 p가 Tv 클래스를 할당받더라도 다형성 측면에서 메소드가 실제 클래스에 따라 다르게 호출될 수는 있지만 getInfo() 라는 메소드가 여전히 없는 것으로 생각하기에 오류가 발생합니다.
하지만 이를 억지로 형변환해서 (Tv)p 이런식으로 가능하지만 Product를 상속받는 Computer 클래스가 p에 할당받게 된다면 오류가 발생하게 됩니다. 또한, 이러한 하향 형변환은 절대 해당 클래스 내에서는 일어나서는 안됩니다. 객체지향 프로그래밍의 원칙상 Product는 추상적으로 생각을 하고 실제 실행은 외부에서 오버라이딩에 따라서 출력 등을 수행합니다.
<<따라서, toString() 메소드로 변환하거나 추상클래스를 권장합니다.>> Product를 abstract 클래스와 그에 따른 getInfo도 역시 abstract 메소드로 설정을 하거나 그렇게 해야 합니다. Product는 추상적 클래스가 현실세상에 맞고 Tv, Computer는 실제 클래스가 적합합니다.
동물이 코끼리, 토끼 등등 되듯이 실제 객체가 '동물'이라는 것이 될 수 없기에 abstract 클래스를 잘 생각해 보시기 바랍니다.

가장 바람직한 코드는 다음과 같습니다.

2018.04.16.

  • 채택

    질문자가 채택한 답변입니다.

이 답변의 추가 Q&A
질문자와 답변자가 추가로 묻고 답하며 지식을 공유할 수 있습니다.
도움이 되었다면 UP 눌러주세요!
UP이 많은 답변일수록 사용자들에게 더 많이 노출됩니다.
2번째 답변
프로필 사진
삭제된 답변
작성자가 직접 삭제한 답변입니다.
2018.04.16.