Java 모든 Class는 Object Class를 상속 받는다(feat. 오버라이딩)
Java를 공부해 본 사람이라면 다들 이런 말은 들어보셨을 것이다.
Object는 모든 Class들의 최상위 클래스다.
OOP를 공부하면서 Object 클래스를 제대로 살펴보지 않을 수는 없지!!!
우선 위의 말이 진짜인지 내 두 눈으로 직접 봐야겠다. API docs를 살펴보자!!!
1. 진짜 그런가요?
아~~~무 클래스나 눌러봤다.
Hierarchy부분을 보면 java.lang.Object를 공유하고 있는 것을 알 수 있다.
다른 클래스도 아~~~무거나 눌러봤다.
얘 또한 마찬가지!!!
뭘 들어가봐도 전부 java.lang.Object가 최상위에 있는 것을 확인할 수 있다.
그럼 이제 Object 클래스도 한 번 살펴보자.
java.lang.Object는?
Hierarchy부분에 유일하게 상위 클래스가 없는 것을 확인할 수 있다.
위의 설명에도 친절하게 쓰여있다.
Class Object is the root of the class hierarchy.
Every class has Object as a superclass라고
2. Class들은 Object를 상속해서 어떻게 쓰고 있는가?
이처럼 Object는 Class들이 상속할 여러 메서드들을 가지고 있다.(필드는 없다.)
클래스들은 Object의 여러 메서드를 오버라이딩해서 사용한다.
Object도 toString()이라는 메서드를 갖고있다.
It is recommended that all subclasses override this method라고 되어있다.
보통 우리가 생각하는 toString()의 역할은 값을 String타입으로 바꿔 반환해주는 것이다.
그러나 Object가 제공하는 toString()을 직접 사용해보면, ~~@~~~~요런 값을 반환한다.
Object가 정의한 toString()은 클래스 이름과 해시 코드를 조합한 문자열을 반환하기 때문이다.
즉, 우리가 일반적으로 원하는 기능은 아니므로 각자 입맛에 맞게 오버라이딩하여 사용한다.
(다만, abstract키워드가 없는 것으로 보아, 오버라이딩을 강제하지는 않는다!)
따라서 String, Boolean등 대부분에 존재하는 toString()은 모두 이 Object의 toString()을 오버라이딩 한 것이었다!!!
3. String Class가 Overriding한 toString()
Stinrg클래스의 toString() 역시나 Overriding된 메서드이다.
위는 String클래스의 toString()이다.
Overrides부분을 보면
Object 클래스의 toString()을 오버라이딩 했다고 친절하게 표시되어있다.
자기자신을 리턴한다.
+ Double Class에서 오버라이딩한 toString()도 한번 봐보자.
Double이 오버라이딩한 toString()은
또 Double에서 오버로딩한 toString(value)를 호출하는 것 같다.
Double은 인스턴스 생성과 동시에 값을 value로 설정한다. (+ final이라 immutable이다.)
toString(value)에서 value는 double이므로 아래의 함수를 호출한다.
넘겨받은 value를 또 이런저런 과정을 통해 리턴하는 모습을 볼 수 있다.
이렇게 오버로딩 되어있기 때문에 System.out.println(Double.toString(3.0)) 이런식으로 쓸 수도 있고,
(static이니까 Class명으로 접근)
생성한 인스턴스에 대해 toString()을 쓴다면
걔는 위의 Double(double value)생성자를 통해서 this.value = value로 생성 시 초기화 됐었을 것이다.
이후 instance.toString()이렇게 인스턴스에 대해 호출하면 value로 static String toString(double d)를 호출해서 String을 반환받는 모습인 것 같다.
아무튼 이렇게 모든 Class의 최상위 클래스는 Object임을 확인했으며,
이들은 Object의 메서드들을 오버라이딩해서 쓰고있었다