본문 바로가기

Foundation/- Java

유용한 클래스(Object class)

1.1 Object클래스의 메서드

- 모든 클래스의 최고 조상이다. 11개의 메서드만 가지고 있다.

- notify(), wait() 등은 쓰레드와 관련된 메서드이다.

- equals(), hashCode(), toString()은 적절히 오버라이딩해야 한다.

 

 

 Object클래스의 메서드

설         명

 protected Object clone()

객체 자신의 복사본을 반환한다. 

 public boolean equals(Object obj) 

객체 자신과 객체 obj가 같은 객체인지 알려준다.

(같으면 true 다르면 false를 반환) 

 protected void finalize()

객체가 소멸될 때 가비지 컬렉터에 의해 자동적으로 호출된다. 이 때 수행되어야하는 코드가 있는 경우에만

 오버 라이딩한다. 

 public Class getClass()

객체 자신의 클래스 정보를 담고 있는 Class인스턴스를 반환한다. 

public int hashCode() 

객체 자신의 해시코드를 반환한다. 

public String otString() 

객체 자신의 정보를 문자열로 반환한다. 

public void notify() 

객체 자신을 사용하려고 기다리는 쓰레드를 하나만 깨운다. 

public void notifyAll() 

객체 자신을 사용하려고 기다리는 모든 쓰레드를 깨운다. 

public void wait() 

다른 쓰레드가 notify()나 notifyAll()을 호출할 때까지 현재 쓰레드를 무한히 또는 지정된 시간 (timeout, namos)동안 기다리게 한다.(timeout은 천 분의 1초,namos는 10의7제곱의 1초)

 public void wait(long timeout)

public void wait(long timeout, int namos) 

 

1.2 equals(Object obj)

- 객체 자신과 주어진 객체(obj)를 비교한다. 같으면 true, 다르면 false.

- Object클래스에 정의된 equals()는 참조변수 값(객체의 주소)을 비교한다.

- equals()를 오버라이딩해서 인스턴스변수의 값을 비교하도록 바꾼다.

 

equals메서드는 위 설명 그대로 자신의 객체와 주어진 객체를 비교하기 때문에 위 예제를 보듯이 p1과 p2를 그대로 비교하면 주소값이 서로다른 두 객체는 당연히 다르기 때문에 false가 나온다. 하지만 위 예제처럼 equals메서드를 오버라이딩하여 주소가 아닌 객체에 저장된 내용을 비교하도록 변경하면 된다.  

 

1.3 hashCode()

- 객체의 해시코드(int타입의 정수)를 반환하는 메서드(해시함수)

   다량의 데이터를 저장&검색하는 해싱기법에 사용된다.

- Object클래스의 hashCode()는 객체의 내부주소를 반환한다.

- equals()를 오버라이딩하면, hashCode()도 같이 오버라이딩 해야한다.

  equals()의 결과가 true인 두 객체의 hash code는 같아야하기 때문이다.

*(이정도만 알고 넘어가자 후에 컬렉션 프레임웍에 자세히나온다.! )

 

1.4 toString()

- 객체의 정보를 문자열(String)로 제공할 목적으로 정의된 메서드

위는 Object클래스의 toString() 메서드이다.

 

위와같이 toString 메서드를 그대로 이용했을 때의 모습이다.

하지만 보통 오버라이딩을 통해 의미있는 내용을 다음과 같이 넣는다.

 

이때 toString()을 다음과같이 생략해도 결과는 똑같다.

 

1.5 clone()

- 객체 자신을 복제(clone)해서 새로운 객체를 생성하는 메서드

- Cloneable인터페이스를 구현한 클래스의 인스턴스만 복제할 수 있다.

- Object클래스에 정의된 clone()은 인스턴스변수의 값만을 복제한다.

- 인스턴스변수가 참조형일 때, 참조하는 객체도 복제되게

오버라이딩을 해야한다.

위 예제는 가장 기본적인 객체 복사를 보여주고 있다. 이렇게 기본적인 객체만을 복사하면 문제가 없지만 객체가 다음 예시처럼 무엇인가 참조를 하고있다면 , 얘기가 달라진다.

위 예제를 보면 clone()은 단순히 객체의 저장된 값을 그대로 복제하기 때문에 객체가 참조하고 있는 객체까지 복사하지않는다. 따라서 c1과 c2의 두객체는 Point p를 함께 공유하고있는 것이다. 이것은 완전한 복제로 볼 수 없고 이것을 얕은 복제라고 한다.

c1과 c2가 각각의 Point인스턴스를 가리키도록 하려면 메서드를 다음과 같이 변경해 주어야 한다.

clone 메서드 부분만 위와같이 변경했는데, 새로운 Point인스턴스를 참조하도록 했다.

원본이 참조하고 있는 객체까지 복사한 것이다. 따라서 서로 각각의 Point인스턴스를 가리키고있으며 보는것과 같이 영향을 받지 않는다.

 

1.6 getClass()

- 자신이 속한 클래스의 Class객체를 반환하는 메서드

- Class객체는 클래스의 모든 정보를 담고 있으며, 클래스당 단 1개만 존재

  클래스파일(*. class)이 메모리에 로드될때 생성된다.

- Class객체를 이용하면 클래스에 정읜된 멤버의 이름이나 개수 등,

  클래스에 대한 모든 정보를 얻을 수 있다.

 

▶Class객체를 얻는 방법 (Card클래스가 있다는 전제)

(1) Class cObj = new Card().getClass();     //생성된 객체로 부터 얻는 방법

(2) Class cObj = Card.class;             // 클래스 리터럴(*.class)로 부터 얻는 방법 

(3) Class cObj = Class.forName("Card");  //클래스 이름으로 부터 얻는 방법

 

▶예시.

다음과같이  Card class의 class객체 cObj객체로 여러가지 정보를 얻어 낼 수 있다.

클래스 객체의 메서드는 http://docs.oracle.com/javase/6/docs/api/ 에서 확인 할 수 있다.

'Foundation > - Java' 카테고리의 다른 글

유용한 클래스(StringBuffer, Random)(2)  (0) 2017.08.25
유용한 클래스(String class)(1)  (0) 2017.08.22
예외처리  (1) 2017.08.17
추상클래스, 인터페이스, 내부클래스  (0) 2017.08.15
제어자(modifier)  (0) 2017.08.04