본문 바로가기
Backend/Java-Spring

[Java] 클래스.toString()을 public으로 선언해야 하는 이유

by 벨롭 (valop) 2024. 1. 18.

 

문제 발생

 

Cannot reduce the visibility of the inherited method from Object

 

 

 

 

 

 

문제 원인

 

메소드를 오버라이딩 할 때, 접근제한자의 범위를 줄일 수는 없다. 

 

 

 

 

Person 클래스에서 public으로 study() 메소드를 선언한 다음, Person을 상속받은 Student 클래스에서 default 접근제어자로 메소드 오버라이딩을 하려고 하자 예외가 발생한다.

 

 

 

 

 

 

 

그런데 Person클래스에서는 다른 클래스를 extend 하지 않았는데도 toString() 메소드를 default로 선언하면 예외가 발생하게 된다.

 

https://docs.oracle.com/javase/8/docs/api/

 

Java Platform SE 8

 

docs.oracle.com

 

이 내용은 Java Document에서 Object 클래스의 내용을 참조하면 알 수 있다.

 

 

 

 

 

 

 

Object 클래스는 모든 클래스의 super클래스이다. 즉, 우리가 Person extends Object 라고 명시하지 않았어도 Object 클래스의 하위 클래스인 것이다.

 

 

 

 

 

 

 

 

 

그리고 Object 클래스는 toString()이라는 메서드를 가지고 있다. 따라서, Person 클래스에서 toString()을 선언하는 것은 Object 클래스의 toString() 메서드를 오버라이딩하는 것이 된다. 

 

그런데 Object 클래스에서 toString()의 접근제한자는 public이므로 이보다 좁은 범위의 접근 제한자를 사용하려 하면 예외가 발생하게 된다.