오브젝트 클래스는 여러가지의 기능들이 있지만
대표적으로 사용되는 것은 .toString() , .hashCode(), .equals() 가 있다
Object 클래스
class TestA /*extends Object*/{ //사용자 정의 클래스 } public class objectClassTest { public static void main(String[] args) { Object obj1 = new Object(); // 오브젝트 클래스 Object obj2 = new Object(); Object obj3 = obj1; System.out.println(obj1.toString()); System.out.println(obj1.hashCode()); System.out.println(obj2.toString()); System.out.println(obj2.hashCode()); System.out.println(obj1.equals(obj2)); System.out.println(obj1.equals(obj3)); TestA oba1 = new TestA(); // 사용자 정의 클래스 TestA oba2 = new TestA(); TestA oba3 = oba1; System.out.println(oba1.toString()); System.out.println(oba1.hashCode()); System.out.println(oba2.toString()); System.out.println(oba2.hashCode()); System.out.println(oba1.equals(oba2)); System.out.println(oba1.equals(oba3)); } }
실행결과
java.lang.Object@2f92e0f4 798154996 java.lang.Object@28a418fc 681842940 false true ObjectClass.TestA@1f32e575 523429237 ObjectClass.TestA@279f2327 664740647 false true
- 사용자 클래스 TestA는 아무것도 작성하지 않았는데 작동이 됨 -- Object 클래스를 상속받는다는 것을 알 수 있음
- 따라서 모든 객체를 오브젝트로 관리 할 수 잇다 라는 것을 알 수 있다
import java.util.Objects;
class TestB /*extends Object*/{
int a;
void methodB() {
System.out.println("TestB 기능 !" + a);
}
/*
@Override
public int hashCode() {
return Objects.hash(a);
}
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
TestB other = (TestB) obj;
return a == other.a;
}
@Override
public String toString() {
return "TestB[ a =" + a +"]";
}
}
public class objectClassTest2 {
public static void main(String[] args) {
TestB oba1 = new TestB();
oba1.a = 10;
TestB oba2 = new TestB();
oba2.a = 10;
Object obj1 = oba1; // 업케스팅
Object obj2 = oba2; // 업케스팅
System.out.println(obj1); // toString
System.out.println(obj2);
System.out.println(obj1 == obj2); // false 가 나옴 , toString을 통해 비교하는게 아니라
// 각각의 id를 통해 비교하는거임
// 객체가 동일하냐?
System.out.println(obj1.equals(obj2)); // 객체가 동등하냐?
// equals = ==
System.out.println(obj1.hashCode());
System.out.println(obj2.hashCode());
}
}
출력결과
TestB[ a =10] TestB[ a =10] false true 681842940 1392838282
- 객체 자체를 출력하면 기존 내장된 toString() 이 실행되는것을 볼 수 있다
- 이를 통해 객체간 어드 객체에 속해있는지 확인을 할 수 있는 용도로 사용된다.!
- 다른 객체의 비교를 할 때 == 은 두개의 객체가 동일하냐? 각각의 ID를 통해 비교하는 것이며
- 객체1.equals(객체2) 는 객체가 동등하냐 라는 것을 통해 비교하는 것이다
- 기본적으로 .equals는 "==" 와 같은 의미로 false값이 나오지만 Object클래스의 equals를 오버라이딩하면 계속적으로 비교하면서 최종적으로 내용물을 비교하기에 true 값이 나온다
- hashCode() 도 비슷한 원리다
- Object 클래스에 내장된 함수를 오버라이딩하지않고 그냥 사용하면 서로 다른 해쉬코드가 나오지만 오버라이딩을 하게 되면 같은 값이 나오는것을 확인할 수 있었다.