본문 바로가기

Spring boot

Java - Object 클래스

728x90

묵시적 상속 vs 명시적 상속

묵시적 : 개발자가 코드에 직접 기술하지 않아도 시스템 또는 컴파일러에 의해 자동으로 수행되는 것을 의미

명시적 : 개발자가 코드에 직접 기술해서 작동하는 것을 의미

 

ex)

 package lang.object;
 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);
    }
 }

 

결과

Child.childMethod

Parent.parentMethod

lang.object.Child@X001

 

child.toString()을 호출하게 되면 부모타입 Parent가 상속받고 있는 Object 클래스를 호출하게 된다.

 

 

Object의 다형성

아래와 같이 Dog, Car 클래스가 있다. 둘은 서로 아무 관련이 없지만 자동으로 Object class 를 상속받는다.

 

다만 Object는 최상위 클래스이기 때문에, 하위 메서드를 실행할 수 없다.

예를 들어 아래와 같이 Dog 클래스가 가지고 있는 sound() 메서드는 실행할 수 없다.

실행하기 위해서 Dog 클래스로 다운캐스팅을 해야한다.

if (obj instanceof Dog dog) {
    dog.sound();
 }

 

정리하면, Object는 다형적 참조 + 메서드 오버라이딩 을 동시에 할 수 없다.

메서드 오버라이딩을 하기 위해 위와 같이 다운캐스팅이 필요하기 때문이다.

다형성을 활용하기에는 한계가 있다.

 

toString()

object가 제공하는 toString() 메서드는 기본적으로 패키지를 포함한 객체의 이름 + 객체의 참조값(해시코드)를 제공한다.

package lang.object.tostring;
 public class ToStringMain1 {
     public static void main(String[] args) {
            Object object = new Object();
            String string = object.toString();
            //toString() 반환값 출력
            System.out.println(string);
            //object 직접 출력
            System.out.println(object);
        }
 }

 

결과

java.lang.Object@a09ee92

java.lang.Object@a09ee92

 

위와 같이 println과 object를 직접 println 하면 결과가 같은데, 사실 println은 메서드 내부에서 toString()을 호출하고 있다.

 

보통 toString은 오버라이딩 해서 많이 사용한다.

 

 

Object와 OCP 원칙

Open : 새로운 클래스를 추가하고, ` toString()` 을 오버라이딩해서 기능을 확장할 수 있다.

Closed : 새로운 클래스를 추가해도 ` Object` 와 ` toString()` 을 사용하는 코드는 변경하지 않아도 된다.

 

 

equals 메서드

자바에서 같다 라는 의미는 아래와 같이 두 가지가 있다.

동일성(identity) : 두 객체의 참조가 같은 객체를 가리키고 있다. ( == )

동등성(equality) : 두 객체가 논리적으로 같은지 확인한다. ( equals() )

 

ex) 아래와 같이 두 객체가 있다.

 User a = new User("id-100") //참조 x001
 User b = new User("id-100") //참조 x002

 

두 객체는 물리적으로 다른 메모리에 존재하는 객체지만, 같은 회원번호 값을 가리키고 있기 때문에 논리적으로 동등하다. 

728x90

'Spring boot' 카테고리의 다른 글

[Spring boot] - 서킷브레이커 도입하기  (0) 2026.02.01
Java - 불변 객체  (1) 2024.12.25