728x90
목차
1. Objcet 클래스
■ Object 클래스란?
- 자바에서 최상위 클래스
- 자바에서 클래스를 만들 때 항상 Object 클래스를 상속 받음
- 자식 클래스가 부모 클래스를 상속받을 경우 Object 클래스를 다중 상속하는게 아니라 부모 클래스가 Object 클래스를 상속 받음
- 자식 클래스 생성 시 부모클래스, Object 클래스 모두 생성됨
- 모든 클래스는 Object 내에 있는 메소드들을 오버라이드하여 재정의 가능
■ Object 클래스 메소드 종류
- toString
- equals
- hashCode
- getClass
- finalize
2. 예시
■ ObjectEquals
package j16_Object;
public class ObjectEquals {
public static void main(String[] args) {
String name1 = "김준일";
String name2 = "김준일";
String name3 = new String("김준일");
System.out.println(name1);
System.out.println(name2);
// 주소 비교
System.out.println(name1 == name2);
System.out.println(name1 == name3);
// equals를 통해 안에 들어있는 실제 값을 비교
System.out.println(name1.equals(name3));
// s2가 Object로 업캐스팅되고 주소를 비교
// s3는 SubStudent로 다른 객체기 때문에 다운캐스팅 불가
Student s1 = new Student("박은빈", 24);
Student s2 = new Student("박은빈", 24);
SubStudent s3 = new SubStudent("박은빈", 24);
System.out.println(s1.equals(s3));
}
}
■ ObjectFinalize
package j16_Object;
class Test {
private int num;
public Test(int num) {
super();
this.num = num;
System.out.println(num + "생성");
}
// Garbage collector가 실행되어 소멸되었을 때 실행
// 소멸자 finalize()
@Override
protected void finalize() throws Throwable {
System.out.println(num + "객체 소멸");
}
}
public class ObjectFinalize {
public static void main(String[] args) {
Test test = null;
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
test = new Test(i);
test = null;
// JVM이 여유있을때 실행
// 어떤걸 소멸시킬지 모르기 때문에 주의해서 사용
System.gc();
}
}
}
■ ObjectGetClass
package j16_Object;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ObjectGetClass {
public static void main(String[] args) {
Student student = new Student("김재영", 29);
// getClass()를 통해 해당하는 객체의 클래스의 정보를 가져옴
System.out.println(student.getClass());
// .class는 해당 클래스의 정보를 가져옴
System.out.println(Student.class);
// getClass()를 통해 명확하게 같은 클래스인지 확인
System.out.println(student.getClass().getName());
Class studentClass = student.getClass();
// 패키지명도 나옴
String className = studentClass.getName();
System.out.println("클래스 이름 : " + className);
// 클래스명만 나옴
String simpleName = studentClass.getSimpleName();
System.out.println("클래스 이름만 : " + simpleName);
// Declared가 있으면 접근 지정자에 상관없이 다 가져옴
Field[] fields = studentClass.getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
}
System.out.println();
Method[] methods = studentClass.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method);
}
}
}
■ ObjectHashCode
package j16_Object;
public class ObjectHashCode {
public static void main(String[] args) {
Student s1 = new Student("김수현", 31);
Student s2 = new Student("김수현", 31);
SubStudent s3 = new SubStudent("김수현", 31);
// 기본 생성 시 hashCode() 주소값을 나타냄
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
// 객체가 달라도 hashCode값이 같으면 true로 성립
System.out.println(s1.hashCode() == s2.hashCode());
System.out.println(s1.hashCode() == s3.hashCode());
}
}
■ ObjectToString
package j16_Object;
public class ObjectToString {
public static void main(String[] args) {
Object obj = new Object();
System.out.println(obj);
// String으로 return해서 String에 대입 가능
String str = obj.toString();
System.out.println(str);
Student student1 = new Student("조병철", 34);
Student student2 = new Student("김동민", 28);
Student student3 = new Student("김두영", 28);
Student student4 = new Student("강의진", 29);
System.out.println(student1);
System.out.println(student2);
System.out.println(student3);
System.out.println(student4);
System.out.println();
System.out.println(student1.toString());
System.out.println(student2.toString());
System.out.println(student3.toString());
System.out.println(student4.toString());
}
}
■ Student
package j16_Object;
import java.util.Objects;
public class Student {
private String name;
private int age;
public Student(String name, int age) {
// 부모 클래스의 생성자
// Object클래스에서 상속받음
super();
this.name = name;
this.age = age;
}
// hash는 특별한 알고리즘을 이용하여 데이터의 고유한 주소값 생기며 이를 숫자로 변환한 것을 hashCode라고 함
@Override
public int hashCode() {
// 객체들을 관리하는 소스코드를 가지고 있음
return Objects.hash(name, age);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
// 객체의 클래스를 가져와 명확하게 Student 클래스일 경우를 비교함
if (!(obj.getClass() == Student.class)) {
return false;
}
Student s = (Student) obj;
boolean result = name.equals(s.name) && age == s.age;
return result;
}
@Override
public String toString() {
return "이름 : " + name + "\n나이 :" + age;
}
}
■ SubStudent
package j16_Object;
import java.util.Objects;
public class SubStudent {
private String name;
private int age;
public SubStudent(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}