Java - Object

murphytklee·2023년 4월 29일
0
post-thumbnail

1. Object 클래스

1.1 java.long.Object 클래스

  • java.lang 패키지는 자바에서 가장 기본적인 동작을 수행하는 클래스들의 집합이다.
    • 따라서 자바에서는 java.lang 패키지들의 import문을 사용하지 않아도 클래스 이름만으로 바로 사용할 수 있다.
  • 자바의 클래스를 선언할 때 extends 키워드로 다른 클래스를 상속하지 않으면 암시적으로 java.lang.Object 클래스를 상속하게 된다.
  • Object는 자바의 최상위 부모 클래스에 해당된다.
  • Object 클래스는 필드가 없고 오직 11개의 메소드로 구성되어 있다.
    • 이 메소드들은 모든 클래스들이 Object클래스를 상속하므로, 모든 클래스에서 이용할 수 있다.

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라는 클래스도 함께 구현해야한다.
  1. 객체 간에 동일성을 비교하고 싶을 때는 == 말고 equals를 이용하자
  2. equals를 직접 구현해야 한다면 hashCode도 함께 구현해야 함을 인지하자
  3. equals를 직접 구현해야 한다면 eclipse와 같은 개발도구들은 equals와 hashcode를 자동으로 생성해주는 기능을 가지고 있다. 이 기능을 이용하는 것을 고려해보자
  4. 그 이유가 분명하지 않다면 비교 연산자 == 은 원시 데이터형을 비교할 때만 사용하자.
    • 원시 데이터형 (byte, short, int, long, float, double, char) 이러한 데이터 타입들은 new연산자를 이용해서 생성하지 않아도 사용될 수 있다.

1.4 Clone Method

  • clone() 메소드는 해당 인스턴스를 복제하여, 새로운 인스턴스를 생성해 반환한다.
  • 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 메서드 사용규칙
    1. clone() 메서드의 로직은 변경되면 안되기 때문에 super 키워드를 사용하여 clone() 메서드를 호출한다
    2. 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

0개의 댓글