๐Ÿ“‚ JAVA/์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”

toString์„ ํ•ญ์ƒ ์žฌ์ •์˜ํ•˜๋ผ - [3์žฅ. ๋ชจ๋“  ๊ฐ์ฒด์˜ ๊ณตํ†ต ๋ฉ”์„œ๋“œ(์•„์ดํ…œ12)]

Amenable 2023. 3. 1. 23:30

1. toString์„ ์žฌ์ •์˜ ํ•ด์•ผ ํ•˜๋Š” ์ด์œ  ๐Ÿงƒ

1. Object์˜ toString ๋ฉ”์„œ๋“œ์˜ ๊ธฐ๋ณธ ํ˜•์‹

  Object์˜ ๊ธฐ๋ณธ toString ๋ฉ”์„œ๋“œ๋Š” 'ํด๋ž˜์Šค์ด๋ฆ„@16์ง„์ˆ˜๋กœ ํ‘œ์‹œํ•œ ํ•ด์‰ฌ์ฝ”๋“œ'๋ฅผ ๋ฐ˜ํ™˜ํ•ด ์ค€๋‹ค. test.Test@15db9742์ด ํ•˜๋‚˜์˜ ์˜ˆ์‹œ์ด๋‹ค. ์ด๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ํด๋ž˜์Šค์—์„œ toString์œผ๋กœ ๋ฐ˜ํ™˜๋ฐ›์„ ์ ์ ˆํ•œ ๊ฐ’์˜ ํ˜•ํƒœ๊ฐ€ ์•„๋‹ˆ๋‹ค.

  ๋˜ํ•œ, Object.class์— ์ •์˜๋œ toString์„ ์‚ดํŽด๋ณด๋ฉด ์•„๋ž˜์˜ ๋‚ด์šฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

  • The result should be a concise but informative representation that is easy for a person to read.
    ๊ฐ„๊ฒฐํ•˜๋ฉด์„œ ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ์‰ฌ์šด ํ˜•ํƒœ์˜ ์œ ์ตํ•œ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•ด๋ผ
  • It is recommended that all subclasses override this method.
    ๋ชจ๋“  ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๋ผ

์ฆ‰, ์•„์ฃผ ๋‹น์—ฐํ•˜๊ฒŒ๋„ ์šฐ๋ฆฌ๋Š” toString์„ ์žฌ์ •์˜ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

2. ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์‰ฝ๋‹ค.

  toString๋ฉ”์„œ๋“œ๋Š” ๋””๋ฒ„๊ฑฐ๊ฐ€ ๊ฐ์ฒด๋ฅผ ์ถœ๋ ฅํ•  ๋•Œ ์ž๋™์œผ๋กœ ๋ถˆ๋ฆฌ๊ฒŒ ๋œ๋‹ค. ๋งŒ์•ฝ toString์„ ์ œ๋Œ€๋กœ ์žฌ์ •์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์“ธ๋ชจ์—†๋Š” ๋ฉ”์‹œ์ง€๋งŒ ๋กœ๊ทธ์— ๋‚จ์„ ๊ฒƒ์ด๋‹ค. toString์„ ์ ์ ˆํ•˜๊ฒŒ ์žฌ์ •์˜ ํ•œ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ๋””๋ฒ„๊น…์„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2. ์–ด๋–ป๊ฒŒ toString์„ ์žฌ์ •์˜ ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? ๐Ÿน

1. ๊ฐ„๊ฒฐํ•˜๋ฉด์„œ ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ์‰ฌ์šด ํ˜•ํƒœ์˜ ์œ ์ตํ•œ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜

2. ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง„ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค

  ๋ฌผ๋ก  ์™ธ๋ถ€์— ๊ณต๊ฐœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ์— ํ•œํ•ด์„œ ์ ์šฉ๋˜๋Š” ๋ง์ผ ๊ฒƒ์ด๋‹ค.

3. ๊ฐ’ ํด๋ž˜์Šค๋ผ๋ฉด ํฌ๋งท์„ ๋ฌธ์„œ์— ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

  ํฌ๋งท์„ ๋ช…์‹œํ•˜๋ฉด ๊ทธ ๊ฐ์ฒด๋Š” ํ‘œ์ค€์ ์ด๊ณ , ๋ช…ํ™•ํ•˜๊ณ , ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๊ฐ์ฒด๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

/**
 * ์ด ์ „ํ™”๋ฒˆํ˜ธ์˜ ๋ฌธ์ž์—ด ํ‘œํ˜„์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
 * ์ด ๋ฌธ์ž์—ด์€ "XXX-YYY-ZZZZ" ํ˜•ํƒœ์˜ 12๊ธ€์ž๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
 * XXX๋Š” ์ง€์—ญ ์ฝ”๋“œ, YYY๋Š” ํ”„๋ฆฌํ”ฝ์Šค, ZZZZ๋Š” ๊ฐ€์ž…์ž ๋ฒˆํ˜ธ๋‹ค.
 * ๊ฐ๊ฐ์˜ ๋Œ€๋ฌธ์ž๋Š” 10์ง„์ˆ˜ ์ˆซ์ž ํ•˜๋‚˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
 *
 * ์ „ํ™”๋ฒˆํ˜ธ์˜ ๊ฐ ๋ถ€๋ถ„์˜ ๊ฐ’์ด ๋„ˆ๋ฌด ์ž‘์•„์„œ ์ž๋ฆฟ์ˆ˜๋ฅผ ์ฑ„์šธ ์ˆ˜ ์—†๋‹ค๋ฉด,
 * ์•ž์—์„œ๋ถ€ํ„ฐ 0์œผ๋กœ ์ฑ„์›Œ๋‚˜๊ฐ„๋‹ค. ์˜ˆ์ปจ๋Œ€ ๊ฐ€์ž…์ž ๋ฒˆํ˜ธ๊ฐ€ 123์ด๋ผ๋ฉด
 * ์ „ํ™”๋ฒˆํ˜ธ์˜ ๋งˆ์ง€๋ง‰ ๋„ค ๋ฌธ์ž๋Š” "0123"์ด ๋œ๋‹ค.
 */
@Override public String toString() {
    return String.format("%03d-%03d-%04d",
            areaCode, prefix, lineNum);
}

 

3. toString์ด ๋ฐ˜ํ™˜ํ•œ ๊ฐ’์— ํฌํ•จ๋œ ์ •๋ณด๋ฅผ ์–ป์–ด์šธ ์ˆ˜ ์žˆ๋Š” API๋ฅผ ์ œ๊ณตํ•˜์ž. ๐Ÿธ

  ๋งŒ์•ฝ ํ•ด๋‹น API๊ฐ€ ์—†๋‹ค๋ฉด ํ•ด๋‹น ์ •๋ณด๊ฐ€ ํ•„์š”ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” toString์œผ๋กœ ๊ฐ’์„ ๋ฐ›์•„์˜จ ํ›„ ์›ํ•˜๋Š” ๊ฐ’์„ ์–ป๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ ํŒŒ์‹ฑ์„ ํ•  ์ˆ˜๋ฐ–์— ์—†๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งŒ์•ฝ toString์˜ ํ‘œํ˜„์ด ๋ฐ”๋€Œ๋ฉด ํŒŒ์‹ฑ์ด ์ œ๋Œ€๋กœ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์•„ ์‹œ์Šคํ…œ์ด ๋ง๊ฐ€์งˆ ๊ฑฐ๋ผ๋Š” ๊ฒƒ์„ ๋„ˆ๋ฌด๋‚˜๋„ ์‰ฝ๊ฒŒ ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  ๊ทธ๋Ÿฌ๋ฏ€๋กœ toString์˜ ๋ฐ˜ํ™˜ ๊ฐ’์— ํฌํ•จ๋œ ์ •๋ณด๋ฅผ ์–ป์–ด์˜ฌ ์ˆ˜ ์žˆ๋„๋ก API๋ฅผ ์ œ๊ณตํ•˜๋„๋ก ํ•˜์ž.

 

4. toStirng์„ ์ž๋™์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋•Œ๋กœ๋Š” ์ ์ ˆํ•  ์ˆ˜ ์žˆ๋‹ค. ๐Ÿฅค

  AutoValue, Lombok ๊ทธ๋ฆฌ๊ณ  ๋Œ€๋ถ€๋ถ„์˜ IDE์—์„œ toString์˜ ์ƒ์„ฑ์„ ๋„์™€์ค€๋‹ค. ํ•„๋“œ์˜ ๋‚ด์šฉ์„ ์ ์ ˆํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ผ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ํด๋ž˜์Šค์˜ '์˜๋ฏธ'๊นŒ์ง€๋Š” ํŒŒ์•…ํ•˜์ง€ ๋ชปํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ž๋™ ์ƒ์„ฑ๋œ toString๋ณด๋‹ค ๋” ์ ์ ˆํ•œ toString์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ง์ ‘ toString์„ ์žฌ์ •์˜ํ•˜์ž.

  ์˜ˆ๋ฅผ ๋“ค์–ด, ์ „ํ™”๋ฒˆํ˜ธ์˜ ๋ฌธ์ž์—ด์„ toString์œผ๋กœ ํ‘œํ˜„ํ•œ๋‹ค๊ณ  ํ•˜์ž. ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด '์ž๋™ ์ƒ์„ฑ์„ ์ด์šฉํ•œ toString'๊ณผ '์ง์ ‘ ์ƒ์„ฑํ•œ toString'์„ ๋น„๊ตํ•ด ๋ณด๋ฉด์„œ ์–ด๋А ๊ฒƒ์ด ๋” ์ ์ ˆํ•œ์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

// ์ž๋™ ์ƒ์„ฑ์„ ์ด์šฉํ•œ toString (ํด๋ž˜์Šค์˜ ์˜๋ฏธ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ํ‘œ์‹œX)
@Override
public String toString() {
    return "PhoneNumber [areaCode=" + areaCode + ", prefix=" + prefix + ", lineNum=" + lineNum + "]";
}

// ์ง์ ‘ ์ƒ์„ฑํ•œ toString (ํด๋ž˜์Šค์˜ ์˜๋ฏธ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ํ‘œํ˜„)
@Override public String toString() {
    return String.format("%03d-%03d-%04d",
            areaCode, prefix, lineNum);
}

 

ํ•ด๋‹น ๊ธ€์€ ๋ฐฑ๊ธฐ์„  ๋‹˜์˜ '์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” ์™„๋ฒฝ ๊ณต๋žต'์„ ์ˆ˜๊ฐ•ํ•˜๊ณ  ์ž‘์„ฑํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.