[java]Object Class

송어·2023년 11월 14일

Ojbect클래스를 이용한 객체 생성

일반적인 A클래스를 생성해보았다.

public class A {
	public void display() {
    	System.out.println("A");
    }
}

이 때, A클래스를 생성하면서 생략되는 코드들이 몇 가지 있다.

import.java.lang.* // 생략1

public class A (extends Object){ // 생략2
	public void display() {
    	System.out.println("A");
    }
    
    public A() { // 생략3
    	super();
    }
}

1. import.java.lang.* : 빈번하게 사용되는 자바 API
2. ~extends Object : java.lang.Object로 java의 최상위 클래스
3. default 생성자와 super();

Object클래스는 java의 최상위 클래스로 모든 클래스는 Object클래스를 상속받는다. 따라서 Object클래스를 이용해 객체를 생성할 수 있다.

A a = new A(); // 일반적인 객체생성
Object obj = new A(); // Upcasting : 모든 클래스는 Object클래스를 상속받음

Object클래스를 UpCasting해 객체를 생성할 수도 있다.

자식클래스에 접근하려면 DownCasting을 이용해야 한다.

Object클래스를 활용한 다형성 적용

java의 최상위 클래스인 Object클래스를 이용해 다형성을 적용시킬 수 있다.
다형성 인수를 이용해 생성한 인스턴스를 매개변수에 UpCasting 방식으로 저장한다.
이후 DownCasting으로 매개변수로 받은 인스턴스에 접근해 처리한다.

public class ObjectPolyTest {
    public static void main(String[] args) {
        Aclass a = new Aclass();
        display(a);
        Bclass b = new Bclass();
        display(b);
    }

    // 다형성 인수 활용
    private static void display(Object obj) {
        if (obj instanceof Aclass) {
            ((Aclass) obj).display();
        } else {
            ((Bclass) obj).display();
        }
    }
}
<result>
여긴 A클래스
여긴 B클래스

다형성 배열을 활용할 수도 있다.

public class ObjectPolyArrayTest {
    public static void main(String[] args) {
        Object[] obj = {new Aclass(), new Bclass()};

        display(obj);
        
    }

    private static void display(Object[] obj) {
        for(Object o : obj) {
            if (o instanceof Aclass) {
                ((Aclass) o).display();
            } else {
                ((Bclass) o).display();
            }
        }
    }
}
<result>
여긴 A클래스
여긴 B클래스

Object클래스의 toString()메서드

Object클래스의 toString()메서드는 객체의 주소값을 문자열로 출력할 수 있는 함수이다. 즉, toString()메서드는 인스턴스에 대한 정보를 문자열로 반환한다.

toString()메서드로 객체 정보를 패키지명+클래스명 + @ + 16진수 해시 코드(hash code)의 구조로 반환한다.

해시 코드 : 인스턴스의 주소를 해싱하여 변환한 값이다. 해시 코드는 고유 숫자로서 인스턴스마다 모두 다르게 반환된다.
java의 hashcode()메서드를 이용해 나타낼 수 있다.

다음은 java.lang.Object.toString()의 구조이다.

public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

패키지명+클래스명(getClass().getName()) + "@" + 16진수 해시 코드(Integer.toHexString(hashCode()))의 형태로 객체 정보를 반환하고 있다.

객체를 출력할 때 toString()을 사용하지 않아도 동일한 값이 출력된다. 이는 객체만 출력할 경우 컴파일러가 자동으로 toString()메서드를 붙이면서 컴파일하기 때문이다.

public class ObjectToStringTest {
    public static void main(String[] args) {
    Board b = new Board();
    
    System.out.println(b.toString()); // toString()메서드 이용해 객체 정보 출력
    System.out.println(b);
}

}

org.example.part3.model.Board@2f92e0f4 ``` Object에 기본적으로 내재되어 있는 toString()메서드를 사용하게 되면 위같은 결과값이 반환된다.

toString() 오버라이딩

toString()은 Object 클래스의 메서드이기 때문에 Object클래스를 기본적으로 상속받는 모든 클래스들은 toString()메서드를 오버라이딩 해서 알맞게 사용할 수 있다.
객체의 이름이나 주소값이 아닌 객체에 설계된 필드의 고유 정보를 출력하고 싶을 때(Board인스턴스의 경우 Board의 title이나 content 등등) toString()메서드를 오버라이딩 해서 재정의 해주면 된다.

메서드 오버라이딩을 할 때 부모메서드의 접근제어자 범위보다 낮은 범위의 접근제어자를 지정할 순 없다. Object클래스의 toString()메서드 접근제어자는 public이기 때문에 반드시 오버라이딩하는 toString()의 접근제어자는 public으로 지정해야 한다.

public class Board {

    private String title;

    public Board(String title) {
        this.title = title;
    }

    public String getTitle() {
        return title;
    }

    @Override
    public String toString() { // toString메서드 오버라이딩
        return String.format("title : %s", this.title);
    }
}

super키워드를 이용해 부모클래스(Object)의 toString()메서드를 바로 사용할 수도 있다.

super.toString(); // Object class의 toString()을 바로 사용

Reference

https://inpa.tistory.com/entry/JAVA-%E2%98%95-toString-%EB%A9%94%EC%84%9C%EB%93%9C-%EC%9E%AC%EC%A0%95%EC%9D%98-%EC%99%84%EB%B2%BD-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0

0개의 댓글