1. Object 클래스
1.1 java.long.Object 클래스
- java.lang 패키지는 자바에서 가장 기본적인 동작을 수행하는 클래스들의 집합이다.
- 따라서 자바에서는 java.lang 패키지들의 import문을 사용하지 않아도 클래스 이름만으로 바로 사용할 수 있다.
- 자바의 클래스를 선언할 때 extends 키워드로 다른 클래스를 상속하지 않으면 암시적으로 java.lang.Object 클래스를 상속하게 된다.
- Object는 자바의 최상위 부모 클래스에 해당된다.
- Object 클래스는 필드가 없고 오직 11개의 메소드로 구성되어 있다.
- 이 메소드들은 모든 클래스들이 Object클래스를 상속하므로, 모든 클래스에서 이용할 수 있다.
![](https://velog.velcdn.com/images/murphytklee/post/7f388235-31ec-49e5-ae38-13eeb6e1a871/image.png)
1.2 toString() Method
- toString() 메소드는 해당 인스턴스에 대한 정보를 문자열로 반환한다.
- 이때 반환되는 문자열은 클래스 이름과 함께 구분자로 ‘@’가 사용되며, 그 뒤로 16진수 해시 코드(hash code)가 추가된다.
- 16진수 해시코드 값은 인스턴스의 주소를 가리키는 값으로, 인스턴스마다 모두 다르게 반환된다.
- 자바에서 toString() 메소드는 기본적으로 각 API 클래스마다 자체적으로 overiding재정의 되어 있다.
- 때문에
println(car01);
과 println(car01.toString());
의 출력이 같다.
Car car01 = new Car();
Car car02 = new Car();
System.out.println(car01);
System.out.println(car02.toString());
Car@15db9742
Car@6d06d69c
1.3 equals() Method
- equals() 메소드는 해당 인스턴스를 매개변수로 전달받는 참조 변수와 비교하여, 그 결과를 반환한다.
- 이때 참조 변수가 가르키는 값을 비교하므로, 서로 다른 두 객체는 언제나 false를 반환하게 된다.
Car car01 = new Car();
Car car02 = new Car();
System.out.println(car01 == car02);
System.out.println(car01.equals(car02));
car01 = car02;
System.out.println(car01.equals(car02));
false
false
true
- equals를 제대로 사용하기 위해서는 hashcode라는 클래스도 함께 구현해야한다.
- 객체 간에 동일성을 비교하고 싶을 때는 == 말고 equals를 이용하자
- equals를 직접 구현해야 한다면 hashCode도 함께 구현해야 함을 인지하자
- equals를 직접 구현해야 한다면 eclipse와 같은 개발도구들은 equals와 hashcode를 자동으로 생성해주는 기능을 가지고 있다. 이 기능을 이용하는 것을 고려해보자
- 그 이유가 분명하지 않다면 비교 연산자 == 은 원시 데이터형을 비교할 때만 사용하자.
- 원시 데이터형 (byte, short, int, long, float, double, char) 이러한 데이터 타입들은 new연산자를 이용해서 생성하지 않아도 사용될 수 있다.
1.4 Clone Method
- clone() 메소드는 해당 인스턴스를 복제하여, 새로운 인스턴스를 생성해 반환한다.
![](https://velog.velcdn.com/images/murphytklee/post/f6fbfebe-c580-4241-91b6-8531b62f0449/image.png)
- clone() 메서드의 접근제어자는 protected 이다.
- protected 접근자의 특징
- → 서로 다른 패키지에서는 호출할 수 없다.
- → 서로 다른 패키지라고 할지라도 상속은 가능하다.
package org.opentutorials.javatutorials.progenitor;
class Student implements Cloneable{
String name;
Student(String name){
this.name = name;
}
protected Object clone() throws CloneNotSupportedException{
return super.clone();
}
}
class ObjectDemo {
public static void main(String[] args) {
Student s1 = new Student("egoing");
try {
Student s2 = (Student)s1.clone();
System.out.println(s1.name);
System.out.println(s2.name);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
- Object 클래스의 clone()메소드는 단지 필드의 값만을 복사하므로, 필드의 값이 배열이나 인스턴스면 제대로 복사할 수 없다.
- 따라서 해당 클래스에서 clone() 메소드를 오버라이딩하여 복제가 제대로 이루어지도록 재정의 해야한다.
- 이러한 clone() 메소드는 데이터의 보호를 이유로 Cloneable 인터페이스를 구현한 클래스의 인스턴스만이 사용할 수 있다.
- 만약 Cloneable 인터페이스를 구현하지 않으면 CloneNotSupportException이 발생한다.
- 따라서, clone() 메서드를 호출하는 코드에서 try~catch문을 사용하여 예외를 처리하거나 throw 키워드를 사용해야한다.
- Clone() 메서드의 주요 목적은 기존 객체의 데이터를 보존하기 위함이다.
- 기존 객체의 데이터가 변경되거나 손실되면 안되므로 복제 후 복제본의 데이터를 변경할 수 있다.
- clone 메서드 사용규칙
- clone() 메서드의 로직은 변경되면 안되기 때문에 super 키워드를 사용하여 clone() 메서드를 호출한다
- super.clone() 메서드는 Object타입을 반환한다. clone() 메서드를 호출할 때마다 타입 캐스팅하는 코드를 작성하지 않도록 재정의된 clone() 메서드에서 타입 캐스팅하는 코드를 추가한다
Reference
https://opentutorials.org/course/1223/6241
http://www.tcpschool.com/java/java_api_object
https://developer-talk.tistory.com/763