본문 바로가기
Java/Java

[Java] Object 클래스

by 기록하는_사람 2022. 10. 17.

Object 클래스

📌 Object 클래스

: 모든 자바 클래스의 최상위 클래스.

String toString( ) 문자열 반환하는 메서드.
boolean equals( ) 두 인스턴스의 주소 값을 비교해 값을 반환하는 메서드. 
int hashCode( ) 인스턴스의 저장 주소를 반환하는 메서드. 
Object clone( ) 객체의 원본 복제하는데 사용하는 메서드. 
Class getClass( ) 객체의 Class 클래스 반환하는 메서드.
void finalize( ) 가비지 컬렉터에 의해 호출되는 메서드.
void wait( ) 멀티스레드 프로그램에서 사용하는 메서드.

 

Object 클래스 - 인스턴스 소멸

📌 protected void finalize( ) throws Throwable

: 어떤 참조 변수도 참조하지 않는 인스턴스가 가비지 컬렉션에 의해 소멸되기 전에 자동으로 호출되는 메소드.

 

📌 public static void gc( )

: 가비지 컬렉션의 수행을 요청.

  가지비 컬렉션의 수행을 요청했다고 해서 바로 진행되지는 않으며, 소멸 대상을 그 순간 모두 소멸하지 않음.

  시스템의 상황에 따라 일부 인스턴스의 완전한 소멸이 보류될 수 있음. 

 

📌 public static void runFinalization( )

: 소멸이 보류된 인스턴스의 finalize 메소드 호출을 요청.  

 

Object 클래스 - 인스턴스 비교

📌 public boolean equals(Object obj)

: 내용 비교가 이뤄지도록 오버라이딩하라고 존재하는 메소드. 

  인스턴스 내용을 비교할 때 오버라이딩해서 사용 가능. 

  (참조 변수의 참조 값을 비교할 때는 == 연산 사용.)

 

📄 EqualTest.java

package object;

class Student {
	int id;
	String name;
	
	Student(int id, String name) {
		this.id = id;
		this.name = name;
	}
	
	@Override 
	public boolean equals(Object obj) {
		if(obj instanceof Student) {  // obj가 Student인지 확인. 
			Student s = (Student)obj;
			
			// id 비교. 
			if(id == s.id) {  
				return true;
			}
			else {
				return false;
			}
		}
		else {
			return false;
		}
	}

	@Override
	public int hashCode() {
		return id;
	}
}

public class EqualsTest {
	public static void main(String[] args) {
		String str1 = new String("hello");
		String str2 = new String("hello");
		
		System.out.println(str1 == str2);  // false : 주소값이 같은지 비교.
		System.out.println(str1.equals(str2));  // true : 문자열이 같은지 비교. 
		/* equals()의 원형은 ==과 같음.
		   위의 equals()는 재정의 된 것으로 문자열을 비교해 값을 반환함. */
		
		System.out.println(str1.hashCode());  // 99162322
		System.out.println(str2.hashCode());  // 99162322
		/* 재정의 된 equals()의 값이 true이면, 동일한 hashCode() 반환 값을 가져야 함.
		   논리적으로 동일함을 위해, hashCodr() 메서드를 재정의해 동일한 값이 반환되도록 함. */
		
		System.out.println(System.identityHashCode(str1));  // 1554547125
		System.out.println(System.identityHashCode(str2));  // 617901222
		/* System.identityHashCode() : 고유한 hashCode를 반환하는 메소드. */
	
		Student s1 = new Student(1, "jin");
		Student s2 = new Student(1, "jin");
		
		System.out.println(s1 == s2);  // false
		System.out.println(s1.equals(s2));  // true
		/* equals()를 오버라이딩하여 값을 비교하도록 해야 함. */
		
		System.out.println(s1.hashCode());  // 1
		System.out.println(s2.hashCode());  // 1 
		/* hashCode()를 오버라이딩하여 equals()가 true일 경우 같은 hashCode를 반환하도록 해야 함. */
	}
}

 

Object 클래스 - 인스턴스 복사(복제)

📌 protected Object clone( ) throws CloneNotSupportedException

: 호출된 메소드가 속한 인스턴스의 복사본을 생성하고, 복사복의  참조 값을 반환.

 

📌 Cloneable 인터페이스를 구현한 클래스의 인스턴스만 clone( ) 호출 가능. 

 

📌 interface Cloneable

: 복사해도 괜찮다고 표시하는 마커 인터페이스(Marker Interface).

 

📌 메소드 오버라이딩을 통해 접근 범위 넓히기 가능.

: protected → public 가능. 

  (public  → protected 는 불가능.)

 

📄 CloneTest.java

package object;

class Point {
	int x;
	int y;
	
	Point(int x, int y) {
		this.x = x;
		this.y = y;
	}
	
	public String toString() {
		return "x = " + x + " y = " + y;
	}
	
}

class Circle implements Cloneable {
	Point point;
	private int radius;
	
	public Circle(int x, int y, int radius) {
		point = new Point(x, y);
		this.radius = radius;
	}
	
	public String toString() {
		return this.point + " r = " + radius;
	}
	
	@Override
	protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
}
public class CloneTest {

	public static void main(String[] args) throws CloneNotSupportedException {
		Circle circle = new Circle(10, 20, 5);
		Circle cloneCircle = (Circle)circle.clone();
		
		System.out.println(System.identityHashCode(circle));  // 1159190947
		System.out.println(System.identityHashCode(cloneCircle));  // 925858445
		
		System.out.println(circle);  // x = 10 y = 20 r = 5
		System.out.println(cloneCircle);  // x = 10 y = 20 r = 5
	}

}

 

 

'Java > Java' 카테고리의 다른 글

[Java] BigInteger 클래스와 BigDecimal 클래스  (0) 2022.10.17
[Java] 래퍼 클래스(Wrapper 클래스)  (0) 2022.10.17
[Java] 자바의 메모리 모델  (0) 2022.10.17
[Java] 인터페이스(interface)  (1) 2022.10.15
[Java] 템플릿 메서드  (0) 2022.10.15

댓글