모든 클래스의 최상위 클래스 Object
Object 클래스는 모든 자바 클래스의 최상위 클래스입니다. 다시 말하면 모든 클래스는 Object 클래스로부터 상속을 받습니다. 그런데 생각해 보면 우리가 클래스를 만들 때 Object 클래스를 상속받는 코드를 작성한 적이 없습니다. 예를 들어 다음 코드의 왼쪽을 보면 Student 클래스를 선언할 때 Object 클래스를 상속받는다는 뜻의 extends Object를 사용하지 않았습니다. 컴파일 과정에서 extends Object가 자동으로 쓰입니다.
주로 사용되는 Object 메소드는 다음과 같습니다.
메소드 | 설명 |
String toString() | 객체를 문자열로 표현하여 반환합니다. 재정의하여 객체에 대한 설명이나 특정 멤버 변수 값을 반환합니다. |
boolean equals(Object obj) | 두 인스턴스가 동일한지 여부를 반환합니다. 재정의하여 논리적으로 동일한 인스턴스임을 정의할 수 있습니다. |
int hashCode() | 객체의 해시 코드 값을 반환합니다. |
Object clone() | 객체를 복제하여 동일한 멤버 변수값을 가진 새로운 인스턴스를 생성합니다. |
Class getClass() | 객체의 Class 클래스를 반환합니다. |
void finalize() | 인스턴스가 힙 메모리에서 제거될 때 가비지 컬렉터(GC)에 의해 호출되는 메소드 입니다. 네트워크 연결 해제, 열려 있는 파일 스트림 해제 등을 구현합니다. |
void wait() | 멀티스레드 프로그램에서 사용하는 메소드입니다. 스레드를 '기다리는 상태' (non runnable)로 만듭니다. |
void nority() | wait() 메소드에 의해 기다리고 있는 스레드(non runnable 상태)를 실행 가능한 상태(runnable)로 가져옵니다. |
Object 메소드 중에는 재정의할 수 있는 메소드도 있고, 그렇지 않은 메소드도 있습니다.
toString() 메소드
Object 클래스에서 기본으로 제공하는 toString() 메소드는 이름처럼 객체 정보를 문자열로 바꾸어 줍니다. Object 클래스를 상속받은 모든 클래스는 toString()을 재정의할 수 있습니다. Srting 이나 Integer등 여러 JDK클래스에는 toString() 메소드가 이미 재정의 되어 있습니다.
equals() 메소드
equals() 메소드의 원래 기능은 두 인스턴스 주소 값을 비교하여 boolean 값(true/false)을 반환해 주는 것입니다. 주소 값이 같다면 당연히 같은 인스턴스입니다. 그런데 서로 다른 주소 값을 가진 때도 같은 인스턴스라고 정의할 수 있는 경우가 있습니다. 따라서 물리적 동일성(인스턴스의 메모리 주소가 같음)뿐 아니라 논리적 동일성(논리적으로 두 인스턴스가 같음)을 구현할 때도 equals() 메소드를 재정의하여 사용합니다.
Object 클래스의 equals() 메소드
studentLee, studentLee2 가 가리키는 인스턴스와 studentSang이 가리키는 인스턴스는 서로 다른 주소를 가지고 있지만, 저장된 학생의 정보는 같습니다. 이런 경우 논리적으로는 이 셋을 같은 학생으로 처리하는 것이 맞을 것입니다.
Object의 equals() 메소드의 원래 기능은 두 인스턴스의 주소를 비교하는 것입니다. 따라서 같은 주소인 경우만 equals()메소드의 결과가 true가 됩니다.
String과 Integer 클래스의 equals() 메소드
JDK에서 제공하는 String 클래스와 Integer 클래스에는 equals() 메소드가 이미 재정의되어 있습니다.
코드의 내용을 보면 str1과 str2는 서로 다른 인스턴스를 가리키기 때문에 str1 == str2의 결과는 false입니다. 하지만 String 클래스의 equals() 메소드는 같은 문자열의 경우 true를, 그렇지 않은 경우 false를 반환하도록 재정의되어있습니다. 두 문자열은 "abc"로 같은 값을 가지므로 str1.equals(str2)의 반환 값은 true입니다. Integer 클래스의 경우도 정수 값이 같은 경우 true를 반환하도록 equals() 메소드가 재정의되어 있음을 알 수 있습니다.
hashCode() 메소드
해시(hash)는 정보를 저장하거나 검색할 때 사용하는 자료 구조입니다. 정보를 어디에 저장할것인지, 어디서 가져올 것인지 해시 함수를 사용하여 구현합니다. 해시 함수는 객체의 특정 정보(키 값)를 매개변수 값으로 넣으면 그 객체가 저장되어야 할 위치나 저장된 해시 테이블 주소(위치)를 반환합니다. 따라서 객체 정보를 알면 해당 객체의 위치를 빠르게 검색할 수 있습니다. 해시 함수[hash(key)]는 개발하는 프로그램 특성에 따라 다르게 구현됩니다.
자바에서는 인스턴스를 힙 메모리에 생성하여 관리할 때 해시 알고리즘을 사용합니다.
hashCode = hash(key); //객체의 해시 코드 값(메모리 위치 값)이 반환됨
String 과 Integer 클래스의 hashCode() 메소드
String 클래스와 Integer 클래스의 equals() 메소드는 재정의되어 있다고 했습니다. 그러면 hashCode() 메소드도 함께 재정의되어 있을 것입니다.
9~10행을 보면 String 클래스는 같은 문자열을 가진 경우, 즉 equals() 메소드의 결과 같이 true인 경우 hashCode()메소드는 동일한 해시 코드 값을 반환합니다. Integer클래스의 hashCode() 메소드는 정수 값을 반환합니다. Integer 클래스의 hashCode() 메소드는 정수 값을 반환하도록 재정의되어 있습니다.
'복습용' 카테고리의 다른 글
17-1.Wrapper 클래스 (0) | 2020.04.02 |
---|---|
17.String 클래스 (0) | 2020.04.02 |
15-2.인터페이스 활용 (0) | 2020.04.01 |
15-1.인터페이스 요소 (0) | 2020.04.01 |
15.인터페이스 (0) | 2020.04.01 |