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 |