본문 바로가기

프로그래밍/JAVA

[ JAVA ] java.lang 패키지 - Object클래스

◆ java.lang 패키지
- 자바프로그래밍에 가장 기본이 되는 클래스들을 포함하고 있으며, java.lang 패키지의 클래스들은 import문 없이도 사용 가능

1.  Object 클래스

▶ Object 클래스는 멤버변수는 없고 오직 11개의 메서드만 가지고 있다.

Object클래스의 메서드 설명
protected Object clone() 객체 자신의 복사본을 반환한다.
public boolean equals(Object obj) 객체 자신과 객체 obj가 같은 객체인지 알려준다. (같으면 true)
protected void finalize() 객체가 소멸될 때 가비지 컬렉터에 의해 자동적으로 호출된다. 이 때 수행되어야하는 코드가 있을 때 오버라이딩한다. (거의 사용안함)
public Class getClass() 객체 자신의 클래스 정보를 담고 있는 Class인스턴스를 반환한다.
public int hashCode() 객체 자신의 해시코드를 반환한다.
public String toString() 객체 자신의 정보를 문자열로 반환한다.
public void notify() 객체 자신을 사용하려고 기다리는 쓰레드를 하나만 깨운다.
public void notifyAll() 객체 자신을 사용하려고 기다리는 모든 쓰레드를 깨운다.
public void wait()
public void wait(long timeout)
public void wait(long timeout, int nanos)
다른 쓰레드가 notify()나 notifyAll()을 호출할 때까지 현재 쓰레드를 무한히 또는 지정된 시간(timeout, nanos)동안 기다리게 한다. (timeout은 천 분의 1초, nanos는 10⁹분의 1초)

① equals(Object obj)

▶ 매개변수로 객체의 참조변수를 받아서 비교하여 그 결과를 boolean값으로 얄려준다.

▶ 두 객체의 같고 다름을 참조변수의 값으로 판단한다.

▶ String, Date, File, wrapper클래스(Integer ,Double 등)의 equals메서드는 주소값이 아닌 내용을 비교하도록 오버라이딩되어 있다. (StringBuffer클래스는 오버라이딩되어 있지 않음)

public boolean equals(Object obj) {
	return (this == obj);
}

예제)

② hashCode()

▶ 해싱(hashing)기법에 사용되는 '해시함수(hash function)'를 구현한 것이다.

▶ 해싱 : 데이터관리기법 중의 하나로 다량의 데이터를 저장하고 검색하는 데 유용함

▶ 해시함수는 찾고자하는 값을 입력하면, 그 값이 저장된 위치를 알려주는 해시코드(hash code)를 반환한다.

▶ 객체의 주소값을 이용해서 해시코드를 만들어 반환한다. 즉, 서로 다른 두 객체는 결코 같은 해시코드를 가질 수 없다.

▶ 해싱기법을 사용하는 HashMap이나 HashSet과 같은 클래스에 저장할 객체라면 반드시 hashCode메서드를 오버라이딩해야한다.

 

예제)

▶ String클래스는 문자열의 내용이 같으면 동일한 해시코드를 반환하도록 hashCode메서드가 오버라이딩되어 있다.

▶ System.identityHashCode(Object x)는 객체의 주소값으로 해시코드를 생성하기 때문에 모든 객체에 대해 항상 다른 해시코드값을 반환한다. (System.identityHashCode(Object x)의 호출결과는 실행 할 때마다 달라질 수 있음)

③ toString()

▶ 인스턴스에 대한 정보를 문자열(String)로 제공할 목적으로 정의한 것

▶ 클래스이름과 16진수의 해시코드를 반환한다.

▶ String클래스의 toString()은 String인스턴스가 갖고 있는 문자열을 반환하도록 오버라이딩되어 있다.

▶ Date클래스의 toString()은 Date인스턴스가 갖고 있는 날짜와 시간을 문자열로 변환하여 반환하도록 오버라이딩되어 있다.

※ 조상에 정의된 메서드를 자손에서 오버라이딩할 때는 조상에 정의된 접근범위보다 같거나 더 넓어야 한다.

public String toString(){
	return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

④ clone()

▶ 자신을 복제하여 새로운 인스턴스를 생성하는 일을 한다.

▶ 단순히 인스턴스변수의 값만을 복사하기 떄문에 참조타입의 인스턴스 변수가 있는 클래스는 완전한 인스턴스 복제가 이루어지지 않는다.

▶ clone()을 사용하려면, 복제할 클래스가 Cloneable 인터페이스를 구현해야하고, (Cloneable을 구현하지 않은 클래스 내에서 호출되면 예외를 발생시킴) clone()을 오버라이딩하면서 접근 제어자를 protected -> public으로 변경한다. (상속관계가 없는 다른 클래스에서 clone()을 호출 할 수 있음)

▶ Cloneable 인터페이스를 구현한 클래스의 인스턴스만 clone()을 통한 복제가 가능함

    이유 : 인스턴스의 데이터를 보호하기 위함. Cloneable 인터페이스가 구현되어 있다는 것은 클래스 작성자가 복제를 허용한다는 의미

 

예제)

◆ 공변 반환타입
- 오버라이딩할 때 조상 메서드의 반환타입을 자손 클래스의 타입으로 변경을 허용하는 것으로 JDK1.5부터 추가됨
- 조상의 타입이 아닌 실제로 반환되는 자손 객체의 타입으로 반환할 수 있어서 번거로운 형변환이 줄어든다는 장점이 있다.
- 배열, Vector, ArrayList, LinkedList, HashSet, TreeSet, HashMap, TreeMap, Calendr, Date와 같은 클래스들은 clone()으로 복제가 가능하다. (Cloneable을 구현하였으면 복제가 가능한 클래스이다.)

예제1)

예제2) 배열 복사 방법

◆ 얕은 복사와 깊은 복사
- 얕은 복사는 원본과 복제본이 같은 객체를 공유하므로 원본을 변경하면 복사본도 영향을 받는다.
-깊은 복사는 원본이 참조하고 있는 객체까지 복제하는 것으로 원본과 복사본이 서로 다른 객체를 참조하기 때문에 원본의 변경이 복사본에 영향을 미치지 않는다.

얕은 복사와 깊은 복사

⑤ getClass()

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

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

▶ Class객체는 클래스 파일을 읽어서 사용하기 편한 형태로 저장해 놓은 것이다.

▶ 클래스 파일이 '클래스 로더(ClassLoader)'에 의해서 메모리에 올라갈 때 자동으로 생성된다.

▶ 클래스 로더(ClassLoader) : 실행 시에 필요한 클래스를 동적으로 메모리에 로드하는 역할을 함

◆ Class객체를 얻는 방법
- 생성된 객체로 부터 얻는 방법                   ex) Class cObj = new  Card().getClass();
- 클래스 리터럴(*.class)로 부터 얻는 방법  ex) Class cObj = Card.class;
- 클래스 이름으로 부터 얻는 방법                ex) Class cObj = Class.forName("Card");
- forName()은 특정 클래스 파일, 예를 들어 데이터베이스 드라이버를 메모리에 올릴 때 주로 사용한다.
- Class객체를 이용하면 클래스에 대한 모든 정보를 얻을 수 있기 때문에 Class 객체를 통해서 객체를 생성하고 메서드를 호출하는 등 보다 동적인 코드를 작성 할 수 있다.

'프로그래밍 > JAVA' 카테고리의 다른 글

[ JAVA ] Calendar와 Date  (0) 2022.12.20
[ JAVA ] java.lang 패키지 - String클래스  (0) 2022.11.27
[ JAVA ] 인터페이스(interface)  (0) 2022.10.29
[ JAVA ] 오버라이딩(overriding)  (0) 2022.10.09
[ JAVA ] 상속(inheritance)  (0) 2022.10.09