public class StudentTest {
public static void main(String[] args) {
Student me = new Student("park");
System.out.println(me);
}
}
//결과
//hashandequal.practice01.Student@2d209079
객체를 만들고 해당 객체를 출력해보면 hashandequal.practice01.Student@2d209079 해당 값이 출력된다. 그 이유는 우리가 기본 생성자를 생성하지 않아도 컴파일러가 알아서 기본생성자를 생성해주는 것과 동일하게 객체를 출력하면 컴파일러가 자동으로 toString() 메서드를 실행한다.
그렇다면 toString() 메서드가 무엇인지 알아보자.
toString()
개체의 문자열 표현을 반환합니다. 일반적으로 toString 메서드는 이 개체를 "텍스트로 나타내는" 문자열을 반환합니다. 결과는 간결하지만 사람이 쉽게 읽을 수 있는 유익한 표현이어야 합니다. 모든 하위 클래스가 이 메서드를 재정의하는 것이 좋습니다. Object 클래스의 toString 메서드는 객체가 인스턴스인 클래스 이름, at-sign 문자 '@' 및 객체 해시 코드의 부호 없는 16진수 표현으로 구성된 문자열을 반환합니다. 즉, 이 메서드는 다음 값과 동일한 문자열을 반환합니다.
getClass().getName() + '@' + Integer.toHexString(hashCode())
출처 : https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html
자바 공식 문서에서 toString() 메서드의 정의를 발췌했는데 요약하자면 객체의 정보를 제공해주는 메서드이다.
우리는 모든 클래스가 Object라는 상위 클래스를 상속받는 것을 알고 있다. 그렇기 때문에 컴파일러에서 Object.toString() 메서드를 실행한다는 것을 이해할 수 있다.
위의 정의를 보면 "모든 하위 클래스가 이 메서드를 재정의하는 것이 좋습니다" 라고 적혀있는데 위에 실제 출력결과를 보면 이 객체가 무슨 정보를 담고 있는지 알기 힘들다. 그렇기 때문에 객체의 정보를 우리 입맛대로 보여주도록 하기 위하여 재정의를 한다고 이해하면 될 것 같다.
이제 재정의를 해야하는 이유를 알았으니 재정의를 해보자.
toString() 재정의 (Override)
우리는 좋은 IDE를 사용하고 있으니 IDE에서 제공하는 기능을 사용하여 재정의해보자.
Intellij에서 제공하는 Generate 기능을 보면 toString() 이란 메뉴가 있는 것을 볼 수 있다. 해당 기능을 이용하면 아래의 소스와 같이 toString()메서드를 생성한다.
@Override
public String toString() {
return "Student{" +
"studentId=" + studentId +
", studentName='" + studentName + '\'' +
'}';
}
기본적으로 Class명과 멤버 변수들의 값을 보여준다. 이렇게 toString()을 재정의 해준 뒤, 상단에 있는 소스를 다시 실행하면 아래와 같은 결과가 나오게 된다.
public class StudentTest {
public static void main(String[] args) {
Student me = new Student("park");
System.out.println(me);
}
}
//결과
//Student{studentId=10001, studentName='park'}
처음에 출력되던 정보보다 재정의를 한 정보가 훨씬 한눈에 보기 좋게 출력되는 것을 볼 수 있다.
참고로 오버라이드를 할 때 주의할 점이 있다.
toString() 메서드를 재정의할 때, 접근 제어 지시자를 public이 아닌 private나 default 등으로 재정의하면 에러가 발생한다.
그 이유는 부모 클래스에 정의된 메서드의 접근 제어 지시자의 범위보다 낮은 범위의 지시자를 사용할 수 없기 때문이다.
실제로 아래의 사진과 같이 최상위 클래스인 Object 클래스에 toString() 메서드가 public 으로 정의되었기 때문에 public 외에는 다른 접근 제어 지시자를 사용할 수 없다.
'☕️ Java' 카테고리의 다른 글
[Java] List 인터페이스 - ArrayList 클래스 (1) | 2023.05.30 |
---|---|
[Java] Collection Framework (2) | 2023.05.18 |
[Java] String, StringBuilder, StringBuffer의 차이 (0) | 2023.04.26 |
[Java] Comparable과 Comparator (0) | 2023.04.25 |
[Java] 인터페이스는 왜 다중 상속이 가능할까? (0) | 2023.04.18 |