Objcet클래스의 메서드 | 설 명 |
protected Objcet clone() | 객체 자신의 복사본을 반환 |
public boolean equals(Objcet obj) | 객체 자신과 객체 obj가 같은 객체인지 알려준다 |
protected void finalize() | 객체가 소멸될 때 gc에 의해 자동적으로 호출, 이 때 수행되어야하는 코드가 있을 때 오버라이딩한다.(사용빈도 매우적음) |
public Class getClass() | 객체 자신의 클래스 정보를 담고 있는 class인스턴스 반환 |
public int hashCode() | 객체 자신의 해시코드를 반환 |
public String toString() | 객체 자신의 정보를 문자열로 반환 |
public void notify() | 객체 자신을 사용하려고 기다리는 쓰레드를 하나만 깨운다. |
public void notifyAll() | 객체 자신을 사용하려고 기다리는 쓰레드를 모두 깨운다. |
public void wait() public void wait(long timeout) putblic void wait(long timeout, int nanos) |
다른 쓰레드가 notify()나 notifyAll()을 호출할 때까지 현재 쓰레드를 무한히 또는 지정된 시간(timeout, nanos)동안 기다리게한다.(timeout = 1/1000, nanos=1/10^9) |
equals(Object obj)
Objcet - equals메서드의 실제 내용
public boolean equals(Object obj) {
return (this==obj);
} // 같은 참조변수(해시)를 참조하는가?
Value vl = new Value(10);
Value v2 = new Value(10);
v1.equals(v2); //false 다르다.
v2 = v1;
v1.equals(v2); true 같다.
주소값이 아닌 맴버변수를 비교하도록 하기 위한 오버라이딩
public boolean equals(Objcet obj){
if(obj!=null && obj instancof Person){
return id == ((Person)obj).id;
} else {
return false;
}
}
String클래스는 오버라이딩 되어있다.
hashcode()
찾고자 하는 값의 저장된 위치를 알려주는 해시코드를 반환.
바로 위와 예제 같이 해시코드 값이 아닌 인스턴스변수 값으로 같고 다름을 판단하려면 해시코드도 적절히 오버라이딩
String클래스에서는 문자열 내용이 같다면 동일한 해쉬코드를 반환하고록 오버라이딩되어있다.
ToString()
이 메서드는 인스턴스에 대한 정보를 문자열로 제공할 목적으로 정의한 것이다.
Objcet 클래스 내의 toString()
public String toString() {
return getClass().getName()+"@"+Interget.toHexString(hashcode());
} //이 내용은 클래스 이름에 16진수의 해시코드
String클래스 내의 toString()은 String인스턴스가 갖고 있는 문자열을 반환하도록 오버라이딩 되어있고
Date클래스 내의 클래스에서는 Date인스턴스가 갖고 있는 날짜와 시간을 문자열로 변환하며 반환하도록 오버라이딩 되어있다,
clone()
자신을 복제하여 새로운 인스턴스를 생성하는 메서드.
clone() 메서드를 사용하려면 Cloneable인터페이스를 구현한 클래스에서만 호출 할 수 있다. 이 인터페이스를 구현하지 않고 호출하면 예외 발생
class Point implements Cloneable{
int x, y;
Point(int x, int y) {
this.x=x;
this.y=y;
}
public String toString(){
return "x=" + x + ", y=" + y;
}
public Object clone(){ //clone()의 기본 접근 제어자는 protected
Object obj = null;
try{
obj = super.clone(); // clone은 반드시 예외처리를 해줘야 한다.
} catch (CloneNotSupportedException e){}
return obj;
}
}
class cloneEx1 {
public static void main(String[] args) {
Point ori=new Point(3,5);
Point copy = (Point) ori.clone(); //clone의 return 타입은 Objcet
System.out.println(ori);
System.out.println(copy);
}
}
= 실 행 결 과 =
x=3, y=5
x=3, y=5
공변 반환타입 - 조상 메서드의 반환타입을 자손 클래스의 타입으로 변경하는 것
ex)
위 예제 clone()메서드
public Object clone(){ ... return obj;} -> public Point clone(){ ... return (Point) obj;
이와 같이 바꾸면 main 메서드에서도
Point copy = (Point) ori.clone(); -> Point copy = ori.clone(); 으로 바꿔도 된다.
얕은 복사와 깊은 복사
얕은 복사 ( Shallow copy ) |
깊은 복사 ( Deep copy ) |
'주소 값'을 복사한다는 의미 (원본 객체가 가지고 있는 값만 그대로 복사) |
'실제 값'을 새로운 메모리 공간에 복사하는 것을 의미 |
원본과 복사본이 서로 같은 해시를 참조 | 원본과 복사본이 서로 다른 해시를 참조 |
복사본을 변경하면 원본에 영향 O 원본을 변경해도 복사본에 영향 O |
복사본을 변경해도 원본에 영향 X 원본을 변경해도 복사본에 영향 X |
clone()은 얕은 복사에 해당한다.
getClass()
자신이 속한 Class객체를 반환하는 메서드
Class객체를 얻는 방법
Class obj = new Card().getClass(); // 생성된 객체로 부터 얻는 방법
Class obj = Card.Class(); // 클래스 리터럴(*.Class)로 부터 얻는 방법
Class obj = Class.forName("Card"); // 클래스 이름으로 부터 얻는 방법
forName()은 특정 클래스 파일, ex) 데이터베이스 드라이버를 메모리에 올릴때 주로 사용
Class객체를 이용하면 클래스에 정의된 멤보 이름이나 개수 등 클래스에 대한 정보를 얻을 수 있기 때문에 Class객체를 통해서 객체를 생성하고 메서드를 호출하는등 보다 동적인 코드를 작성할 수 있다.
//Reflection API - 추후 공부 필요
final class Card{
String kind;
int num;
Card(){
this("SPADE",1);
}
Card(String kind, int num){
this.kind=kind;
this.num=num;
}
@Override
public String toString() {
return kind + ":" + num;
}
}
class ClassEx1 {
public static void main(String[] args) throws Exception{
Card c1 = new Card("HEART",3); // new 연산자를 이용한 객체 생성
Card c2 = Card.class.newInstance(); // Class객체를 이용한 객체 생성 (예외 처리 필요)
Class cObj = c1.getClass();
System.out.println(c1);
System.out.println(c2);
System.out.println(cObj.getName());
System.out.println(cObj.toGenericString());
System.out.println(cObj.toString());
}
}
== 실 행 결 과 ==
HEART:3
SPADE:1
Card
final class Card
class Card
'Java' 카테고리의 다른 글
[Java 기초 공부] 컬렉션 프레임웍 인터페이스 -1 (0) | 2024.01.11 |
---|---|
[Java 기초 공부] String 클래스 (0) | 2024.01.10 |
[Java 기초 공부] 예외처리 - 사용자 정의 예외 ~ 연결된 예외 (0) | 2024.01.08 |
[Java 기초 공부] 예외 처리 - finally, try-with-resources (0) | 2024.01.08 |
[Java 기초 공부] 예외 처리 - 메서드 내 예외 선언 (0) | 2024.01.08 |