TIL_180429 Object class, API

Object class

모든 클래스의 조상, 따로 지정하지 않아도 사용자가 지정한 클래스는 object 클래스를 기본적으로 상속 하게됨

Object method - 1) toString

  • 부모클래스에서 상속되는 것이므로 오버라이딩 가능
  • super.toString() / instance.toString() 다른결과 나오게 가능
  • System.out.println()을 하면, 자바는 암시적으로 .toString()메소드로 호출됨

Object method - 2) equals

  • 객체와 객체가 같은 것인지를 비교하는 API (오버라이딩 이용)
  • boolean타입의 리턴값을 갖음
  • hashcode()도 함께 알고있어야 제대로 된 API구현이 가능
  • primitive 데이터 형에는 비교연산자를 통해 비교연산이 가능 (equals 필요X)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Student{
String name;
Student(String name){
this.name = name;
}
public boolean equals(Object obj) {
/* 다형성 형변환 부모-> 자식행세를 위한 강제 명시 (Student)*/
Student _obj = (Student)obj;
return name == _obj.name;
}
}
class ObjectDemo {
public static void main(String[] args) {
Student s1 = new Student("egoing");
Student s2 = new Student("egoing");
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
}
}

[다형성 형변환]
자식 데이터타입은 부모 데이터타입에 할당될 수 있음 (매개변수 obj) - 다형성
Object 데이터타입에는 name이라는 멤버가 없기에 부모데이터타입으로 변환된(s2->obj) 변수를 다시 Student 데이터타입으로 전환해야함
그러나, 자식이 부모행세를 하는것은 가능하나, 부모가 자식행세를 하는 것은 불가능하기 때문에 앞에 강제로 (형번환데이터타입)을 명시해주어야함

Object method - 3) clone

  • 객체를 똑같이 복사해주는 메소드
  • 단, 복제가능한 객체라는 사실을 자바 vm에게 알려주어야함
  • 이를 위해 Cloneable 인터페이스를 구현 (implements Clonable)
  • 접근제어자 protected(같은 패키지안에서만 접근 가능) -> 즉, object에 내장되어있는 API로 자동접근은 불가 -> protected는 상속은 가능하기에, 상속을 통한 접근으로 클론해야함 (이때 접근제어자를 public으로)
  • clone은 예외가 강제되어 있기 때문에 throws 해주어야함
  • 따라서, 메인 메소드에서 사용자가 그 예외를 어떻게 처리할 것인지 적어주어야함
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Student implements Cloneable{
String name;
Student(String name){
this.name = name;
}
/* 클론의 접근제어자는 protected
API 사용방법에 예외가 강제되어있기에 throws 해주어야함 */
protected Object clone() throws CloneNotSupportedException{
// super(object) 상속을 통한 접근으로 클론해야함
return super.clone();
}
}
class ObjectDemo {
public static void main(String[] args) {
Student s1 = new Student("egoing");
try {
// s1은 object데이터타입으로 리턴되고 있기 때문에 명시적 형변환 (Student) 필요
Student s2 = (Student)s1.clone();
System.out.println(s1.name);
System.out.println(s2.name);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}