JAVA

[JAVA] Object 다형성

songsua 2025. 1. 8. 01:26
package Object.poly;

public class ObjectPolyEx1 {
    public static void main(String[] args) {
        Dog dog = new Dog();
        Car car = new Car();
        
        action(dog);
        action(car);
        
    }
    private static void action(Object object) {
        //object.sound()
        //object.move()  //컴파일 오류가 발생한다.
    }
}

Object 는 최상위의 객체로 존재하나, Object에서 Move , sound 메서드를 사용할 . 수가 없다

객체에 맞는 다운캐스팅이 필요하다.

package Object.poly;

public class ObjectPolyEx1 {
    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 는 모든 객체의 부모라서 좋으나, dog 와 car 가 무엇인지 모른다.

그렇기 때문에 호출이 불가능하다.

모든 객체의 부모이끼 때문에 어떤 객체든지 인자로 전달할 수있다.

하지만 한계가 존재한다.

action() 메서드 안에서 obj.sound()는 오류가 발생한다.

왜냐하면 obj는 Object 타입이기 때문에 Object 안에는 sound 가 없다.

위인 부모에게 찾는 것은 가능하지만, 아래인 자식에게 찾는 것은 불가능하다.

밑에서 찾을 수 있는 유일한 것은 오버라이딩뿐이다.

 

어쩔수 없이 다운캐스팅을 해줘야한다

 

Object를 활용한 다형성의 한계

  • `Object` 는 모든 객체를 대상으로 다형적 참조를 할 수 있다.
  • 쉽게 이야기해서 `Object` 는 모든 객체의 부모이므로 모든 객체를 담을 수 있다.
  • `Object` 를 통해 전달 받은 객체를 호출하려면 각 객체에 맞는 다운캐스팅 과정이 필요하다.
  • `Object` 가 세상의 모든 메서드를 알고 있는 것이 아니다.

그렇다면 Object는 언제 활용하면 좋을까?

 

1. Object 배열

object는 모든 타입의 객체를 담을 수 있다. 따라서 object[]를 만들면 세상의 모든 객체를 담을 수 있는 배열을 만들 수 있다.

package Object.poly;

public class objex2 {
    public static void main(String[] args) {
        Dog dog = new Dog();
        Car car = new Car();
        Object object = new Object();  //Object도 인스턴스를 만들 수 있다.
       // Object[] objects = {dog, car, object} ;
        Object[] objects = new Object[3];
        objects[0] = dog;
        objects[1] = car;
        objects[2] = object;
        
        size(objects);
        
        
    }

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

전달된 객체의 수는: 3

 을 호출하게 된다.

 

size() 메서드
size(Object[] objects)` 메서드는 배열에 담긴 객체의 수를 세는 역할을 담당한다.

이 메서드는 `Object` 타입만 사용한다.

'Object' 타입의 배열은 세상의 모든 객체를 담을 수 있기 때문에, 새로운 클래스가 추가되거나 변경되어도

이 메서드를 수정하지 않아도 된다.

지금 만든 `size()` 메서드는 자바를 사용하는 곳이 라면 어디든지 사용될 수 있다.

 

equals() 동일성과 동등성

Object는 동등성 비교를 위한 equals()메서드를 제공한다.

동일성 : == 연산자를 사용해서 두 객체의 참조가 동일한 객체를 가리키고 있는지 확인한다

동등성 : equals() 메서드를 사용하여 두 객체가 논리적으로 동등한지 확인한다.

동등 : 같은 가치나 수준을 의미하지만 형태나 외관등이 완전히 같을 수는 없다.

동일 : 완전하게 같은 것

package Object.poly.equals;

public class EqualsMainV1 {
    public static void main(String[] args) {
        UserV1 user1 = new UserV1("id-100");
        UserV1 user2 = new UserV1("id-100");

        System.out.println("identity = " + (user1 == user2));
        System.out.println(user1.equals(user2));
    }
}
identity = false
equals = false

 

그런데 왜 equals에서 false가 나올까?

안에 보면 x == y 로 비교하는 것을 알 수 있다.

이는 Object가 기본으로 제공하는 equals는 ==을 제공한다.

따라서 오버라이딩을 사용해야한다.

package Object.poly.equals;

public class UserV1 {
    private String username;
    public UserV1(String username) {
        this.username = username;
    }

    @Override
    public boolean equals(Object obj) {
        UserV1 user = (UserV1)obj;
        return username.equals(user.username);
    }
}

boolean만 사용하는 이유는 equals가 True, False만을 사용하기 때문이다.

Object의 equals 메서드를 재정의함

identity = false
equals = true

 

 

 

 

 

'JAVA' 카테고리의 다른 글

[Java] 래퍼 클래스  (0) 2025.01.16
[Java] 불변객체  (0) 2025.01.09
[Java] 클래스와 인터페이스의 활용  (0) 2024.12.07
[Java] 인터페이스  (1) 2024.12.06
[Java] 추상클래스  (0) 2024.12.06