[Java] Object

오형상·2024년 1월 4일
0

java

목록 보기
1/7
post-thumbnail

Object 클래스란?

모든 클래스의 최고 조상 클래스. java.lang 패키지 하위에 존재하며, import 가 필요없다.

💡 Object 클래스는 필드가 없고 메소드로만 구성되어 있다.

Object 클래스 존재 의의

  • 자바 프로그래밍의 기본적인 메소드를 모든 인스턴스에서 사용할 수 있도록 한다.
  • Object 클래스를 최고 조상으로 둠으로 어떤 클래스라도 서로 관계를 맺어줄 수 있다.

Object 클래스 메소드

protected Object clone()

객체 자신의 복사본을 반환한다.

  • 예제
    public class CloneTest {
        public static void main(String[] args) {
            Member member1 = new Member("wayne", 31);
            Member member2 = member1.clone(); // 멤버변수 값은 같지만 해시코드는 다르다!
        }
    }

public boolean equals(Object obj)

객체 자신과 객체 obj가 같은 객체인지 알려준다. (같으면 true)

  • 예제 1
  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?
💡 v1 = v2; 를 통해 객체 v2는 객체 v1을 참조하고 있어 인스턴스의 주소 값이 저장되므로 같은 주소값이 저장된다
  • 예제 2

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?
    }

}
💡 다른 객체일지라도 equals를 오버라이딩하여, true 값을 얻게 할 수 있다. String, Date, File, wrapper클래스의 equals메서드는 주소값이 아닌 내용을 비교하도록 오버라이딩 되어 있다. 그러나 의의로 StringBuffer클래스는 오버라이딩되어 있지 않다

protected void finalize()

객체가 소멸될 때 가비지 컬렉터에 의해 자동 호출된다. 이 때 수행되어야하는 코드가 있다면 오버라이딩한다. (거의 사용안함)

  • 예제
   	@Override
   	protected void finalize() throws Throwable {
   		// do something
   		super.finalize();
   	}
  • 주의사항

    finalize는 예측 불가능하며, 대체로 위험하고, 일반적으로 불필요하다.

    1️⃣ finalize는 언제 수행되는지도 알 수 없으며 수행을 반드시 보장하지 않는다.

    2️⃣ finalize에서 발생하는 예외는 무시된다.

    3️⃣ finalize를 재정의할 경우 성능 저하가 발생한다.

public Class getClass()

객체 자신의 클래스 정보를 담고 있는 Class 인스턴스를 반환한다.

  • 예제
    Class Circle = new Circle.getClass(); //생성된 객체로 부터 얻는 방법
    // 반환값 class week2.Circle2
    Class Circle = Circle.class; // 클래스 리터럴(*.class)로부터 얻는 방법
    // 반환값 class week2.Circle2

public int hashCode()

객체 자신의 해시코드를 반환한다.

  • 예제
    		String str1 = new String("abc"); 
    		String str2 = new String("abc");
    		
    		System.out.println(str1.hachCode());
    		System.out.println(str2.hachCode());   
    💡 `234525` ,`234525` 같은 값이 출력된다. String클래스는 문자열의 내용이 같으면 동일한 해시코드를 반환하도록 오버라이딩 되어 있다. 객체의 주소를 int로 변환해서 출력한다. 인스턴스 변수 값으로 같고 다름을 비교하고 싶으면 hashCode도 적절히 오버라이딩 해줘야 한다.

public String toString()

객체 자신의 정보를 문자열로 반환한다.

  • 예제

    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

public void notify()

객체 자신을 사용하려고 기다리는 쓰레드를 하나만 깨운다

public void notifyAll()

객체 자신을 사용하려고 기다리는 모든 쓰레드를 깨운다.

public void wait()

public void wait(long timeout)

public void wait(long timeout, int nanos)

다른 쓰레드가 notify()나 notifyAll()을 호출할 때까지 현재 쓰레드를 무한히 또는 지정된 시간(timeout, nanos) 동안 기다리게 한다.

❗ notify(), notifyAll(), wait() 은 동기화 블록 내에서만 사용할 수 있다.

0개의 댓글