DEV-STUDY/Java

자바 클래스 선언에 숨겨진 3가지 (어쩌면 자명하지만, 저는 신기했어요)

HwangJerry 2024. 1. 18. 10:02

아래 예시 코드와 함께 간단히 다뤄보자. 아래 코드에 3가지가 생략되어 있는데, 혹시 전부 캐치가 되는가? (더 있는진 모르겠는데, 일단 저는 3가지만 알고 있어요. 혹시 더 있다면 언제든 댓글 부탁드립니다.)

package hwanghub.example;

public class Person {
    public Person() {
    }
}

가장 먼저 숨겨져 있는 건 import java.lang.*;이다. 자바에서 기본 자료형이나 Wrapper class, 그리고 큰 값 비교를 해주는 Math 클래스와 같은 기본 클래스들이 들어있다. 자바 프로그래밍의 모든 경우에 반드시 필요한 필수 클래스를 포함하여, 정말 자주 사용되는 클래스들이 java.lang패키지에 들어 있기 때문에 이를 default import라고 하여 생략되어 표현되고 있다.

package hwanghub.example;

import java.lang.*;

public class Person {
    public Person() {
    }
}

자, 이제 두개 남았다. 다음은 아마 많이들 아실 내용이다. 바로 extends Object이다. 모든 자바 객체는 Object라는 객체를 상속하고 있다. Object도 java.lang.Object에 존재하고 있다. 따라서 모든 자바 클래스는 반드시 import java.lang.*;을 해야 하는 거다. 따라서 Object가 갖고 있는 메서드인 toString(), hashCode(), clone(), equals()를 어떤 객체든 override할 수 있다. (궁금한 분들은 인텔리제이에서 override method기능을 사용해보시면 두 눈으로 확인이 가능하다.)

package hwanghub.example;

import java.lang.*;

public class Person extends Object{
    public Person() {
    }
}

이제 하나 남았다. 이걸 정리하게 된 이유이다. 기본생성자 또한 당연히 생성자 선언을 안한 클래스에서는 생략되어 있지만 기본으로 탑재된다. 하지만 이를 코드에 써둔 것에는 이유가 있다. 바로, super()이다.

모든 객체는 Object 클래스를 상속하고 있으며, 모든 자식 객체들은 본인 생성자의 최상단 라인에서 반드시 묵시적으로 부모 객체를 생성하면서 시작한다. 이를 코드로 표현하면 다음과 같다.

public class Person extends Object {
    public Person() {
        super();
        // ...
    }
}

따라서 만약 Person을 상속하고 있는 Developer라는 클래스가 있다고 가정해보자. 그렇다면 Developer 클래스의 객체를 생성하면? Object 객체가 먼저 생성되고, Person 객체가 생성된 뒤, Developer 객체가 생성되었다. 따라서 모든 객체 생성시 반드시 Object까지 연쇄적으로 전부 생성되게 된다. 나는 처음 봤을때 "오?! 신기하다..!" 해서 까먹지 않으려고 남겨둔다... 근데 뭔가 주변 반응을 보면, 나만 모르고 있었던 것 같기도 하다...ㅎㅎㅎㅎㅎ