Java 중급 - 영한쌤
Java 모든 클래스가 Object를 상혹하는 이유.
-> 공통적인 부분 해결
-> 다형성 기본 구현
<아래 설명 참조.>
Object제공 기능
- toString() -> 객체 정보
- equals() -> 객체의 같음을 비교한다.
- getClass() -> 객체의 클래스 정보를 제공하는
etc ..
사람마다 Object에 대한 기본 기능을 따로따로 구현하게 된다면 정말 많은 기능이 나올 것 이므로, 조금 단순화하고 공통화 시킨 것으로 말한다. -> 핵심이유.
다형성의 기본 구현
- Object는 모든 클래스의 부모 클래스이다. 즉 모든 객체를 참조할 수 있는 것이다.
모든 java 객체는 Object 타입으로 처리되기 떄문에. 다양한 타입의 객체를 통합적으로 처리할 수 있게한다.
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){
if(obj instanceof Dog dog){
dog.sound();
}else if(obj instanceof Car car){
car.move();
}
}
}
아무것도 모르는 상태에서 Object를 통해서 객체를 담을 수 있다. 모든 객체의 부모이기 때문이다.
*하지만 Object를 통해 전달받은 객체를 호출하려면 객체에 맞는 다운케스팅이 필요하다.*
다형적 참조 + 메서드 오버라이딩을 함께 사용해야한다.
Object toString() 에 대하여
getClass().getName() + "@"+Integer.toHexString(hashCode()); -> 실제 객체의 참조값. 16진수로 나온다.
어떤 클래스로 부터 파생되었는지 + 참조 값.
println과 같은 값을 가지는 이유는 -> println내부에서는 toString을 부르기 때문이다.
String은 그대로 String으로 -> Object는 object.toString()을 한 상태로 출력.
-> toString()을 재정의 해서 참조값을 알아내지 못할때 알아낼 수 있는 방법이 있다.
String hexString = Integer.toHexString(System.identityHashCode())-> 를 통해서 객체의 참조값을 얻어낼수있다.
동일성 == 연산자를 사용하여 두 객체의 참조가 동일한 객체를 가르키고있는지 확인.
동등성 : equals() 메서드를 사용하여 두 객체가 논리적으로 동등한지 확인.
*동일은 완전히 같음을 의미 동등은 같은 가치나 수준을 의미하지만, 외관이나 형태가 다를 수 있다.*
기본적으로 Object의 equals()메서드는 동일성을 요구한다.
그렇기 때문에 객체의 값을 비교하기 위해서는 equals메서드를 재정의해야한다.
ex)
@Override
public boolean equals(Object obj){
UserV2 user = (UserV2) obj;
return id.equals(user.id);
}