Object 클래스는 모든 자바 클래스의 최상위 클래스이다. Object 클래스에는 몇 가지 메서드들이 정의되어 있고, 모든 클래스들은 이 메서드들을 구현하여 사용할 수 있다. Object 클래스의 대표적인 메서드들을 알아보록하자.
equals
입력받은 객체가 해당 객체와 동일한지 판단하는 메서드이다.
== 연산자는 참조변수의 참조 값을 비교한다. 따라서 두 인스턴스의 데이터 값을 비교하려면 별도의 방법을 사용해야 하고 클래스들은 equals 메서드를 오버라이딩 하여 객체들의 데이터 값을 비교한다. 참고로 Object 클래스의 equals 메서드는 == 연산자와 마찬가지로 참조변수의 참조값을 비교한다.
hashCode
객체에 대한 해시코드 값을 반환하는 메서드이다.
Runtime 객체의 유일한 integer 값을 반환하고, Object 클래스의 equals 메서드는 heap에 저장된 객체의 메모리 주소를 반환한다. (항상 그렇지는 않음) 또한 해시값을 사용하는 자료구조(HashSet, HashMap, HashTable 등)를 사용할 때 데이터가 저장되는 위치를 결정하기 위해 사용된다.
equals를 오버라이드 한다면 hashCode 또한 오버라이드 되어야 한다.
동일한 객체는 동일한 참조값을 가진다는 것을 의미하므로, 동일한 객체는 동일한 해시코드를 가져야 한다. equals 만 오버라이드 한 채로 해시값을 사용하는 자료구조를 사용한다면 같은 객체라 생각한 객체들이 다른 해시값을 반환하여 원하지 않는 결과를 초래할 것이다.
toString
인스턴스의 문자열 표현을 반환하는 메서드이다.
System.out.println에 객체를 넣으면 toString 메서드가 자동으로 호출된다. Object 클래스의 toString 메서드는 'getClass().getName() + '@' + Integer.toHexString(hashCode())'를 return 한다. (ex. java.lang.Object@668bc3d5)
clone
인스턴스의 복사를 위한 메서드이다.
메서드가 호출되면, 객체의 복사본을 생성하고 복사본의 참조값을 return 한다. 단, Cloneable 인터페이스를 구현한 클래스의 인스턴스만 clone 메서드 호출이 가능하다. Cloneable을 구현하지 않으면 CloneNotSupportedException 예외가 발생한다. (참고로 Cloneable 인터페이스는 마커 인터페이스(Marker Interface)이다.)
Java 5 이후로 clone의 반환형 수정을 허용하여 Object 가 아닌 자신이 속한 클래스로 반환형을 수정할 수 있다.
얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy)
얕은 복사(shallow copy)는 원본과 복사본이 같은 객체를 공유하므로 원본이 변경되면 복사본도 영향을 받는다. 반면, 깊은 복사(Deep Copy)는 원본이 참조하고 있는 객체까지 복사하므로 원본을 변경해도 복사본에는 영향이 없다.
clone 메서드는 객체에 저장된 값을 그대로 복사하는 얕은 복사를 수행한다. 따라서 깊은 복사를 구현하기 원하면 clone 메서드 호출 이외에 추가적인 코드를 작성해야 한다.
참고로, String은 문자열 수정이 불가능해 서로 다른 인스턴스가 하나의 String 인스턴스를 공유해도 문제가 되지 않는다. 따라서 깊은 복사의 대상에서 제외해도 된다.
finalize
아무도 참조하지 않는 인스턴스가 가비지 컬렉션에 의해 소멸되기 전에 자동으로 호출되는 메서드이다.
오버라이딩을 통해 인스턴스 소멸 시 작성한 코드를 실행할 수 있다. System 클래스의 gc() 나 runFinalization()을 통해 GC의 수행을 요청(명령이 아님)할 수 있으나, JVM은 합리적인 방법으로 GC(Garbage Collection)을 수행하므로 특별한 상황이 아니면 GC에 영향을 미치는 메소드 호출을 삼가하는 것이 좋다.
***JAVA 9부터 더 이상 사용되지 않는다.***
참조
윤성우의 열혈 JAVA 프로그래밍
https://docs.oracle.com/javase/8/docs/api/index.html
https://mangkyu.tistory.com/101
https://velog.io/@roro/Java-Object-%ED%81%B4%EB%9E%98%EC%8A%A4-clone
'JAVA > Java' 카테고리의 다른 글
[Java] 원시 타입(Primitive Type)과 참조 타입(Reference Type) (0) | 2022.09.06 |
---|---|
[Java] 래퍼 클래스(Wrapper Class) (0) | 2022.09.06 |
[Java] JVM의 구조와 자바 컴파일 과정 (0) | 2022.09.03 |
[Java] 자바의 예외와 예외처리 (0) | 2022.08.31 |
[Java] 인터페이스와 추상 클래스 (0) | 2022.08.31 |
댓글