JAVA/JAVA

Object Class

호두밥 2021. 9. 28. 00:40

Object Class

자바의 가장 최상위 클래스

필드 없이 메소드로만 구성되어 있고, 모든 클래스에서 Object 클래스의 메소드를 사용할 수 있음.

* 모든 클래스는 Object 클래스를 상속받기 때문 

equals()

두 객체가 동일하면 True, 아니면 False를 반환하는 메소드

Object A = new Object();
Object B = new Object();
Object C = A;

System.out.println(A.equals(B));
System.out.println(A.equals(C));
false
true

 

두 객체가 같은 값인지를 비교하기 위해 클래스에서 재정의 Override해서 사용할 수 있다.

대표적으로 String클래스의 equals가 있다.

 

[Telephone 클래스에 equals 재정의]

public class Telephone {
	
	String phoneNumber;
	String openDate;
	
	Telephone(String phoneNumber, String openDate){
		this.phoneNumber = phoneNumber;
		this.openDate = openDate;
	}
	
	@Override
	public boolean equals(java.lang.Object obj) {
		
		if(obj instanceof Telephone) {
			Telephone tel = Telephone.class.cast(obj);
			return this.phoneNumber.equals(tel.phoneNumber);
		}else{
			return false;			
		}		
	}

}

[equals 테스트]

Telephone telA = new Telephone("000-1111-2222", "20210927");
Telephone telB = new Telephone("000-1111-2222", "20210927");

System.out.println(telA.equals(telB));
true

 

hashCode()

객체의 해쉬코드를 반환하는 메소드

equals에서 해쉬코드를 이용해 객체가 동일한지 판단함. 

* 객체 해쉬코드 : 객체의 메모리 번지(주소값)을 이용한 객체를 식별할 수 있는 정수값

Object A = new Object();
Object B = new Object();
Object C = A;

System.out.println("A.hashCode = "+A.hashCode());
System.out.println("B.hashCode = "+B.hashCode());
System.out.println("C.hashCode = "+C.hashCode());
A.hashCode = 1435804085
B.hashCode = 1784662007
C.hashCode = 1435804085

 

toString()

객체의 문자정보를 반환하는 메소드

기본적으로는 "클래스명@16진수해쉬코드"를 반환함.

Object A = new Object();
System.out.println(A.toString());
Object@5594a1b5

클래스에서 재정의 Override해서 사용할 수 있다.

public class Telephone {
	
	String phoneNumber;
	String openDate;
	
	Telephone(String phoneNumber, String openDate){
		this.phoneNumber = phoneNumber;
		this.openDate = openDate;
	}
	
	@Override
	public String toString() {
		
		return "[phoneNumber="+phoneNumber+", openDate="+openDate+"]";
	}
}
Telephone tel = new Telephone("000-1111-2222", "20210927");
System.out.println(tel.toString());
[phoneNumber=000-1111-2222, openDate=20210927]

 

clone()

원본 객체의 필드값을 새로운 객체로 복제하는 것.

복제기능은 Cloneable을 implements해서 구현해야 함.

 

[얇은 복제]

기본타입이면 실제 값이 , 참조타입이면 객체의 번지(주소값)이 복사됨.

*얇은 복제는 clone()의 defalut 상태임

public class Telephone implements Cloneable{
	
	int[] phoneNumber;
	
	Telephone(int[] phoneNumber){
		this.phoneNumber = phoneNumber;
	}
	
	@Override
	public Object clone(){
		try {			
			Telephone out = (Telephone) super.clone();
			return out;			
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return null;
	}    
}
//객체 생성 후 복제
Telephone telA = new Telephone(new int[] {0,0,0,0,0,0,0,0,0,0,0}) ;
Telephone telB =  (Telephone) telA.clone();

//phoneNumber 값의 주소값이 동일한 것을 확인
System.out.println("telA.phoneNumber="+ telA.phoneNumber);
System.out.println("telB.phoneNumber="+ telB.phoneNumber);

//telB값 변경 후 telA의 값도 변경된 것을 확인
telB.phoneNumber[0] = 1;
System.out.println("telA.phoneNumber="+ Arrays.toString(telA.phoneNumber));
System.out.println("telB.phoneNumber="+ Arrays.toString(telB.phoneNumber));
telA.phoneNumber=[I@6a5fc7f7
telB.phoneNumber=[I@6a5fc7f7
telA.phoneNumber=[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
telB.phoneNumber=[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

 

[깊은 복제]

기본타입이면 실제 값이 , 참조타입이면 객체와 실제값이 모두 복사됨.

* 깊은 복제는 clone() 메소드를 재정의해서 구현해야 함.

 

public class Telephone implements Cloneable{
	
	int[] phoneNumber;
	
	Telephone(int[] phoneNumber){
		this.phoneNumber = phoneNumber;
	}
	
	@Override
	public Object clone(){
		try {			
			Telephone out = (Telephone) super.clone();
			out.phoneNumber = Arrays.copyOf(this.phoneNumber, this.phoneNumber.length);
			return out;			
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return null;
	}    
}
//객체 생성 후 복제
Telephone telA = new Telephone(new int[] {0,0,0,0,0,0,0,0,0,0,0}) ;
Telephone telB =  (Telephone) telA.clone();

//phoneNumber 값의 주소값이 다른 것을 확인
System.out.println("telA.phoneNumber="+ telA.phoneNumber);
System.out.println("telB.phoneNumber="+ telB.phoneNumber);

//telB값 변경 후 telA의 값은 변경되지 않은 것을 확인
telB.phoneNumber[0] = 1;
System.out.println("telA.phoneNumber="+ Arrays.toString(telA.phoneNumber));
System.out.println("telB.phoneNumber="+ Arrays.toString(telB.phoneNumber));
telA.phoneNumber=[I@6a5fc7f7
telB.phoneNumber=[I@3b6eb2ec
telA.phoneNumber=[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
telB.phoneNumber=[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

 

finalize()

Garbage Collector에서 객체를 소멸시키는데 사용하는 메소드

객체가 소멸되기 전에 어떤 작업을 수행하고자 할 때 재정의Override해서 사용함.

메모리의 상황에 따라 JVM이 자동으로 수행시킨다.

public class Telephone implements Cloneable{
	
	String phoneNumber;
	
	Telephone(String phoneNumber){
		this.phoneNumber = phoneNumber;
	}
	
	@Override
	protected void finalize() throws Throwable {
		System.out.println(this.phoneNumber);
	}
}
String phoneNumber = "";
for(int i = 0; i<10; i++) {
	Telephone tel = new Telephone( phoneNumber.concat(i+""));
	System.gc(); //가비지 콜렉터 수행
}
0 8 7 6 5 4 3 2 1

 

출처

신용권, 이것이 자바다, 한빛미디어

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

JVM 자바 가상머신  (0) 2021.10.02
Objects 클래스  (0) 2021.09.28
java.lang 패키지  (0) 2021.09.27
어노테이션 Annotation (@)  (0) 2021.09.26
데이터 타입 Data Type  (0) 2021.09.24