Languages/Java

[Java]toString() 메서드는 왜 만들어졌을까?

MoonSta 2023. 1. 30. 14:08

toString() 메서드는 왜 만들어졌을까?

객체를 문자열로 리턴하기 위해 사용한다고 알고 있던 toString() 메서드에 대해 의문이 생겨 이 글을 작성하게 되었다. 

 

toString()의 반환 결과

 Java에 모든 클래스들은 최상위 클래스 Object를 상속받는다. 따라서 Object의 정의된 메서드 또한 사용이 가능하다. toString() 메서드 또한 Object에 정의된 메서드 중 하나로 반환 형식은 다음과 같다.

getClass().getName() + '@' + Integer.toHexString(hashCode())

 

toString() 예시 코드

class Blog {

    private Strintg name;
    private int count;  
}

package moon;

public class moon {
    public static void main(String[] args) {
    
        Blog blog = new Blog("Moonstar", 100);
        
        System.out.println(blog);
        System.out.println(blog.toString());
    }
}

//결과
//Blog.moon@**********
//Blog.moon@**********

 왜 두 개의 결괏값이 같은 것일까? 이것이 내가 가진 첫 번째 의문이었다. 이것의 이유는 생각보다 간단했다. 기본적으로 PrintStream에서 출력 관련 메서드를 통해 객체를 출력하면 내부적으로 toString()를 호출하기 때문에 결과적으로 같은 값이 출력되는 것이었다. 

 

 두 번째 의문은 객체를 문자열로 리턴하기 위해 사용하는 toString() 메서드의 결괏값이 눈으로 보기에 별 의미 없어 보였다는 것이다. 이것의 의문 또한 찾아보니 별 게 아니었다. 사용자의 용도에 맞게 각각 재정의해서 사용하면 되는 것이다. 

 

재정의해서 사용하라 !

class Blog {

    private Strintg name;
    private int count;
    
    public Blog(String name, Int count) } {
        this.name = name;
        this.count = count;
    }
    
    @Override
    public String toString() {
        return "블로그의 이름은 " + name + "," + "포스팅의 개수는" + count);
    }
}

package moon;

public class moon {
    public static void main(String[] args) {
    
        Blog blog = new Blog("Moonstar", 100);
        
       
        System.out.println(blog);
    }
}

//결과
//블로그의 이름은 Moonstar, 포스팅의 개수는 100

 

 

💥참고

 위와 같이 toString()의 대한 재정의를 하였다. 하지만 여럿이서 진행하는 프로젝트의 경우 toString()의 재정의를 하면 타 개발자가 의도파악을 하기 힘들기 때문에 재정의 후 메서드의 대한 주석을 반드시 달아주는 게 좋을 것이라고 생각한다.