Language/Java

โ˜• ์ž๋ฐ” toString ์˜ค๋ฒ„๋ผ์ด๋”ฉ - ์™„๋ฒฝ ์ดํ•ดํ•˜๊ธฐ

์ธํŒŒ_ 2022. 11. 15. 12:40

java-object-tostring

toString ๋ฉ”์†Œ๋“œ

๊ธฐ๋ณธ์ ์œผ๋กœ Object ํด๋ž˜์Šค์˜ toString() ๋ฉ”์†Œ๋“œ๋Š” ํ•ด๋‹น ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ œ๊ณตํ•  ๋ชฉ์ ์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋•Œ ๋ฐ˜ํ™˜๋˜๋Š” ๋ฌธ์ž์—ด์€ ํด๋ž˜์Šค ์ด๋ฆ„๊ณผ ํ•จ๊ป˜ ๊ตฌ๋ถ„์ž๋กœ @๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉฐ, ๊ทธ ๋’ค๋กœ 16์ง„์ˆ˜ ํ•ด์‹œ ์ฝ”๋“œ(hash code)๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค. ํ•ด์‹œ ์ฝ”๋“œ ๊ฐ’์€ ์ธ์Šคํ„ด์Šค์˜ ์ฃผ์†Œ๋ฅผ ํ•ด์‹ฑํ•˜์—ฌ ๋ณ€ํ™˜ํ•œ ๊ฐ’์œผ๋กœ, ๊ณ ์œ  ์ˆซ์ž๋กœ์„œ ์ธ์Šคํ„ด์Šค๋งˆ๋‹ค ๋ชจ๋‘ ๋‹ค๋ฅด๊ฒŒ ๋ฐ˜ํ™˜๋œ๋‹ค.

์‹ค์ œ๋กœ toString() ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€๋ฅผ ๋ณธ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„๋˜์–ด์žˆ๋‹ค.

java-toString

class MyObject extends Object { // extends Object ๋Š” ์ƒ๋žตํ•ด ์ค˜๋„ ๋œ๋‹ค. 
    int objId;
    String objName;

    public MyObject(int objId, String objName) {
        this.objId = objId;
        this.objName = objName;
    }
}

public class Main {
    public static void main(String[] args) {
        MyObject o1 = new MyObject(101, "First Object");
        MyObject o2 = new MyObject(102, "Second Object");

        // ํด๋ž˜์Šค ํƒ€์ž… ์ด๋ฆ„ @ ๊ฐ์ฒด์ฃผ์†Œ ํ•ด์‹œ์ฝ”๋“œ
        System.out.println(o1.toString()); // MyObject@251a69d7
        System.out.println(o2.toString()); // MyObject@7344699f
    }
}

 

์ด๋•Œ ๊ฐ์ฒด๋ฅผ ์ถœ๋ ฅํ• ๋•Œ toString() ๋ฉ”์„œ๋“œ๋ฅผ ๋ถ™์—ฌ์ฃผ์ง€ ์•Š๊ณ  ๋ณ€์ˆ˜๋งŒ ์ถœ๋ ฅํ•ด๋„ ๋ฉ”์„œ๋“œ๋ฅผ ๋ถ™์ธ๊ฒƒ๊ณผ ๋˜‘๊ฐ™์€ ๊ฐ’์ด ์ถœ๋ ฅ๋˜๋Š”๋ฐ, ์ด๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ฐ์ฒด๋งŒ ์ถœ๋ ฅํ•  ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ toString()์„ ๋ถ™์—ฌ์ฃผ๊ณ  ์ปดํŒŒ์ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

System.out.println(o1.toString()); // MyObject@251a69d7
System.out.println(o1); // MyObject@251a69d7

toString ์˜ค๋ฒ„๋ผ์ด๋”ฉ

ํ•˜์ง€๋งŒ ๋งŒ์ผ ๊ฐ์ฒด์˜ ์ด๋ฆ„์ด๋‚˜ ์ฃผ์†Œ๊ฐ’์ด ์•„๋‹Œ ๊ฐ์ฒด์˜ ๊ณ ์œ  ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ Person ๊ฐ์ฒด๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ์›๋ก ์ ์ธ ๊ฐ’์ด ์•„๋‹Œ, Person์˜ ์ด๋ฆ„์ด๋‚˜ ๋‚˜์ด ๊ฐ™์€ ๊ณ ์œ  ์ •๋ณด๋ฅผ  ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ์„ ๋•Œ ๋ฐ”๋กœ ์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding)์„ ํ†ตํ•ด toString() ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ํ• ๋•Œ ๋ฐ”๋กœ ๋’ค์—์„œ ๋ฐฐ์šธ ์ ‘๊ทผ์ œ์–ด์ž ์ง€์ •์— ๋Œ€ํ•ด ์กฐ์‹ฌํ•ด์•ผ ํ•  ์ ์ด ์žˆ๋‹ค.
๋ฐ”๋กœ ๋ถ€๋ชจ ๋ฉ”์„œ๋“œ์— ์ •์˜๋œ ์ ‘๊ทผ์ œ์–ด์ž์˜ ๋ฒ”์œ„๋ณด๋‹ค ๋‚ฎ์€ ๋ฒ”์œ„์˜ ์ œ์–ด์ž๋ฅผ ์ง€์ •ํ• ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ธ๋ฐ, Object ํด๋ž˜์Šค์˜ toString ๋ฉ”์„œ๋“œ์˜ ์ ‘๊ทผ์ œ์–ด์ž๋Š” protected void toString() ๋ผ๊ณ  ์ •์˜๋˜์–ด์žˆ์–ด์„œ, ์ด๊ฒƒ์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ–ˆ์„๋•Œ ๊ฐ™์€ 
protected ๋‚˜ public ์œผ๋กœ ์„ค์ •ํ•ด์•ผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ๋œ๋‹ค. ๋งŒ์ผ private ๋‚˜ default ์ œ์–ด์ž๋กœ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ์ƒ๊ธด๋‹ค.
class Person {
    String name;
    int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // @Overriding : ์˜ค๋ฒ„๋ผ์ด๋”ฉ์€ ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค. ๋ธ”๋ก ์•ˆ์˜ ๋‚ด์šฉ๋งŒ ์žฌ์ •์˜ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
    public String toString() {
        return String.format("์ด๋ฆ„ : %s, ๋‚˜์ด : %d์„ธ", this.name, this.age);
    }
}

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person("ํ™๊ธธ๋™", 54);

        // p1 ๊ฐ์ฒด๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ์ด๋ฆ„๊ณผ ๋‚˜์ด๊ฐ€ ์ถœ๋ ฅ
        System.out.println(p1); // ์ด๋ฆ„ : ํ™๊ธธ๋™, ๋‚˜์ด : 54์„ธ
    }
}

 

์‹ค์ œ๋กœ ์ž๋ฐ”์˜ Point ํด๋ž˜์Šค๋„ toString() ์œผ๋กœ ์ถœ๋ ฅ์„ ํ•ด๋ณด๋ฉด ํด๋ž˜์Šค๋ช…@์ฃผ์†Œ๊ฐ’์œผ๋กœ ๋‚˜์˜ค๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์žฌ์ •์˜๋œ ๋ฌธ์ž์—ด ๊ฐ’์ด ๋‚˜์˜จ๋‹ค.

Point point = new Point(10, 20);

System.out.println(point.toString()); // java.awt.Point[x=10,y=20]

๋ฐฐ์—ด ์š”์†Œ ์ถœ๋ ฅ์„ ์œ„ํ•œ ์žฌ์ •์˜

์•„์ง ์™œ toString์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์•ผ๋˜๋Š”์ง€ ๋งˆ์Œ์†์œผ๋กœ ์ž˜ ์™€๋‹ฟ์ง€ ์•Š์œผ๋ฉด ์ด๋ฒˆ ์˜ˆ์‹œ๋กœ ์™„๋ฒฝํžˆ ์ดํ•ด๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด ๋ฐฐ์—ด์— ๋‹ค์Œ MyInt ๋ผ๋Š” ๊ฐ์ฒด ์ž๋ฃŒ๋ฅผ ์ €์žฅํ•ด์„œ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ํ•˜์ž.

MyInt ํด๋ž˜์Šค๋Š” ์ •์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ 100์„ ๊ณฑํ•œ ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ํŠน๋ณ„ํ•œ ๊ฐ์ฒด ์ž๋ฃŒํ˜•์ด๋‹ค. ์ด๋ฅผ ๋ฐฐ์—ด์— ์ ์žฌํ•˜๊ณ  ๋ฐฐ์—ด์„ ์ถœ๋ ฅํ•ด๋ณด์ž.

import java.util.Arrays;

class MyInt {
    final int num;

    MyInt(int num) {
        this.num = num * 100;
    }
}

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

        Object[] arr = new Object[5];
        arr[0] = new MyInt(0);
        arr[1] = new MyInt(1);
        arr[2] = new MyInt(2);
        arr[3] = new MyInt(3);
        arr[4] = new MyInt(4);

        System.out.println(Arrays.toString(arr));
    }
}

java-toString

์šฐ๋ฆฌ๋Š” [100, 200, 300, 400, 500] ์œผ๋กœ ์ถœ๋ ฅ๋˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ–ˆ์ง€๋งŒ, ์—‰๋šฑํ•˜๊ฒŒ ๊ฐ์ฒด ์ •๋ณด๊ฐ’์ด ์ถœ๋ ฅ๋˜์–ด ๋ฒ„๋ ธ๋‹ค.

๋ฐฐ์—ด์„ ์ŠคํŠธ๋ง์œผ๋กœ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด Arrays.toString() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ์–ด๋„ ๋ง์ด๋‹ค.

์ด๋Ÿฐ์‹์œผ๋กœ ์ถœ๋ ฅ๋œ ์ด์œ ๋Š” Arrays.toString() ๋ฉ”์„œ๋“œ๋Š” ๋ฐฐ์—ด ์ž์ฒด๋ฅผ ์ŠคํŠธ๋งํ™” ํ•œ๊ฒƒ์ด๊ณ , ๋ฐฐ์—ด ๋‚ด์˜ ๊ฐ๊ฐ์˜ ์›์†Œ๋“ค์€ ์ŠคํŠธ๋งํ™” ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ ํ˜„์ƒ์ด๋‹ค.

 

๋”ฐ๋ผ์„œ ๋ฐฐ์—ด ์š”์†Œ๋“ค๋„ ์ •์ˆ˜๊ฐ’์œผ๋กœ ์ถœ๋ ฅ๋˜๊ฒŒ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ๊ทธ ๊ฐ์ฒด ์š”์†Œ์˜ ํด๋ž˜์Šค ์ •์˜๋ฌธ์— toString() ์„ ์žฌ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.

์ฆ‰, ํ•ต์‹ฌ์€ ๋ฐฐ์—ด์˜ ์›์†Œ๋“ค์ด intํ˜• ๊ฐ™์€ primitive ํƒ€์ž…์ด ์•„๋‹Œ ๊ฐ์ฒด์™€ ๊ฐ™์€ reference ํƒ€์ž…์ผ ๊ฒฝ์šฐ, ๋ฐฐ์—ด์„ ์ถœ๋ ฅํ• ๋•Œ ์•ˆ์— ์žˆ๋Š” ๊ฐ’์„ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด์„  ๋ฐ˜๋“œ์‹œ ์ผ์ผํžˆ ๊ฐ ๊ฐ์ฒด์˜ ํด๋ž˜์Šค๋งˆ๋‹ค toString() ์„ ์žฌ์ •์˜ํ•ด์•ผ ๋œ๋‹ค๋Š” ์†Œ๋ฆฌ์ด๋‹ค.

import java.util.Arrays;

class MyInt {
    final int num;

    MyInt(int num) {
        this.num = num * 100;
    }

    @Override
    public String toString() {
        return Integer.toString(num);
    }
}

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

        Object[] arr = new Object[5];
        arr[0] = new MyInt(1);
        arr[1] = new MyInt(2);
        arr[2] = new MyInt(3);
        arr[3] = new MyInt(4);
        arr[4] = new MyInt(5);

        System.out.println(Arrays.toString(arr));
    }
}

java-toString

 

์‹ค์ œ๋กœ Integer ํด๋ž˜์Šค์—์„œ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด toString ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฏธ๋ฆฌ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋‹ค๋ฅธ ์ž‘์—…์—†์ด ๋ฐฐ์—ด์„ ์ถœ๋ ฅํ•˜๋ฉด Wrapper ๊ฐ์ฒด๊ฐ€ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜๋œ ๊ฒƒ์ด๋‹ค.

java-toString

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

        Object[] arr = new Object[5];
        arr[0] = new Integer(1);
        arr[1] = new Integer(2);
        arr[2] = new Integer(3);
        arr[3] = new Integer(4);
        arr[4] = new Integer(5);

        System.out.println(Arrays.toString(arr)); // [1, 2, 3, 4, 5]
    }
}