본문 바로가기

자바 (Java)/요약

Chpt 9. java.lang 패키지, util 클래스 - 주제 1. Object 클래스

728x90

java.lang 패키지는 기본적인 클래스를 포함하고 있으며 import문 없이 바로 사용할 수 있다. Object 클래스도 이 중 하나이다. Object 클래스는 모든 클래스의 최고 조상이므로 모든 클래스에서 Object 클래스의 메서드를 사용할 수 있다.

 

1. protected Object clone()

 

객체 자신의 복사본을 반환한다. 오버라이딩 할 때 public으로 접근 제어자를 변경해야 상속하는 자손 뿐만 아니라 후손까지도 사용할 수 있다.

 

2. public Class getClass()

 

객체 자신의 클래스 정보를 담고 있는 Class 타입의 인스턴스를 반환한다. Hello.java 파일을 컴파일하면 Hello.class 파일이 만들어지는데 이때 메모리에 Hello의 Class 타입 인스턴스가 생성된다. 이 인스턴스에는 조상은 몇 개이고, 인스턴스 변수는 몇 개인가 등 Hello 클래스에 관한 정보가 담겨있다. 이 Hello의 Class 타입 인스턴스로 객체 생성과 객체의 정보에 대해 알 수 있다.

 

3. public boolean equals(Object obj)

 

Object 클래스의 equals 메서드는 다음과 같다.

 

public boolean equals(Object obj) {

    return (this == obj);

}

 

해당 메서드는 값을 비교하는 것이 아닌 참조변수를 비교, 서로 다른 두 객체의 주소를 비교하는 것이기 때문에 항상 false의 결과가 나온다. 그렇기 때문에 적절히 자손 클래스에서 오버라이딩 해주어야 한다. 다음과 같은 방법으로 오버라이딩 해주어야 한다.

 

(1) obj를 instanceof로 클래스 타입으로 형변환 가능한지 확인
(2) obj를 클래스 타입에 맞게 형변환
(3) this.인스턴스 변수와 obj.인스턴스 변수 비교한 결과 리턴

 

static 변수가 아닌 인스턴스 변수를 비교하는 이유는 static 변수는 공통의 속성, 인스턴스 변수는 객체마다 고유하기 때문이다. 

 

4. public int hashCode()

 

객체의 주소로 해시 코드를 만들어 반환하는 메서드이다. 객체의 주소로 만드는 값이기 때문에 서로 다른 두 객체는 같은 해시 코드를 가질 수 없다. 인스턴스 변수로 비교하려면 3. equals 메서드와 마찬가지로 다음과 같이 오버라이딩 해야 한다. 

 

public int hashCode() {

    return Objects.hash(kind, number); // 카드 클래스의 인스턴스 변수, hash의 매개 변수는 가변인자

}

 

[참고 1] String의 equals와 hashCode는 모두 인스턴스 변수의 값으로 객체를 비교하도록 오버라이딩 되어있다. 

 

5. public String toString()

 

Object의 toString()은 다음과 같은 값을 리턴한다.

 

클래스 이름@16진수 해시 코드 

 

인스턴스 변수의 값들을 리턴하도록 오버라이딩하는 것이 일반적이다.

 

[참고 2] String 클래스의 toString() 메서드 경우 문자열 인스턴스 변수를 반환한다.

 

[주의] 오버라이딩할 때 접근 제어자는 조상의 것보다 항상 넓거나 같아야 한다.

반응형