코딩일기/JAVA
Java - 오브젝트 클래스 Object Class
JAKE5113
2023. 1. 31. 15:44
모든 클래스가 상속받는 클래스 Object Class
제일 조상 클래스라고 생각하면 된다.
이와 같이 Test 클래스에는 int형 a만 멤버로 갖고 있다.
main함수에서 Test 객체를 생성하고
참조타입 Test인 참조변수 t로 Test객체를 참조한다.
Test객체는 이제 a만 갖고 있을 텐데,
a . 을 찍어보면 여러 메소드들이 보인다.
옆에 보면 Object클래스가 갖고 있는 메소드들 임을 알 수 있다.
그런데 우리는 Test 객체만 생성했지 않은가?
클래스들은 Object 클래스를 자동 상속한다.
GitHub - jake5113/Mrhi_JAVA
Contribute to jake5113/Mrhi_JAVA development by creating an account on GitHub.
github.com
import java.util.ArrayList;
import java.util.Random;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
// object class : 모든 java 클래스의 부모클래스(최상위 클래스)
// java언어에 존재하는 모든 클래스들은 extends의 명시여부와 상관없이
// 무조건 Object 클래스를 상속받은 상태로 만들어짐.
// 명시적으로 다른 클래스를 상속받았더라도 Object클래스는 상속됨.[다중상속이 아니라 계층상속임]
Test t = new Test();
// Test클래스는 명시적으로 아무것도 상속하지 않았지만
// 기본적으로 Object 클래스를 상속받은 상태.
// Object 클래스의 주요 기능 메소드들
// 1. toString()
// 2. equals(Object obj)
// 3. hashCode()
// 4. get()
// 5. wait(), notify(), notifyAll() : 이건 Thread 수업에서 소개.
// 1) toString(): 객체에 대한 소개 문자열 리턴
String s = t.toString();
System.out.println(s); // [default : "클래스명@해시코드"]
// 해시코드 : 매모리 물리주소를 상대적인 주소로 표현한 숫자(자바에서의 주소)
Test t2 = new Test();
String s2 = t2.toString();
System.out.println(s2); // t와 해시코드가 다르기에 다른 객체임
Test t3 = t2;
String s3 = t3.toString();
System.out.println(s3); // t2와 같은 객체를 공유하기에 같은 해시코드
// 당연히 Java System API 2000여개들도 toString()을 보유하고 있음.
Random rnd = new Random();
String s4 = rnd.toString();
System.out.println(s4); // [default : "패키지명.클래스명@해시코드"]
// .toString() 의 특이한 결과.
String name = new String("sam");
String s5 = name.toString();
System.out.println(s5); // 객체 소개글이 아니라 문자열 데이터가 출력됨.
// 원래의 toString() 기능으로 동작하지 않았다는 것은
// 메소드를 오버라이드하여 기능을 개선했다는 것임.
// 즉, Object클래스의 메소드도 역시 기능개선 오버라이드가 가능함
First f = new First();
// First 객체의 멤버값을 출력해보기 위해
// toString()의 기능을 개선
System.out.println(f.toString());
System.out.println();
// 2) equals(Object obj)
Test t4 = new Test();
Test t5 = new Test();
boolean bb = t4.equals(t5);
System.out.println(bb);
Test t6 = t5;
System.out.println(t6.equals(t5));
// 사실 같은 객체인지를 판별할때 equals()메소드를 잘 사용하지 않음.
// why?
// 참조변수의 주소값끼리 비교연산이 가능하기에.
System.out.println(t6 == t5);
System.out.println(t6 == t4);
System.out.println();
// equals()도 상속받은 메소드니까 오버라이드 가능
// 멤버값이 서로 같은지를 비교하여 결과를 리턴해주는 기능으로 개선해보기
First f1 = new First();
First f2 = new First();
f1.num = 100;
f2.num = 100;
System.out.println(f1.equals(f2));
f1.num = 100;
f2.num = 200;
System.out.println(f1.equals(f2));
System.out.println();
// 이렇게 오버라이드 된 대표적인 클래스가 바로 .String
String s6 = new String("Hello");
String s7 = new String("Hello");
System.out.println(s6 == s7); // 주소비교 : false
System.out.println(s6.equals(s7)); // 값비교 : true
System.out.println();
// 3) getClass(): 클래스의 정보를 가진 Class객체 리턴해줌.
Test t7 = new Test();
Class obj = t7.getClass();
System.out.println(obj.getName()); // 클래스명
System.out.println(obj.getPackageName() + " . "); // 패키지명
System.out.println(obj.getSuperclass()); // 부모클래스
// 4) hashCode() : 자바에서 주소값 [ 객체마다 고유한 번호 부여 ]
Test t8 = new Test();
int hashcode = t8.hashCode();
System.out.println(hashcode);
System.out.println(t8.toString());
System.out.println(Integer.toHexString(hashcode));
System.out.println();
// Object class를 사용하는 대표적인 상황
// 업캐스팅 : 부모참조변수로 자식객체를 참조하는 것
Object obj2 = null;
// Object 는 모든 클래스의 최상위 부모 클래스이므로
// 어떤 클래스의 객체든 모두 참조하는 것이 가능함
obj2 = new Test();
obj2 = new First();
obj2 = new String();
obj2 = new int[5];
obj2 = new ArrayList<String>();
//일종의 만능 참조변수 같은 느낌.
// 업캐스팅은 메소드의 파라미터나 리턴에도 사용가능함.
// 어떤 객체든 파라미터로 받고 싶을 때 Object를 사용하기도 함
// 대표적인 사용 예) System.out.println()
System.out.println(new Random()); // 자동 전달된 객체의 toString()이 발동함
System.out.println(new Test());
System.out.println(new String("aa"));
Person p = new Person();
Person p2 = new Person("sam",25,"Seoul");
// 멤버변수들 하나하나를 별도로 설정하는 기능도 필수로 요청됨
System.out.println(p.getName());
}
}
반응형