Ojbect 클래스
•
모든 클래스의 최고 조상 → 모든 클래스에서 바로 사용 가능
•
멤버변수는 없고, 모든 인스턴스가 가져야 할 기본적인 메소드만 가지고 있음.
•
protected Object clone () : 객체 자신의 복사본을 반환
•
public boolean equals (Object obj) : 객체 자신과 객체 obj가 같은 객체인지 알려줌.
(같으면 true)
•
protected void finalize () : 객체가 소멸될 때까지 가비지 컬렉터에 의해 자동적으로 호출.
이 때 수행돼야 할 코드가 있으면 오버라이딩 (거의 사용 X)
•
public Class getClass () : 객체 자신의 클래스 정보를 담고 있는 Class 인스턴스 반환
•
public int hashCode () : 객체 자신의 해쉬코드 반환
•
public String toString () : 객체 자신의 정보를 문자열로 반환
•
public void notify () : 객체 자신을 사용하려고 기다리는 쓰레드를 하나만 꺠움.
•
public void notiffyAll () : 객체 자신을 사용하려고 기다리는 모든 쓰레드를 깨움.
•
public void wait (), public void wait (long timeout), public void wait (long timeout, int nanos)
◦
다른 쓰레드가 nofity()나 notifyAll()을 호출할 때까지 현재 쓰레드를 무한히 또는 지정된 시간동안 기다리게 함. (timeout은 1/1000초, nanos는 1/10^9초)
equals(Object obj)
•
매개변수로 객체의 참조변수를 받아 비교하여, 그 결과를 boolean값으로 반환하는 역할
public boolean equals(Object obj) {
return (this == obj);
}
Java
•
서로 다른 두 객체를 equals 메소드로 비교하면 항상 false 반환
(참조변수에 저장된 주소값으로 비교하기 때문)
EqualsEx1.java
•
인스턴스가 가지고 있는 value 값으로 비교하는 방법은?
→ 주소가 아닌 객체에 저장된 내용을 비교하도록 equals 메소드를 오버라이딩
EqualsEx2.java
hashCode()
•
해시함수를 구현한 메소드
◦
해시함수 : 찾고자 하는 값을 입력하면, 그 값이 저장된 위치를 알려주는 해시코드를 반환
•
클래스의 인스턴스변수 값으로 객체의 같고 다름을 판단해야하는 경우라면,
hashCode 메소드도 적절한 오버라이딩이 필요
HashCodeEx1.java
toString()
•
인스턴스에 대한 정보를 문자열(String)로 제공할 목적으로 정의한 것
◦
인스턴스 변수에 저장된 값들을 문자열로 표현
public String toString() {
return getClass().getName() + "@" Integer.toHexString(hashCode());
}
Java
•
toString()을 오버라이딩 하지 않고 클래스를 작성하면,
toString()호출 시, 클래스이름과 16진수 해시코드값을 출력
CardToString.java
•
toString이 오버라이딩 되어 있는 클래스의 인스턴스에 toString을 호출하면
ToStringTest.java
•
좀 더 유의미한 값을 얻도록 Card 클래스에서 toString 메소드를 오버라이딩
CardToString2.java
clone()
•
자신을 복제하여 새로운 인스턴스를 생성하는 메소드
◦
새로운 인스턴스를 생성하여 작업하면, 기존 값 보존 가능
•
Object 클래스의 clone()은 단순히 인스턴스변수의 값만 복사하기 때문에,
참조타입의 인스턴스 변수 같은 경우는 그대로 같은 주소값을 갖게 되어
새로운 작업이 원래의 인스턴스에 영향을 미치게 됨. → 오버라이딩 필요
CloneEx1.java
공변 반환타입 (Covariant Return Type)
•
오버라이딩할 때 조상 메소드의 반환타입을 자손 클래스의 타입으로의 변경을 허용하는 것
◦
JDK 1.5부터 사용 가능
•
CloneEx1.java의 변형
public Point clone() { // 반환타입을 Object에서 Point로 변경
Object obj = null;
try {
obj = super.clone();
} catch (CloneNotSupportedException e) {}
return (Point)obj; // Point타입으로 형변환
}
Java
•
공변 반환타입 사용의 장점
◦
조상 타입이 아닌, 실제 반환되는 자손 객체의 타입으로 반환 가능하여 번거로운 형변환 X
▪
Point copy = (Point)original.cone(); → Point copy = original.clone();
•
clone()을 이용하여 배열을 복사하는 예제
CloneEx2.java
•
일반적으론 새로운 배열 생성 후, System.arraycopy()로 내용 복사
int[] arr = {1, 2, 3, 4, 5};
int[] arrClone = new int[arr.lewngth]; // 배열 생성
System.arraycopy(arr, 0, arrClone, 0, arr.length); // 내용 복사
Java
•
Vector, ArrayList, LinkedList, HashSet, TreeSet, HashMap, TreeMap, Calendar, Date
같은 클래스도 clone()을 사용하여 복제 가능
ArrayList list = new ArrayList();
ArrayList list2 = (ArrayList)list.clone();
Java
얕은 복제와 깊은 복제
•
얕은 복제(shallow copy)
◦
객체 배열을 clone()으로 복제하는 경우 원본과 복제본이 같은 객체를 공유..
◦
clone()은 객체의 저장된 값만 복제할 뿐, 객체가 참조하고 있는 객체까지 복제하진 않음.
•
깊은 복제(deep copy)
◦
원본이 참조하고 있는 객체까지 복제하는 것
◦
원본과 복사본이 서로 다른 객체를 참조하여 서로 영향을 끼치지 않음.
ShallowDeepCopy.java
getClass()
•
자신이 속한 클래스의 Class 객체를 반환하는 메소드
•
Class 객체
◦
이름이 Class인 클래스의 객체로
◦
클래스의 모든 정보를 담고 있으며, 클래스 당 1개만 존재
◦
클래스 파일이 클래스 로더에 의해 메모리에 올라갈 때, 자동으로 생성
→ 클래스 파일을 읽어서 사용하기 편한 형태로 저장해 놓은 것
public final class Class implements ... {
...
}
Java
•
클래스 로더 (Class Loader)
◦
실행 시 필요한 클래스를 동적으로 메모리에 로드
◦
기존에 생성된 클래스 객체가 메모리에 존재하는지 확인
▪
있으면 객체의 참조를 반환
▪
없으면 classpath에 저장된 경로를 따라 클래스 파일을 찾음.
▪
못찾으면 ClassNotFoundException 발생
▪
찾으면 해당 클래스 파일을 읽어서 Class 객체로 반환
→ 파일 형태로 저장된 클래스를 읽어서 Class클래스에 정의된 형식으로 변환
Class 객체를 얻는 방법
•
클래스 정보 필요 시, Class 객체에 대한 참조를 얻어 와야 함.
•
Class 객체에 대한 참조를 얻는 방법
Class cObj = new Card().getClass(); // 생성된 객체로부터 얻는 법
Class cObj = Card.class; // 클래스 리터럴(*.class)로부터 얻는 법
Class cObj = Class.forName("Card"); // 클래스 이름으로부터 얻는 법. DB 드라이버를 메모리에 올릴 때 주로 사용
Java
•
Class 객체로 클래스에 정의된 멤버의 이름, 개수 등 클래스에 대한 모든 정보 획득 가능
→ Class 객체를 통해 객체 생성 및 메소드 호출 등 동적인 코드 작성 가능
Card c = new Card(); // new 연산자를 이용해서 객체 생성
Card c = Card.class.newInstance(); // Class객체를 이용해서 객체 생ㅅ엉
Java
ClassEx1.java