◆ 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 |