Object클래스란?
먼저 Object는 java.lang 패키지의 대표적인 클래스입니다.
자바에서 모든 클래스의 최상위 부모 클래스는 항상 Object클래스입니다. 아래 그림을 보며 설명을 이어나가겠습니다.
클래스에 상속 받을 부모 클래스가 없으면 묵시적으로 Object 클래스를 상속 받습니다.
- 쉽게 이야기해서 자바가 extends Object 코드를 넣어줍니다.
- 따라서 extends Object는 생략하는 것을 권장합니다.
클래스에 상속 받을 부모 클래스를 명시적으로 지정하면 Object를 상속 받짖 않습니다.
- 쉽게 이야기해서 이미 명시적으로 상속했기 때문에 자바가 extends Object 코드를 넣지 않습니다.
묵시적(Implicit) vs 명시적(Explicit)
묵시적 : 개발자가 코드에 직접 기술하지 않아도 시스템 또는 컴파일러에 의해 자동으로 수행되는 것을 의미
명시적 : 개발자가 코드에 직접 기술해서 작동하는 것의 의미
코드 예제
public class Parent {
public void parentMethod() {
System.out.println("Parent.parentMethod");
}
}
///////////////////////////////////
public class Child extends Parent {
public void childMethod() {
System.out.println("Child.childMethod");
}
}
///////////////////////////////////
public class ObjectMain {
public static void main(String[] args) {
Child child = new Child();
child.childMethod();
child.parentMethod();
// toString()은 Object 클래스의 메서드
String string = child.toString();
System.out.println(string);
}
}
예제에서 toString()은 Object클래스의 메서드입니다. 이 메서드는 객체의 정보를 제공합니다.
실행 결과
Child.childMethod
Parent.parentMethod
lang.object.Child@X001
실행 결과 그림
Parant는 Object를 묵시적으로 상속 받았기 때문에 메모리에도 함께 생성됩니다.
- child.toString()을 호출합니다.
- 먼저 본인의 타입인 Child에서 toString()을 찾습니다. 없으므로 부모 타입으로 올라가서 찾습니다.
- 부모 타입인 Parent에서 찾습니다. 없으므로 부모 타입으로 올라가서 찾습니다.
- 부모 타입인 Object에서 찾습니다. Object에 toString()이 있으므로 이 메서드를 호출합니다.
한마디로 정리하자면 자바에서 모든 객체의 최종 부모는 Object입니다.
Object클래스가 최상위 부모 클래스인 이유는 ?
모든 클래스가 Object클래스를 상속 받는 이유는 다음과 같습니다.
- 공통 기능 제공
- 다형성의 기본 구현
공통 기능 제공
객체의 정보를 제공하고, 이 객체가 닫른 객체와 같은지 비교하고, 객체가 어떤 클래스로 만들어졌는지 확인하는 기능은 모든 객체에게 필요한 기능입니다. 이런 기능을 객체를 만들 때 마다 항상 새로운 메서드를 정의해서 만들어야 한다면 상당히 번거로울 것입니다.
그리고 막상 만든다고 해도 개발자마다 서로 다른 이름의 메서드를 만들어서 일관성이 없을 것입니다.
Object는 모든 객체에 필요한 공통 기능을 제공해줍니다. Object는 최상위 부모 클래스이기 때문에 모든 객체는 공통 기능을 편리하게 제공(상속) 받을 수 있습니다. Object가 제공하는 기능은 다음과 같습니다 !
- 객체의 정보를 제공하는 toString()
- 객체의 같음을 비교하는 equals()
- 객체의 클래스 정보를 제공하는 getClass()
- 기타여러가지 기능
다형성의 기본 구현
부모는 자식을 담을 수 있습니다. Object는 모든 클래스의 부모 클래스입니다. 따라서 모든 객체를 참조할 수 있습니다 !
Object 클래스는 다형성을 지원하는 기본적인 메커니즘을 제공합니다. 모든 자바 객체는 Object 타입으로 처리될 수 있으며, 이는 다양한 타입의 객체를 통합적으로 처리할 수 있게 해줍니다.
Object 다형성이란 ?
Object는 모든 클래스의 부모 클래스이기 때문에 Object는 모든 객체를 참조할 수 있습니다.
Object는 어떤 객체든지 인자로 전달할 수 있다는 점이 있지만 물론 다형성의 한계도 존재합니다.
Object를 통해 전달 받은 객체를 호출하려면 각 객체에 맞는 다운캐스팅 과정이 필요합니다 ! Object가 모든 메서드를 알고 있는 것이 아니기 때문입니다.
간단하게 예제를 보고 넘어가겠습니다 !
class Car {
public void move() {
System.out.println("자동차 이동");
}
}
///////////////////////////////////
class Dog {
public void sound() {
System.out.println("멍멍");
}
}
///////////////////////////////////
public class ObjectPolyExample1 {
public static void main(String[] args) {
Dog dog = new Dog();
Car car = new Car();
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();
}
}
}
다형성을 제대로 활용하려면 다형적 참조, 메서드 오버라이딩을 함께 사용해야합니다. 만약 Object가 없다면 하나의 프로젝트를 넘어 전세계 모든 개발자가 비슷한 클래스를 만들 것이고, 서로 호환되지 않는 수 많은 직접 제작한 Object와 동일한 클래스들이 넘쳐날 것입니다.
정리
Object는 모든 클래스의 부모 클래스이고 만약 Object 클래스가 존재하지 않았다면 Object에 존재하는 toString, equals 등 다양한 기능들을 개발자들이 직접 만들어서 사용했을 것이다.
Object가 존재하기 때문에 모든 자바 개발자들이 공통 기능을 사용할 수 있습니다.
'프로그래밍 > Java' 카테고리의 다른 글
[Java, 자바] String 클래스에 대하여 (0) | 2024.07.02 |
---|---|
[Java, 자바] 불변 객체에 대하여 (0) | 2024.06.27 |
[Java, 자바] @JsonProperty, @JsonNaming이란? (0) | 2024.06.20 |
[Java, 자바] 추상클래스와 추상메소드 (0) | 2024.06.19 |
[Java, 자바] JVM의 동작원리와 기본개념 (0) | 2024.06.18 |
개발의 모든 것 !
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!