[Java]배열에서 toString을 사용하는 법

이상혁·2024년 7월 24일

Java

목록 보기
2/2

Overview

배열에 toString을 하게 되면 배열의 메모리 주소가 나온다.
그런데 toString을 했을 때 배열 안에 있는 원소들이 나오게 하고 싶다.
하지만 배열은 toString을 재정의 할 수가 없다.
그렇다면 toString을 했을 때 배열 안에 원소들을 나타내는 방법는 무엇일까?

참조형 타입 toString 사용해보기

먼저, 참조형 타입에 toString을 사용해보자.

@RequiredArgsConstructor
public class Person {

    private String name;
    private int age;

}
public class ToString {
    public static void main(String[] args) {

        Person person = new Person();
        System.out.println("person = " + person.toString());

    }
}

Person 클래스를 만들고 필드 값으로 name과 age를 넣어 주고 ToString 클래스에서 객체를 생성을 하고 toString을 해주었다.
이 때의 결과를 보자.

객체의 위치가 어디에 있는지에 대한 정보, 타입 그리고 객체의 메모리 주소가 나와 있다.
그러면 이제 toString을 재정의 해서 객체에 필드 값들의 정보를 알 수 있도록 해보자.

@RequiredArgsConstructor
public class Person {

    private String name;
    private int age;


    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

toString을 재정의하고 main 메소드를 실행을 해본 결과를 보자.

지금 생성자의 값을 넘겨주지 않아서 기본 값이 나오고 있는데, 보면 재정의를 하지 않은 경우와 다르게 객체 안에 필드 값들을 나올 수 있도록 하였다.

배열에서 toString 사용해보기

그렇다면 배열을 만들고 toString 메소드를 사용해보자.

public class ToString {
    public static void main(String[] args) {

        int[] arr = {1, 2, 3, 4, 5};

        System.out.println("arr = " + arr.toString());

    }
}

기본형 자료인 int를 담은 배열을 만들었다.
그리고 이 배열을 toString을 어떤 값이 나오는 지 알아보자.

배열의 메모리 주소가 나온다.
즉, 배열 자체에 toString을 했을 때는 그 배열에 메모리 주소가 나오는 것을 알 수 있다.
그런데 내가 원하는 것은 배열에 요소들이 나오는 것을 원하다.
배열에서는 toString을 재정의 하지 못한다.
그렇다면 어떻게 해야 할까?

Arrays.toString 사용하기

위에서 말 했듯이 배열에서는 toString을 재정의하지 못 한다.
그래서 사용하는 것이 Arrays의 toString 메소드이다.
이 메소드를 사용해보자.

public class ToString {
    public static void main(String[] args) {

        int[] arr = {1, 2, 3, 4, 5};

        System.out.println("arr = " + Arrays.toString(arr));

    }
}

Arrays.toString을 사용을 했다.
결과를 보자.


Arrays.toString 메소드를 사용하니 내가 원하는 형태의 값이 나왔다.

Arrays.toString 내부 살펴보기

그렇다면 Arrays.toString 메소드의 내부는 어떻게 생겼을까?

 public static String toString(int[] a) {
        if (a == null)
            return "null";
        int iMax = a.length - 1;
        if (iMax == -1)
            return "[]";

        StringBuilder b = new StringBuilder();
        b.append('[');
        for (int i = 0; ; i++) {
            b.append(a[i]);
            if (i == iMax)
                return b.append(']').toString();
            b.append(", ");
        }
    }

코드 내부를 보면 먼저 배열을 매개변수로 담아서 null인지를 체크하고 배열의 길이에서 -1을 해준 값을 iMax에 담아준다.
그리고 만약 iMax가 -1이면 빈배열 표시는 반환한다.
이는 배열이 빈 배열일 때 길이가 0이라고 -1을 하면 iMax가 -1이기 때문이다.

그리고 StringBuilder를 통해서 b라는 변수에 배열 안에 요소들을 문자열로 하나씩 추가를 해주고 리턴을 시켜주면 내가 원하는 형태의 값이 나온다.

지금은 예시로 int 타입을 예시로 들었는데 다른 타입도 타입만 다를 뿐 내부 로직은 같다.

참조형 타입 Arrays.toString 사용해보기

이제 참조형 타입을 배열에 넣고 Arrays.toString을 사용해보자.

클래스에 toString을 재정의하지 않은 경우

먼저, 참조형 타입에 toStrig을 재정의를 하지 않고 사용을 해보자.

@RequiredArgsConstructor
public class Person {

    private String name;
    private int age;

}
public class ToString {
    public static void main(String[] args) {

        Person person1 = new Person();
        Person person2 = new Person();
        Person person3 = new Person();
        Person person4 = new Person();
        Person person5 = new Person();

        Person[] arr = {person1, person2, person3, person4, person5};

        System.out.println("arr = " + Arrays.toString(arr));

    }
}

Person의 재정의를 한 toString을 지우고 5개의 객체를 만들어서 배열에 담아 주었다.
이제 결과를 보자.

값이 길어서 사진에서 짤리긴 했는데 보면 배열은 잘 나오는 데 값이 객체의 위치 정보와 메모리 주소 값이 나온 것을 알 수 있다.
그 이유는 Person 클래스에서 toString 재정의가 되어 있지 않기 때문이다.

클래스에 toString을 재정의 하는 경우

@RequiredArgsConstructor
public class Person {

    private String name;
    private int age;


    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

Person 클래스에 toString을 재정의하고 다시 main 메소드를 시작해보자.


마찬가지로 길어서 사진이 짤렸다.
toString을 했을 때는 객체의 내부 필드 정보들이 나온다.
이를 통해서 객체, 참조형 타입의 값을 담은 배열의 정보를 메모리 주소가 아닌 클래스 내부 정보로 나오게 하고 싶다면 클래스의 toString을 재정의 해주어야 한다.

참고자료

[자바]배열 내용 출력 하기(Arrays.toString())

profile
꾸준히!

0개의 댓글