java.lang.Object 클래스
java.lang 패키지 중에서도 가장 많이 사용되는 클래스로 모든 자바 클래스의 최고 조상 클래스이다. 따라서 자바의 모든 클래스는 Object 클래스의 모든 메소드를 바로 사용할 수 있다. 이러한 Object 클래스는 필드를 가지지 않으며, 총 11개의 메소드만으로 구성되어 있다.
① toString() 메소드
toString() 메소드는 해당 인스턴스에 대한 정보를 문자열로 반환한다. 이때 반환되는 문자열은 클래스 이름을 구분하기 위해 '@'가 사용되고 @ 뒤로 16진수 해시 코드(hash code)가 추가된다. 16진수 해시 코드 값은 인스턴스의 주소를 가리키는 값으로, 인스턴스마다 모두 다르게 반환 된다.
→ 자바에서 toString() 메소드는 기본적으로 각 API 클래스마다 자체적으로 오버라이딩을 통해 재정의되어 있다.
package Lang;
class food {
String cookie;
String choco;
}
public class toStringTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
food f1 = new food();
food f2 = new food();
System.out.println(f1.toString());
System.out.println(f2.toString());
}
}
② equals() 메소드
equals() 메소드는 해당 인스턴스를 매개변수로 전달받는 참조 변수와 비교하여, 그 결과를 반환한다. 이때 참조 변수가 가리키는 값을 비교하므로, 서로 다른 두 객체는 언제나 false를 반환하게 된다.
package Lang;
class Member {
String id;
String pwd;
public Member() {
}
public Member(String id, String pwd) {
this.id = id;
this.pwd = pwd;
}
@Override // 멤버 클래스를 재정의
public boolean equals(Object obj) {
// boolean 타입의 equals메서드 오버라이드
// (Object obj)는 equals 메서드가 비교할 대상 객체를 받기 위한 파라미터.
// 따라서, equals 메서드를 호출할 때는 다른 Member 객체를 전달해야 하며,
// 이 객체는 Object 타입으로 받아들여져서
// 메서드 내부에서 다시 Member 객체로 캐스팅. -> Member m = (Member) obj;
// obj가 Member 클래스의 인스턴스인지를 확인한 후 맞으면 실행 되고
// 틀리면 메서드는 즉시 false를 반환
if (obj instanceof Member) {
Member m = (Member) obj; // obj 멤버 객체로 형변환
if (this.id.equals(m.id) && this.pwd.equals(m.pwd)) {
// Member 객체들이 id와 pwd 필드 값이 같은 경우에만 같은 객체로 판단
return true;
}
}
return false;
}
@Override
public String toString() {
return "Member [id=" + id + ", pwd=" + pwd + "]";
}
}
//equals 는 문자열 자체를 비교하고 == 는 참조값(주소)만 비교함
public class EqualseTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Member m1 = new Member("aaa", "111");
Member m2 = new Member("aaa", "123");
Member m3 = new Member("aa", "111");
Member m4 = m1;
System.out.println("m1 == m2 : " + (m1 == m2));
System.out.println("m1.equals(m2): " + m1.equals(m2));
System.out.println("m1 == m3 : " + (m1 == m3));
System.out.println("m1.equals(m3): " + m1.equals(m3));
System.out.println("m1 == m4 : " + (m1 == m4));
System.out.println("m1.equals(m4): " + m1.equals(m4));
}
}
③ clone() 메소드
clone() 메소드는 해당 인스턴스를 복제하여, 새로운 인스턴스를 생성해 반환하는게 일반적이지만 Object 클래스의 clone() 메소드는 단지 필드의 값만을 복사하므로, 필드의 값이 배열이나 인스턴스면 제대로 복제할 수 없다. 따라서 이러한 경우에는 해당 클래스에서 clone() 메소드를 오버라이딩하여, 복제가 제대로 이루어지도록 재정의해야 한다. 이러한 clone() 메소드는 데이터의 보호를 이유로 Cloneable 인터페이스를 구현한 클래스의 인스턴스만이 사용할 수 있다.
package Lang;
// Cloneable 인터페이스를 구현한 클래스의 인스턴스만이 사용가능
class Myclone implements Cloneable {
int a;
int b;
public Myclone() { // 파라미터 없는 생성자 생성
}
public Myclone(int a, int b) {
this.a = a;
this.b = b;
}
//객체 메모리복사
@Override
protected Object clone() throws CloneNotSupportedException {
// 예외처리 미루기
// TODO Auto-generated method stub
return super.clone();
}
@Override
public String toString() {
return "Myclone [a=" + a + ", b=" + b + "]";
}
}
public class CloneTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 객체 직접 복사
Myclone m1 = new Myclone(4, 5);
Myclone m2 = new Myclone();
m2.a = m1.a;
m2.b = m1.b;
// 객체를 복사하였지만 참조값은 다른 걸 확인 할 수 있다.
System.out.println(m1 + "/ 참조값 : " + m1.hashCode());
System.out.println(m2 + "/ 참조값 : " + m2.hashCode());
// clone 을 이용한 객체 복사
try {
Myclone m3 = (Myclone) m1.clone();
// m1 객체를 복제(clone)하여 새로운 객체 m3를 생성하는 코드
// clone 메서드는 Object 클래스에 정의되어 있는 메서드이므로,
// 모든 클래스에서 사용이 가능하지만, 해당 클래스에서 clone 메서드를 사용하려면
// Cloneable 인터페이스를 구현(implements)해야 한다
// m1.clone()은 Object 클래스에서 상속받은 clone 메서드를 호출하고 있으며,
// 이 메서드는 해당 객체를 복제하여 새로운 객체를 생성한 뒤 그 객체를 반환
// 이때 반환되는 객체는 Object 타입이므로,
// Myclone 타입으로 형변환(casting)해야 한다
// 이를 위해 (Myclone) 형태의 캐스트 연산자를 사용
System.out.println(m1 + "/ 참조값 : " + m1.hashCode());
System.out.println(m3 + "/ 참조값 : " + m3.hashCode());
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Object 메소드
11가지 Object 메서드 종류
메소드 | 설명 |
protected Object clone() | 해당 객체의 복제본을 생성하여 반환함. |
boolean equals(Object obj) | 해당 객체와 전달받은 객체가 같은지 여부를 반환함. |
protected void finalize() | 해당 객체를 더는 참조하지 않아 가비지 컬렉터가 객체의 리소스를 정리하기 위해 호출함. |
Class<T> getClass() | 해당 객체의 클래스 타입을 반환함. |
int hashCode() | 해당 객체의 해시 코드값을 반환함. |
void notify() | 해당 객체의 대기(wait)하고 있는 하나의 스레드를 다시 실행할 때 호출함. |
void notifyAll() | 해당 객체의 대기(wait)하고 있는 모든 스레드를 다시 실행할 때 호출함. |
String toString() | 해당 객체의 정보를 문자열로 반환함. |
void wait() | 해당 객체의 다른 스레드가 notify()나 notifyAll() 메소드를 실행할 때까지 현재 스레드를 일시적으로 대기(wait)시킬 때 호출함. |
void wait(long timeout) | 해당 객체의 다른 스레드가 notify()나 notifyAll() 메소드를 실행하거나 전달받은 시간이 지날 때까지 현재 스레드를 일시적으로 대기(wait)시킬 때 호출함. |
void wait(long timeout, int nanos) | 해당 객체의 다른 스레드가 notify()나 notifyAll() 메소드를 실행하거나 전달받은 시간이 지나거나 다른 스레드가 현재 스레드를 인터럽트(interrupt) 할 때까지 현재 스레드를 일시적으로 대기(wait)시킬 때 호출함. |
출처 : tcpschool
'JAVA' 카테고리의 다른 글
[JAVA] lang package - StringBuilder & StringBuffer (0) | 2023.03.04 |
---|---|
[JAVA] lang package - String (0) | 2023.03.04 |
[JAVA] lang package (0) | 2023.03.04 |
[JAVA] 예외처리 (1) | 2023.03.04 |
[JAVA] 인터페이스 활용 (0) | 2023.03.04 |