Search

Object 클래스

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

참고 자료