...

toString ๋ฉ์๋
๊ธฐ๋ณธ์ ์ผ๋ก Object ํด๋์ค์ toString() ๋ฉ์๋๋ ํด๋น ์ธ์คํด์ค์ ๋ํ ์ ๋ณด๋ฅผ ๋ฌธ์์ด๋ก ๋ฐํํ๋ค. ์ด ๋ฉ์๋๋ ์ธ์คํด์ค์ ๋ํ ์ ๋ณด๋ฅผ ๋ฌธ์์ด๋ก ์ ๊ณตํ ๋ชฉ์ ์ผ๋ก ์ ์๋์ด ์๋ ๊ฒ์ด๋ค.
์ด๋ ๋ฐํ๋๋ ๋ฌธ์์ด์ ํด๋์ค ์ด๋ฆ๊ณผ ํจ๊ป ๊ตฌ๋ถ์๋ก @๊ฐ ์ฌ์ฉ๋๋ฉฐ, ๊ทธ ๋ค๋ก 16์ง์ ํด์ ์ฝ๋(hash code)๊ฐ ์ถ๊ฐ๋๋ค. ํด์ ์ฝ๋ ๊ฐ์ ์ธ์คํด์ค์ ์ฃผ์๋ฅผ ํด์ฑํ์ฌ ๋ณํํ ๊ฐ์ผ๋ก, ๊ณ ์ ์ซ์๋ก์ ์ธ์คํด์ค๋ง๋ค ๋ชจ๋ ๋ค๋ฅด๊ฒ ๋ฐํ๋๋ค.
์ค์ ๋ก 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));
}
}

์ฐ๋ฆฌ๋ [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));
}
}

์ค์ ๋ก Integer ํด๋์ค์์๋ ๋ค์๊ณผ ๊ฐ์ด toString ๋ฉ์๋๊ฐ ๋ฏธ๋ฆฌ ์ค๋ฒ๋ผ์ด๋ฉ ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ณ๋ค๋ฅธ ์์ ์์ด ๋ฐฐ์ด์ ์ถ๋ ฅํ๋ฉด Wrapper ๊ฐ์ฒด๊ฐ ๋ฌธ์์ด๋ก ๋ณํ๋ ๊ฒ์ด๋ค.

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]
}
}
์ด ๊ธ์ด ์ข์ผ์ จ๋ค๋ฉด ๊ตฌ๋ & ์ข์์
์ฌ๋ฌ๋ถ์ ๊ตฌ๋
๊ณผ ์ข์์๋
์ ์์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค.