💡 Object 클래스는 필드가 없고 메소드로만 구성되어 있다.모든 클래스의 최고 조상 클래스. java.lang 패키지 하위에 존재하며, import 가 필요없다.
객체 자신의 복사본을 반환한다.
- 예제
public class CloneTest { public static void main(String[] args) { Member member1 = new Member("wayne", 31); Member member2 = member1.clone(); // 멤버변수 값은 같지만 해시코드는 다르다! } }
객체 자신과 객체 obj가 같은 객체인지 알려준다. (같으면 true)
- 예제 1
💡 v1 = v2; 를 통해 객체 v2는 객체 v1을 참조하고 있어 인스턴스의 주소 값이 저장되므로 같은 주소값이 저장된다Circle c1 = new Circle(10); Circle c2 = new Circle(10); if (c1 == c2) { System.out.println("두 원은 같습니다"); } else { System.out.println("두 원은 같지 않습니다"); } // 두 원은 같지 않습니다 --> why? 두 객체의 메모리주소값이 다르기 때문 c1 = c2; if (c1.equals(c2)) { System.out.println("두 원은 반지름이 같습니다"); } else { System.out.println("두 원은 반지름이 다릅니다"); } // 두 원은 반지름이 같습니다 --> why?
- 예제 2
💡 다른 객체일지라도 equals를 오버라이딩하여, true 값을 얻게 할 수 있다. String, Date, File, wrapper클래스의 equals메서드는 주소값이 아닌 내용을 비교하도록 오버라이딩 되어 있다. 그러나 의의로 StringBuffer클래스는 오버라이딩되어 있지 않다class Circle2 { private int radius; public Circle2(int radius) { this.radius = radius; } public int getRadius() { return radius; } @Override public boolean equals(Object obj) { if (obj instanceof Circle2) { Circle2 c1 = (Circle2) obj; if (radius == c1.getRadius()) { return true; } } return false; } } public class ObjectTest { public static void main(String[] args) { Circle2 c1 = new Circle2(10); Circle2 c2 = new Circle2(10); if (c1 == c2) { System.out.println("두 원은 같습니다"); } else { System.out.println("두 원은 같지 않습니다"); } // 두 원은 같지 않습니다 --> why? 두 객체의 메모리주소값이 다르기 때문 if (c1.equals(c2)) { System.out.println("두 원은 반지름이 같습니다"); } else { System.out.println("두 원은 반지름이 다릅니다"); } // 두 원은 같습니다 --> why? } }
객체가 소멸될 때 가비지 컬렉터에 의해 자동 호출된다. 이 때 수행되어야하는 코드가 있다면 오버라이딩한다. (거의 사용안함)
- 예제
@Override protected void finalize() throws Throwable { // do something super.finalize(); }
주의사항
finalize는 예측 불가능하며, 대체로 위험하고, 일반적으로 불필요하다.
1️⃣ finalize는 언제 수행되는지도 알 수 없으며 수행을 반드시 보장하지 않는다.
2️⃣ finalize에서 발생하는 예외는 무시된다.
3️⃣ finalize를 재정의할 경우 성능 저하가 발생한다.
객체 자신의 클래스 정보를 담고 있는 Class 인스턴스를 반환한다.
- 예제
Class Circle = new Circle.getClass(); //생성된 객체로 부터 얻는 방법 // 반환값 class week2.Circle2 Class Circle = Circle.class; // 클래스 리터럴(*.class)로부터 얻는 방법 // 반환값 class week2.Circle2
객체 자신의 해시코드를 반환한다.
- 예제
💡 `234525` ,`234525` 같은 값이 출력된다. String클래스는 문자열의 내용이 같으면 동일한 해시코드를 반환하도록 오버라이딩 되어 있다. 객체의 주소를 int로 변환해서 출력한다. 인스턴스 변수 값으로 같고 다름을 비교하고 싶으면 hashCode도 적절히 오버라이딩 해줘야 한다.String str1 = new String("abc"); String str2 = new String("abc"); System.out.println(str1.hachCode()); System.out.println(str2.hachCode());
객체 자신의 정보를 문자열로 반환한다.
예제
class Student{ private String name; private String sex; public Student(String name, String sex) { this.name = name; this.sex = sex; } @Override public String toString() { return "이름은 " + this.name + "이고 성별은 " + this.sex + "입니다."; } } public class StudentToStringTest { public static void main(String[] args) { Student s = new Student("홍길동", "남자"); System.out.println(s); } }
💡 오버라이딩 안하면 Object클래스에 있는 toString을 호출하여 아래와 같이 출력하게 된다.
Object obj = new Object(); // getClass().getName() + "@"+ +INteger.toHexString(hashcode()); System.out.println(obj.toString()); // java_0929.Student@7d6f77cc
객체 자신을 사용하려고 기다리는 쓰레드를 하나만 깨운다
객체 자신을 사용하려고 기다리는 모든 쓰레드를 깨운다.
❗ notify(), notifyAll(), wait() 은 동기화 블록 내에서만 사용할 수 있다.다른 쓰레드가 notify()나 notifyAll()을 호출할 때까지 현재 쓰레드를 무한히 또는 지정된 시간(timeout, nanos) 동안 기다리게 한다.