처음부터 차근차근

[Java] Object 클래스 본문

Language/Java

[Java] Object 클래스

HangJu_95 2024. 7. 24. 23:06
728x90

java.lang 패키지란?

자바에서 기본으로 제공하는 패키지로써, 자바 언어를 이루는 가장 기본이 되는 클래스들을 보관하는 패키지입니다.

  • Object : 모든 자바 객체의 부모 클래스
  • String : 문자열
  • Integer, Long, Double : 래퍼 타입, 기본형 데이터 타입을 객체로 만든 것
  • Class : 클래스 메타 정보
  • System : 시스템과 관련된 기본 기능들을 제공

이 패키지는 모든 자바 애플리케이션에 자동으로 임포트 됩니다.

Object 클래스

자바에서 모든 클래스의 최상위 부모 클래스는 항상 Object 클래스입니다. 이것은 묵시적으로 상속 받기 때문에, 따로 extend를 사용하지 않아도 자동으로 상속을 받습니다.

클래스에 상속 받을 부모 클래스를 명시적으로 지정하면 Object를 상속받지 않지만, 부모 클래스 혹은 최상단 부모 클래스가 Object를 받기 때문에, 실제적으로는 Object를 모두 상속받는다고 보면 쉽습니다.

package lang.object;

public class ObjectMain {

    public static void main(String[] args) {
        Child child = new Child();
        child.parentMethod();
        child.childMethod();

        // toString() 메서드는 Object 클래스의 메서드이다.
        String string = child.toString();

        // 객체의 정보에 대해 문자열로 반환한다.
        System.out.println(string);
    }
}

위 코드와 그림을 보면, toString()메서드가 어디서 왔는지 알 수 있습니다. 기본적으로 child와 parent에는 toString 메서드가 없는데, 현재 사용하고 있습니다.
그렇지만 Object 클래스에는 toString() 메서드가 기본적으로 존재합니다. 따라서 호출이 가능해집니다.

모든 클래스의 최종 부모는 Object이다.

왜 Object가 최상위 부모 클래스인가??

  1. 공통 기능 제공
    어떤 특정 객체의 정보를 제공하거나, 이 객체가 다른 객체인지 비교하고, 어떤 클래스로 만들어졌는지 확인하는 기능은 모든 객체에 필요한 기능입니다.
    이때 Object에서는 필요한 해당 기능을 제공해줍니다. toString(), equals(), getClass() 등의 기능을 제공합니다.

만약 이 기능이 없다면, 우리는 class를 만들때마다 이 메서드를 생성해줘야 하는 번거로움을 가집니다. 또한 나 혼자 개발하는 것이 아닌 협업을 하다 보면 자연스럽게 이름이 달라질 수도 있습니다.

따라서 공통 기능을 제공함으로써 프로그래밍을 단순화 할 수 있게 되고, 일관성을 가질 수 있게 해줍니다.

  1. 다형성의 기본 구현
    부모는 자식을 담을 수 있고, Object는 모든 클래스의 부모 클래스입니다. 따라서 모든 객체를 참조할 수 있습니다.

모든 자바 객체는 Object 타입으로 처리될 수 있으며, 이는 다양한 타입의 개체를 통합적으로 처리할 수 있게 해줍니다.

Object의 다형성

예제를 통해 좀 더 자세하게 알아보겠습니다.

여기서 Dog와 Car는 서로 아무런 관련이 없는 클래스입니다. 둘 다 부모가 없으므로 Object를 자동으로 상속받습니다.

public class ObjectPolyExample1 {
    public static void main(String[] args) {
        Car car = new Car();
        Dog dog = new Dog();

        action(dog);
        action(car);
    }

    private static void action(Object obj) {
//        obj.sound(); // 컴파일 오류, Object 클래스에는 sound() 메서드가 없음
//        obj.move(); // 컴파일 오류, Object 클래스에는 move() 메서드가 없음

        // 객체에 맞는 다운캐스팅 필요
        if (obj instanceof Dog dog) {
            dog.sound();
        } else if (obj instanceof Car car) {
            car.move();
        }

    }
}

여기서 action이라는 메서드를 보겠습니다.
이 메서드는 Object 타입의 매개변수를 사용했습니다. 따라서 어떤 객체든 사용할 수 있습니다.

그러나 한계점도 존재합니다. Object에는 자식의 메서드가 없기 때문에 자식의 메서드를 호출할 수 없습니다.

즉 다시 정리하면

  • Object는 모든 객체를 대상으로 다형적 참조를 할 수 있다.
  • Object를 통해 전달 받은 객체를 호출하려면 각 개체에 맞는 다운캐스팅 과정이 필요하다.

그렇다면, Object를 언제 활용하면 좋을까요??
모든 타입의 객체를 담아야 할 경우, 굉장히 유용하게 사용할 수 있습니다. (마치 Javascript의 any 타입 처럼..)

public class ObjectPolyExample2 {

    public static void main(String[] args) {
        Car car = new Car();
        Dog dog = new Dog();
        Object object = new Object(); //Object 인스턴스도 만들 수 있다.

        Object[] objects = {dog, car, object};
        size(objects);
    }

    private static void size(Object[] objects) {
        System.out.println("전달된 객체의 수 : " + objects.length);
    }
}

위의 예시처럼 각각 다른 타입의 객체를 모두 담을 수 있는 배열을 만들었습니다.

Object의 유용한 메서드

toString()

객체의 정보를 문자열 형태로 제공합니다. 디버깅과 로깅에 유용하게 사용됩니다.
또한 모든 클래스에서 상속받아 사용할 수 있습니다.

기본적으로 Object의 toString()은 패키지를 포함한 객체의 이름과 객체의 참조값(해시코드)를 16진수로 제공하기 때문에, 따로 상속받아 사용하는것도 좋은 방법입니다.

printIn() 과 toString()
사실 printIn()에 object를 넣었을 때 값과, toString()으로 얻은 결과값은 완전히 같습니다.
printIn() 메서드는 사실 내부에서 toString()을 호출하기 때문에 같습니다.

equals()

동등성 비교를 위한 equals() 메서드도 제공합니다.

  • 동잀헝 : == 연산자를 사용해서 두 객체의 참조가 동일한 객체를 가리키고 있는지 확인 (주소값이 같은지 확인)
  • 동등성 : equals() 메서드를 사용하여 두 객체가 논리적으로 동등한지 확인

참조

 

김영한의 실전 자바 - 중급 1편 강의 | 김영한 - 인프런

김영한 | 실무에 필요한 자바의 다양한 중급 기능을 예제 코드로 깊이있게 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바 문법을

www.inflearn.com

 

'Language > Java' 카테고리의 다른 글

[Java] String 클래스  (0) 2024.07.31
[Java] 불변 객체  (0) 2024.07.26
[Java] Interface  (1) 2024.01.02
[Java] abstract 추상 클래스 & 추상 메서드  (1) 2024.01.02
[Java] 다형성  (0) 2024.01.01