본문 바로가기

JAVA

[JAVA] toString() 오버라이딩

반응형

오버라이딩에 대해서 공부를하다가 toString() 오버라이딩이 값을 출력한다?

대충 이런 뜻으로만 이해되고 출력을 해주는 정확한 이유에 대해서 헷갈려서 

하기와 같이 정리해보고자 합니다. 

 

가장먼저 Object클래스에 대해서 알아야만 toString() 메소드를 이해할 수 있습니다. 

Object클래스

Object클래스는 모든 클래스의 최고 조상이기 때문에 Object클래스의 멤버들은 모든 클래스에서 바로 사용가능합니다. 
Object클래스는 멤버변수는 없고 오직 11개의 메소드만 가지고 있습니다. 
즉, Object클래스는 모든 클래스를 상속 가능한 부모클래스라고 생각하면 됩니다. 

toString() 메소드 

이 메소드는 인스턴스에 대한 정보를 문자열(String)로 제공할 목적으로 정의한 메소드 입니다. 

Object클래스에 정의된 toString()은 아래와 같습니다. 

public String toStrin() { return getClass().getName()+"@"+Integer.toHexString(hashCode()); }

클래스를 작성할 때 toString()을 오버라이딩 하지 않는다면,

클래스의 이름과 그 값이 저장된 위치를 알려주는16진수 해시코드를 얻게됩니다. 

 

< 예시 > 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package class04;
 
// 최상위 클래스 Object 
class Book{
 
}
    public class Test10 {
        public static void main(String[] args) {
            
            Book b = new Book();
            
            System.out.println(b);
        }
}
cs

 

< 출력값 >

 

이는 b라는 객체 안에 toString()이라는 메소드가 없어서

부모클래스인 Object클래스에 포함되어 있는 toString()메소드를 불러온 것 입니다. 

출력값을 자세히 살펴보면 패키지+클래스명 @ 주소값 이렇게 나오게 됩니다. 

위와같이 b객체를 출력했는데 어떻게 String타입의 주소가 출력되는걸까 의문점이 생깁니다. 

 

이는 사실 객체 뒤에는 주소값을 출력할 수 있도록 toString()이 생략되어 있습니다. 

만약에 toString()을 주소값이 아닌 다른 형태로 출력하고 싶다면 오버라이딩을 하면 됩니다. 

오버라이딩 : 부모클래스의 메소드명, 매개변수의 수, 리턴타입 등이 같아야 하며,
대신 메소드 안의 내용만 재정의하는 것

< 오버라이딩 예시 > 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package class04;
 
// 최상위 클래스 Object 
class Book{
 
    @Override
    public String toString() {
        
        return "책입니다";
    }
}
    public class Test10 {
        public static void main(String[] args) {
            
            Book b = new Book();
            
            System.out.println(b);
        }
}
 
cs

<출력값>

toString()의 결과 값은 결국 제가 정의한 return값이 나오는걸 확인할 수 있습니다. 

 

 

반응형