๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๊ธฐํƒ€/์šฐ์•„ํ•œํ…Œํฌ์ฝ”์Šค > ํ”„๋ฆฌ์ฝ”์Šค

[ํ”„๋ฆฌ์ฝ”์Šค 2์ฃผ์ฐจ] ์ž๋™์ฐจ ๊ฒฝ์ฃผ ๊ฒŒ์ž„ ํšŒ๊ณ 

๐Ÿ˜Š 2์ฃผ์ฐจ ๋ชฉํ‘œ

  • ์š”๊ตฌ์‚ฌํ•ญ์— ์ถฉ์‹คํ•˜๊ณ , 2์ฃผ์ฐจ ๋ชฉํ‘œ์ธ ํ•จ์ˆ˜ ๋ถ„๋ฆฌํ•˜๊ธฐ์™€ ํ•จ์ˆ˜๋ณ„๋กœ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์— ์ต์ˆ™ํ•ด์ง€๊ธฐ!
  • 1์ฃผ์ฐจ ๊ณตํ†ต ํ”ผ๋“œ๋ฐฑ ์ ์šฉํ•˜๊ธฐ!
  • ์ฝ”๋“œ๋ฅผ ํ•œ ์ค„ ํ•œ ์ค„, ๊ณ ๋ฏผํ•˜๋ฉฐ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌํ˜„ํ•˜๊ธฐ!
  • ์˜ค๋ฅ˜๋ฅผ ๋ฌด์„œ์›Œํ•˜์ง€ ๋ง๊ณ  ์„ฑ์žฅ์˜ ๊ณผ์ •์ด๋ผ ๋ฏฟ๊ธฐ!
  • ์ฒœ์ฒœํžˆ ๊ทธ๋ฆฌ๊ณ  ๊ผผ๊ผผํžˆ ๋ฌธ์„œ ์ฝ๊ธฐ!

๐Ÿ˜Š ์ž๋™์ฐจ ๊ฒฝ์ฃผ ๊ฒŒ์ž„ ๊ตฌํ˜„

โ˜† ์ฝ”๋“œ์˜ ์ „๋ฌธ์ž…๋‹ˆ๋‹ค.

โœ… ์ข‹์€ ํ”„๋กœ๊ทธ๋žจ์ด๋ž€?

2์ฃผ์ฐจ๋Š” ์š”๊ตฌ์‚ฌํ•ญ ๋งˆ๋‹ค "~ํ•  ์ˆ˜ ์žˆ๋‹ค." ๋กœ ๋๋‚˜์„œ ์ฐธ ์• ๋งคํ–ˆ๋‹ค.

 

์–ด๋–ป๊ฒŒ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผํ• ์ง€ ์”ป์„ ๋•Œ๋„, ์ž๊ธฐ ์ „์—๋„, ๊ตฌํ˜„ ๋„์ค‘์—๋„ ์ง„์งœ ๊ณ„์† ๊ณ ๋ฏผํ–ˆ๋‹ค. 

๊ทธ ๊ณผ์ •์—์„œ Console.readLine() ๋‚ด๋ถ€ ์•ˆ์„ ๋“ค์–ด๊ฐ€ ๋ณด๊ธฐ๋„ ํ–ˆ๊ณ , escape ๋ฌธ์ž๋Š” ์ถœ๋ ฅ๊ณผ ๋‹ค๋ฅด๊ฒŒ ๊ทธ๋Œ€๋กœ ์ž…๋ ฅ์ด ๋˜๋Š”์ง€ ์•Œ๊ฒŒ ๋˜๊ณ , BigDecimal์™€ BigInteger ์ž๋ฃŒํ˜•์˜ ํ•จ์ˆ˜๋“ค๋„ ์ฐพ๊ณ , ์ค‘๊ตญ์–ด์™€ ์ผ๋ณธ์–ด๋„ ํฌํ•จํ•ด์•ผ ํ•˜๋‚˜? ๋ž€ ์ƒ๊ฐ์— String๋ฌธ์ž์—ด์˜ ์ž…๋ ฅ ๋ฒ”์œ„๋ฅผ ์•Œ์•„๋ด์„œ Stringํƒ€์ž…์€ ์œ ๋‹ˆ์ฝ”๋“œ์˜ ๋ฌธ์ž๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‹ค, ์ถœ๋ ฅ๋ฌธ์˜ ์š”๊ตฌ์‚ฌํ•ญ ์ค‘ ํ•˜๋‚˜์ธ "-" ๋ฅผ ํ†ตํ•ด ๊ฐ์„ ์žก๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

๋งŒ์•ฝ, intํ˜• ์ž๋ฃŒ๋ฒ”์œ„์ธ ์•ฝ 20์–ต์„ ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ๊นŒ์ง€ ์ž…๋ ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด ์‚ฌ์šฉ์ž์˜ ์ฝ˜์†”์—๋Š” 20์–ต๋ฒˆ๋งˆ๋‹ค 20์–ต๊ฐœ์˜ "-"๋ฅผ ๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, 

pobi : -----------------------------------------------------------------------...

pobi : -----------------------------------------------------------------------..------...

pobi : -----------------------------------------------------------------------... ...-----.. ์ด๋ ‡๊ฒŒ ๊ณ„์† ๋„๋ฐฐ๋  ๊ฒƒ์ด๋‹ค.

 

์ด๋Ÿฐ ์ถœ๋ ฅ๋ฌธ์ด ๋ฐ˜๋ณต๋˜๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ž๋™์ฐจ ๊ฒฝ์ฃผ ๊ฒŒ์ž„์˜ ์ง„ํ–‰ ์ƒํ™ฉ์„ ์ธ์ง€ํ•˜๊ธฐ ์–ด๋ ค์›Œ์งˆ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— "์ด๋Ÿฐ ์ถœ๋ ฅ๋ฌธ์„ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ณด๋Š” ๊ฒƒ์ด ๊ณผ์—ฐ ๋„์›€์ด ๋˜๋Š”๊ฐ€?"๋ฅผ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋ฌธ์ œ๋ฅผ ์ฝ”๋“œ๋กœ ํ•ด๊ฒฐํ•ด์„œ ์‚ฌํšŒ(์‚ฌ์šฉ์ž)์— ์ด๋ฐ”์ง€ ํ•˜๋Š” ์‚ฌ๋žŒ์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค.

 

๋‚˜์˜ ์—ญํ• (ํ”„๋กœ๊ทธ๋ž˜๋จธ)์€ ์‚ฌ์šฉ์ž๋“ค์ด ์ž๋™์ฐจ ๊ฒฝ์ฃผ ๊ฒŒ์ž„์„ ์ฆ๊ธธ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ์ง€, ์‚ฌ์šฉ์ž๊ฐ€ ์—ฃ์ง€์ผ€์ด์Šค๋Š” ๋ญ๊ฐ€ ์žˆ์ง€? ํ•˜๋ฉฐ ์ž๋™์ฐจ ๊ฒฝ์ฃผ ๊ฒŒ์ž„์„ ์ฆ๊ธฐ๋Š” ๋ฐ์— ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•˜๊ฒŒ ๊ฒŒ์ž„์„ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

 

๊ทธ๋ ‡๊ฒŒ ์š”๊ตฌ์‚ฌํ•ญ์˜ ๊ธฐ์ค€์„ "์‚ฌ์šฉ์ž๊ฐ€ ์ž๋™์ฐจ ๊ฒฝ์ฃผ ๊ฒŒ์ž„์„ ์ง๊ด€์ ์œผ๋กœ ๋ฐ”๋ผ๋ดค์„ ๋•Œ, ์ฆ๊ธธ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค."๋กœ ์„ธ์› ๋‹ค.

 

๋จผ์ €, "์ž๋™์ฐจ ๊ฒฝ์ฃผ ๊ฒŒ์ž„" ๋ž€ ์ด๋ฆ„์— ๊ฑธ๋งž๊ฒŒ ๋‹จ์–ด๋“ค์„ ์ •์˜ํ–ˆ๋‹ค.

"์ž๋™์ฐจ" → ์ž๋™์ฐจ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค

"๊ฒฝ์ฃผ"  → ์ž๋™์ฐจ๋ผ๋ฆฌ ๊ฒจ๋ค„์„œ ์šฐ์Šน์ž๋ฅผ ๊ฐ€๋ ค๋‚ด์•ผ ํ•œ๋‹ค.

 

๋งˆ์นจ๋‚ด, ์˜ˆ์™ธ์‚ฌํ•ญ์„ ๋งŒ๋“ค์–ด๊ฐ”๋‹ค.

 

1. ์ž๋™์ฐจ์— ์ด๋ฆ„์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค

  • ์ž๋™์ฐจ๋Š” ์ด๋ฆ„์€ 1~5์‚ฌ์ด์—ฌ์•ผ ํ•œ๋‹ค
  • ์ด๋ฆ„์€ ์ตœ์†Œ 2๊ฐœ ์ด์ƒ ์ž…๋ ฅ ๋ฐ›๊ธฐ → ์ด๋ฆ„์ด 0๊ฐœ๋‚˜ 1๊ฐœ๋ฉด "๊ฒฝ์ฃผ"๋ž€ ์˜๋ฏธ๊ฐ€ ์—†์Œ
  • ์ž…๋ ฅ์— ์ˆซ์ž์™€ ํŠน์ˆ˜๊ธฐํ˜ธ๋ฅผ ํฌํ•จํ•˜๊ฒŒ ํ•  ๊ฒƒ์ธ๊ฐ€?
    • 1๋ฒˆ : ์ž…๋ ฅ์— ์ œํ•œ๋‘์ง€ ์•Š๊ธฐ
      • car! ๋ž€ ๋‹จ์–ด๋„ ์ด๋ฆ„์ด ๋˜๋Š” ๋Œ€์‹  !@#$%๋„ ์ด๋ฆ„์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, ์ž…๋ ฅ์— ์ œํ•œ์„ ๋‘์ง€ ์•Š์œผ๋ฉด String์ด ์œ ๋‹ˆ์ฝ”๋“œ์˜ ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ์ง€์›ํ•œ๋‹ค ํ•˜๋”๋ผ๋„ ์–˜๊ธฐ์น˜ ๋ชปํ•œ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ฒจ ํ”„๋กœ๊ทธ๋žจ์— ๋ฒ„๊ทธ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์ด๋กœ ์ธํ•ด ๋ฒ„๊ทธ๊ฐ€ ์ƒ๊ฒจ ์‚ฌ์šฉ์ž ์ปดํ“จํ„ฐ์—๊ฒŒ ์•…์˜ํ–˜์„ ๋ผ์น  ์ˆ˜ ๋„ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ ์ƒ๊ฐํ•˜๊ธฐ
    • 2๋ฒˆ : ์ด๋ฆ„์— ์ œํ•œ ๋‘๊ธฐ
      • ์‚ฌ์šฉ์ž๋Š” "์ด๋ฆ„์€ ์‰ผํ‘œ(,) ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„" ์ด๋ž€ ๊ฒŒ์ž„ ์‹œ์ž‘ ๋ฌธ๊ตฌ ๋•Œ๋ฌธ์— "ํŠน์ˆ˜ ๊ธฐํ˜ธ๋„ ํฌํ•จ ๋˜๋Š”๊ตฌ๋‚˜" ๋ผ๊ณ  ์ƒ๊ฐํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ํŠน์ˆ˜๊ธฐํ˜ธ๋ฅผ ํฌํ•จํ•œ ์ด๋ฆ„์„ ์ •์˜ํ•˜๋ฉด ์‚ฌ์šฉ์ž๋Š” ์˜ค๋ฅ˜๋ฅผ ๋งž์ดํ•œ๋‹ค. car! ๋ผ๊ณ  ์ž…๋ ฅํ•˜๋ฉด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋กœ [์˜๋ฌธ์ž,ํ•œ๊ธ€๋กœ๋งŒ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”] ๋ฅผ ํ‘œํ˜„ํ•˜๊ณ , ์‚ฌ์šฉ์ž์—๊ฒŒ "๋ญ์•ผ, ๋ฏธ๋ฆฌ ๋ง์„ ํ•ด ์ฃผ๋˜๊ฐ€" ๋ผ๋Š” ๋ฐ˜์‘์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. 
        • GPT๋ฅผ ์ด์šฉํ•ด ์˜๋ฌธ์ž์™€ ํ•œ๊ธ€๋กœ๋งŒ ์ž…๋ ฅ์„ ๋ฐ›๋Š” ์ •๊ทœ์‹์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ์ •๊ทœ์‹ ํ•™์Šต!
    • ๊ฒฐ๋ก  : 1๋ฒˆ์ด ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ํ”„๋กœ๊ทธ๋žจ์ด๋ผ ์ƒ๊ฐํ•ด์„œ ์˜๋ฌธ์ž,ํ•œ๊ธ€๋กœ๋งŒ ์ด๋ฆ„์„ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด๋†จ๋‹ค. ๋‹ค๋งŒ, ๊ธฐํš์ž์™€ ์†Œํ†ตํ•œ๋‹ค๋ฉด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜๋ฅผ ์ž˜ ๋ถ„๋ฆฌํ•ด๋†“๊ธฐ! (ํ”„๋ฆฌ์ฝ”์Šค์—์„œ๋Š” ๊ธฐํš์ž๋Š” ์šฐํ…Œ์ฝ”๋ผ ์•„์‰ฝ๊ฒŒ๋„ ์†Œํ†ตํ• ์ˆ˜ ์—†๋‹ค..)
  • ๋์ด ์‰ผํ‘œ(,) ๋กœ ๋๋‚˜๋ฉด ์˜ˆ์™ธ์ฒ˜๋ฆฌ! 
  • ์ด๋ฆ„์ด ์ค‘๋ณต๋˜๋ฉด ์˜ˆ์™ธ์ฒ˜๋ฆฌ! → ์šฐ์Šน์ž๋ฅผ ์ถœ๋ ฅํ•  ๋•Œ ํ—ท๊ฐˆ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ

2. ์‚ฌ์šฉ์ž๋Š” ์ž๋™์ฐจ์˜ ์ด๋™ํ•  ํšŸ์ˆ˜๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค

  • ์ด๋™ ํšŸ์ˆ˜๋ฅผ int๋กœ ์ œํ•œํ•ด์„œ ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ฉด ์˜ˆ์™ธ์ฒ˜๋ฆฌ! 
  • int ์ค‘์—์„œ 0๊ณผ ์Œ์ˆ˜๋ฉด ์˜ˆ์™ธ์ฒ˜๋ฆฌ (0์ด๋ฉด ๊ฒฝ์ฃผ๋ž€ ๋œป์— ์œ„๋ฐ˜๋˜๊ธฐ ๋•Œ๋ฌธ)
  • ์˜ˆ์™ธ์ฒ˜๋ฆฌ ๋ฉ”์‹œ์ง€๋ฅผ "1์ด์ƒ์˜ ์ž์—ฐ์ˆ˜๋กœ ์ž…๋ ฅํ•˜์„ธ์š”"๋กœ ํ•œ๋‹ค๋ฉด 50์–ต๋„ 1์ด์ƒ ์ž์—ฐ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜์ง€๋งŒ intํ˜•์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜์„œ ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚ค๊ณ , ์ด๋Š” ์‚ฌ์šฉ์ž์—๊ฒ ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค ์ƒ๊ฐํ•จ. ๊ทธ๋ž˜์„œ, 20์–ต ์ด์ƒ์˜ ์ž…๋ ฅ ์ด์ƒ์˜ ์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•˜๋ฉด "20์–ต ์ดํ•˜์˜ ์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”"๋ž€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ.(์ž๋™์ฐจ 2๋Œ€๊ฐ€ 30๋ฒˆ๋งŒ ์›€์ง์—ฌ๋„ 20์–ต์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— ํ™•๋ฅ ๊ณผ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‹ค ๊ณ„์‚ฐํ•ด์„œ ์ž…๋ ฅ๋ฐ›์„ ์ˆ˜๋ฅผ ์ œํ•œํ• ๊นŒ ์ƒ๊ฐ๋„ ํ–ˆ๋‹ค..ใ…Ž)
  • ๊ฒฐ๋ก  : ์‚ฌ์šฉ์ž๊ฐ€ 1~20์–ต ์‚ฌ์ด์˜ ์ˆซ์ž๋ฅผ ์ž…๋ ฅ๋ฐ›๊ฒŒ ํ•˜์ž

๊ทธ๋ ‡๊ฒŒ ์˜ˆ์™ธ์‚ฌํ•ญ์„ ๋งŒ๋“ค์—ˆ๋‹ค.

consistOfEnglishKoreanComma(input); // ์ž…๋ ฅ์€ ์˜๋ฌธ์ž,ํ•œ๊ธ€,์‰ผํ‘œ๋งŒ ๊ฐ€๋Šฅ
endWithsNotComma(input);            // ์ž…๋ ฅ์˜ ๋์€ ์‰ผํ‘œ๊ฐ€ ์˜ฌ ์ˆ˜ ์—†๋‹ค.
checkCarNameLength(carNames);       // ์ž๋™์ฐจ ์ด๋ฆ„์€ 1~5์ž์ด๋‹ค.
checkCarNameCounting(carNames);     // ์ž๋™์ฐจ ์ด๋ฆ„์€ ์ตœ์†Œ 2๊ฐœ์—ฌ์•ผ ํ•œ๋‹ค.
checkCarNameDuplicated(carNames);   // ์ž๋™์ฐจ ์ด๋ฆ„์€ ์ค‘๋ณต๋˜๋ฉด ์•ˆ๋œ๋‹ค
validateMovingNumber                // ์ด๋™ํšŸ์ˆ˜๋กœ ์ˆซ์ž๋งŒ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
checkMinMovingNumber(movingNumber); // ๊ฒฝ์ฃผ์— ์•Œ๋งž๊ฒŒ ์ตœ์†Œ ์ด๋™ํšŸ์ˆ˜๋Š” 1๋ฒˆ์ด๋‹ค.
checkMaxMovingNumber(movingNumber); // intํ˜• ๋ฒ”์œ„๋Š” ๋„˜์–ด๊ฐ€์ง€ ์•Š๋„๋ก ์ตœ๋Œ€ ์ด๋™ํšŸ์ˆ˜๋Š” 20์–ต์ด๋‹ค.

 

๊ทธ๋ฆฌ๊ณ , ์˜ˆ์™ธ์‚ฌํ•ญ์ด ๋งŽ์€ ๋งŒํผ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ˜ผ๋™์„ ์ฃผ์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์ •ํ™•ํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋  ์ˆ˜ ์žˆ๋„๋ก ๋…ธ๋ ฅํ–ˆ๋‹ค.

๊ฒฐ๊ตญ "์ž๋™์ฐจ ๊ฒฝ์ฃผ ๊ฒŒ์ž„์˜ ๋ชฉ์ ", "์‚ฌ์šฉ์ž์˜ ์ž…์žฅ", "์š”๊ตฌ์‚ฌํ•ญ์˜ ๋ณ€๊ฒฝ", "์‹œ์Šคํ…œ์˜ ์•ˆ์ •์„ฑ"์„ ์ข…ํ•ฉ์ ์œผ๋กœ ์ถฉ๋ถ„ํžˆ ๊ณ ๋ คํ•˜๊ณ ์ž ํ–ˆ๋‹ค.

์ด ๊ฒฝํ—˜์„ ํ†ตํ•ด ์ข‹์€ ํ”„๋กœ๊ทธ๋žจ์ด๊ธฐ ์œ„ํ•œ ์ตœ์†Œ ์กฐ๊ฑด์€ "๋‹ค์–‘ํ•œ ์‹œ๊ฐ์—์„œ ๋ฐ”๋ผ๋ณด๊ธฐ" ๋ผ๊ณ  ์กฐ์‹ฌ์Šค๋ ˆ ์ƒ๊ฐํ•ด๋ณธ๋‹ค. 

 

1์ฃผ์ฐจ์—๋Š” ์ด๋Ÿฌํ•œ ์‹œ๊ฐ๋“ค๋กœ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ฐ”๋ผ๋ณด์ง€ ๋ชปํ•œ๊ฒŒ ๋„ˆ๋ฌด ์•„์‰ฝ๋‹ค. (์ด๋ ‡๊ฒŒ๊นŒ์ง€ ๊ณ ๋ฏผ์„ ํ•˜๋‹ˆ 1์ฃผ์ฐจ์— ๋†“์นœ ์˜ˆ์™ธ์‚ฌํ•ญ๋“ค์ด ์žˆ๋Š” ๊ฒƒ๋„ ์•Œ๊ฒŒ๋จ..ใ… )

๊ทธ๋ž˜๋„ ์ด์ œ ํ”„๋ฆฌ์ฝ”์Šค ๊ณผ์ œ๋ฅผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๊ณ , ์ž‘์€ ํ”„๋กœ๊ทธ๋žจ์ด์ง€๋งŒ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ์ข‹์€ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค๊ณ ์ž ๋…ธ๋ ฅํ•˜๊ธฐ! ๋ฅผ ์ƒ๊ฐํ•˜๋ฉฐ ํ”„๋ฆฌ์ฝ”์Šค์— ์ž„ํ•˜๊ฒ ๋‹ค.๐Ÿ˜

โœ… ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์„ ์œ„ํ•œ AssertJ ํ•™์Šต

์ผ๋‹จ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ต์ˆ™ํ•ด ์ง€๊ณ ์ž AssertJ ๋ฉ”์„œ๋“œ๋ฅผ ํ•™์Šตํ–ˆ๋‹ค.

 

ํ•™์Šตํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ด์šฉํ•˜๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ๋ฉ”์„œ๋“œ์ด๋ฆ„ ์ž์ฒด๋ฅผ ๋ชฐ๋ผ์„œ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐพ๋Š”๋ฐ ์–ด๋ ค์›€์ด ๋งŽ์•˜๋‹ค.

๋ฌผ๋ก , ๊ณต์‹๋ฌธ์„œ๊ฐ€ ๋‹ค ์˜์–ด๋กœ ๋˜์–ด์žˆ์–ด์„œ ํ•œ์ฐธ์„ ๊ตฌ๊ฒฝํ•˜๊ณ  ํ—ค๋งธ๋‹ค..ใ…Ž

 

๋” ์ด์ƒ ์‹œ๊ฐ„์„ ์ง€์ฒดํ•  ์ˆ˜ ์—†์–ด์„œ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•™์Šตํ–ˆ๋‹ค.

1. ํ”„๋กœ๊ทธ๋žจ์— ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š” [External Libraries]์˜ assertJ ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉ

2. ์ธํ…”๋ฆฌ์ œ์ด์—์„œ .์„ ์ฐ์œผ๋ฉด ๋‚˜์˜ค๋Š” ์ž๋™์™„์„ฑ๊ธฐ๋Šฅ์œผ๋กœ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด๊ธฐ

3. ๊ตฌ๊ธ€๋งํ•˜๊ธฐ

 

*๊ณต์‹๋ฌธ์„œ๋กœ ๋ชจ๋ฅด๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฐพ๋Š”์ง€ ์•„์‹œ๋Š”๋ถ„ ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ฆผ๋‹ˆ๋‹ค..

โœ… ๊ธฐ๋Šฅ๋งˆ๋‹ค ์ปค๋ฐ‹ํ•˜๊ธฐ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์„ ์œ„ํ•œ ๋‚˜๋งŒ์˜ ๋ฃจํ‹ด 

๊ตฌํ˜„ํ•˜๋ฉด์„œ  ๊ธฐ๋Šฅ๋งˆ๋‹ค ์ปค๋ฐ‹ํ•˜๊ณ , ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์„ ์ฒ˜์Œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋งŒ์˜ ๋ฃจํ‹ด์„ ๋จผ์ € ์„ธ์› ๋‹ค.

๋‚˜์˜ ๋ฃจํ‹ด์€ 1์ฃผ์ฐจ์— ๋Š๋‚€๋Œ€๋กœ " ๊ตฌํ˜„ → ์ปค๋ฐ‹ → ํ…Œ์ŠคํŠธ ์ฝ”๋“œ → ์ปค๋ฐ‹"  ์ˆœ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ ์ž ํ–ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์‹คํŒจํ•˜๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์งœ๋Š”๋ฐ ์–ด๋ ค์›€์ด ์žˆ์„ ๋•Œ๋ฉด, ์ปค๋ฐ‹ํ–ˆ๋˜ ๊ตฌํ˜„ ๋กœ์ง์„ ์ˆ˜์ •ํ•˜๊ณ , ๋‹ค์‹œ ์ปค๋ฐ‹ํ•ด์•ผํ–ˆ๋‹ค.

์ด๋กœ ์ธํ•ด ์ปค๋ฐ‹ ์ˆœ์„œ๋„ ์—‰ํ‚ค๊ณ , ์ถ”๊ฐ€ ์ปค๋ฐ‹์— ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋˜์„œ 2์ฃผ์ฐจ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์ˆœ์„œ๋ฅผ ๋ฐ”๊ฟจ๋‹ค.

"๊ตฌํ˜„ → ํ…Œ์ŠคํŠธ ์ฝ”๋“œ → ์ปค๋ฐ‹ → ์ปค๋ฐ‹" ์ด๋‹ค. ์ด ์ˆœ์„œ๋กœ ์•ž์œผ๋กœ 3์ฃผ์ฐจ์— ์ž„ํ•ด๋ณด๊ฒ ๋‹ค!

โœ… public ์€ ์ง์ ‘ ํ…Œ์ŠคํŠธ, private ์€ ๊ฐ„์ ‘ ํ…Œ์ŠคํŠธ 

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์งœ๋‹ค๋ณด๋ฉด public ๋ฉ”์„œ๋“œ์™€ private ๋ฉ”์„œ๋“œ๋“ค์„ ๋ชจ๋‘ ํ…Œ์ŠคํŠธ ํ•ด์•ผ ํ• ๊นŒ? ๋ผ๋Š” ๊ณ ๋ฏผ์ด ์ƒ๊ธฐ๋Š”๋ฐ ์‰ฝ๊ฒŒ ๊ฒฐ๋ก ์„ ๋‚ด๋ ธ๋‹ค.

๋‚˜๋Š” public ๋ฉ”์„œ๋“œ๊ฐ€ ๊ฐ์ฒด์—๊ฒŒ ๋ถ€์—ฌ๋œ ์ฑ…์ž„์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๊ณ , private ๋ฉ”์„œ๋“œ๋Š” public ๋ฉ”์„œ๋“œ์˜ ๋กœ์ง์— ๋„์›€์„ ์ฃผ๋Š” ๋ฉ”์„œ๋“œ๋ผ ์ƒ๊ฐํ•œ๋‹ค.

์ฆ‰, private ๋ฉ”์„œ๋“œ๋Š” public ๋ฉ”์„œ๋“œ๋ฅผ ์œ„ํ•ด ์กด์žฌํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

 

๊ทธ๋ž˜์„œ, ๋‚˜๋Š” public ๋ฉ”์„œ๋“œ๋งŒ์„ ์ง์ ‘ ํ…Œ์ŠคํŠธ ํ–ˆ๋‹ค.

private ํ‚ค์›Œ๋“œ๋ฅผ ์“ฐ๋Š” ์ด์œ ๋Š” ์บก์Šํ™”ํ•˜๊ธฐ ์œ„ํ•จ์ธ๋ฐ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๋…ธ์ถœ์‹œํ‚ค๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ผ ์ƒ๊ฐํ•œ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜, private ํ•จ์ˆ˜๋ฅผ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•  ์ƒํ™ฉ์ด ์˜จ๋‹ค.

์•„๋ž˜์ฒ˜๋Ÿผ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ์ž˜ ๋˜์—ˆ๋Š”์ง€ ํ…Œ์ŠคํŠธ ํ•  ๋•Œ๊ฐ€ private ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด์•ผ ํ•  ์ƒํ™ฉ์ด๋‹ค.

 

๋‚˜๋Š” private์„ ๊ฐ„์ ‘์ ์œผ๋กœ ํ…Œ์ŠคํŠธ ํ–ˆ๋‹ค.

ํ•œ ๊ฐœ์˜ public๋ฉ”์„œ๋“œ ์•ˆ์— ์„œ๋กœ ๋‹ค๋ฅธ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” 3๊ฐœ์˜ private๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋‹ค. 

public void validateCarNames(List<String> carNames) {
    checkCarNameLength(carNames);     // privateํ•จ์ˆ˜
    checkCarNameCounting(carNames);   // privateํ•จ์ˆ˜
    checkCarNameDuplicated(carNames); // privateํ•จ์ˆ˜
}

public๋ฉ”์„œ๋“œ๋งŒ ํ…Œ์ŠคํŠธํ•œ๋‹ค๋ฉด ์ด 3๊ฐœ ์ค‘์˜ ์–ด๋–ค ํ•จ์ˆ˜์—์„œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ–ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฉ”์‹œ์ง€๋ฅผ ํ•จ๊ป˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ๋ถ™์—ฌ์ฃผ์—ˆ๋‹ค.

public ๋ฉ”์„œ๋“œ์ธ validateCarNames ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๊ณ , private ๋ฉ”์„œ๋“œ๋“ค์€ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  hasMessage ๋กœ๋งŒ ํ™•์ธํ•˜์—ฌ ๊ฐ„์ ‘ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค.

@Test
void validateCarNames_์ž๋™์ฐจ์ด๋ฆ„์ด_1์ž๋ถ€ํ„ฐ_5์ž์ธ์ง€_ํ™•์ธ1() {
    List<String> invalidList = Arrays.asList("pobi", "", "์•ˆ์ข…ํ˜");

    assertThatThrownBy(() -> validator.validateCarNames(invalidList))
            .isInstanceOf(IllegalArgumentException.class)
            .hasMessage(CAR_NAME_LENGTH_ERROR);
}
    
@Test
void validateCarNames_์ž๋™์ฐจ์ด๋ฆ„์ด_2๊ฐœ์ด์ƒ์ธ์ง€_ํ™•์ธ1() {
    List<String> invalidList = Arrays.asList("pobi");

    assertThatThrownBy(() -> validator.validateCarNames(invalidList))
            .isInstanceOf(IllegalArgumentException.class)
            .hasMessage(CAR_NAME_COUNT_ERROR);
}
    
@Test
void validateCarNames_์ž๋™์ฐจ์ด๋ฆ„์ด_์ค‘๋ณต์ธ์ง€_ํ™•์ธ1() {
    List<String> invalidList = Arrays.asList("pobi", "pobi", "์ข…ํ˜");

    assertThatThrownBy(() -> validator.validateCarNames(invalidList))
            .isInstanceOf(IllegalArgumentException.class)
            .hasMessage(CAR_NAME_DUPLICATE_ERROR);
}

 

์ด๋ ‡๊ฒŒ hasMessage๋ฅผ ์ด์šฉํ•˜๋ฉด private ์„ public ์œผ๋กœ ๊ณ ์น˜์ง€ ์•Š๊ณ ๋„ private๋ฅผ ๊ฐ„์ ‘์ ์œผ๋กœ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

โœ… 2์ฃผ์ฐจ ๋ชฉํ‘œ : ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์™€ ํ•จ์ˆ˜ ๋ถ„๋ฆฌ

์•„๋ž˜๋Š” 2์ฃผ์ฐจ ๋ชฉํ‘œ์ธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์™€ ํ•จ์ˆ˜ ๋ถ„๋ฆฌ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ํ–ˆ๋˜ ์ƒ๊ฐ๋“ค์ด๋‹ค.

 

[ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ์žฅ์ ]

public ๋ฉ”์„œ๋“œ์˜ ๋‚ด๋ถ€๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด์„œ "์˜ณ๊ฒŒ ํ•จ์ˆ˜๋ฅผ ๋ถ„๋ฆฌํ–ˆ๋Š”์ง€?", "๊ฐ์ฒด์˜ ๊ฐ’์ด ์ „๋‹ฌ๋˜๊ณ  ์žˆ๋Š”์ง€?"๋ž€ ๋‘๋ ค์›€์ด ์žˆ์—ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜, public ๋ฉ”์„œ๋“œ์˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋†“๊ณ  ํ•จ์ˆ˜๋ถ„๋ฆฌ๋ฅผ ํ•  ๋•Œ๋งˆ๋‹ค ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ "๋”ธ๊น" ํ•ด์„œ ์ดˆ๋ก๋ถˆ์ด ๋“ค์–ด์˜ค๋Š” ๊ฒƒ๋งŒ ํ™•์ธํ•˜๋ฉด ํ•จ์ˆ˜๋ถ„๋ฆฌ๊ฐ€ ์ž˜ ์ง„ํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ๊ตฌํ˜„ํ•œ ๋กœ์ง์˜ ๊ฒ€์ฆ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ•จ์ˆ˜๋ถ„๋ฆฌ ๊ฐ™์€ ๋ฆฌํŒฉํ† ๋ง ํ•˜๋Š”๋ฐ์—๋„ ์ค‘์š”ํ•˜๋‹จ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

[ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋ฉด ํ•จ์ˆ˜ ๋ถ„๋ฆฌ๋ฅผ ํ•ด๋ณด์ž]

์ž…๋ ฅ๋œ String ํƒ€์ž…์˜ ์ž๋™์ฐจ์ด๋ฆ„์ด List ๋กœ ๋ณ€ํ™˜๋˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

๊ทธ๋Ÿฌ๋‚˜, ์ด ํ•จ์ˆ˜๋Š” ์ž…๋ ฅ๊ฐ’์„ ๋ฐ›๊ณ , ๋‚˜๋ˆ„๊ณ , List์— ์ถ”๊ฐ€ํ•˜๊ณ , ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ–๊ณ  ์žˆ๋‹ค.

 

์ด ํ•จ์ˆ˜์˜ ์–ด๋–ค ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธ ํ•  ๊ฑด์ง€ ๊ณ ๋ฏผ์„ ๋งŽ์ด ํ–ˆ์—ˆ๋‹ค.

์ž…๋ ฅ๊ฐ’์„ ๋“ค์–ด์™”๋Š”์ง€? ์ž…๋ ฅ๊ฐ’์ด ์ž˜ ๋‚˜๋ˆ  ์ง€๋Š”์ง€? List์— ์ž˜ ์ถ”๊ฐ€ ๋˜๋Š”์ง€? ๋ฐ˜ํ™˜์ด ์ž˜ ๋˜๋Š”์ง€?

์ถ”๊ฐ€๋กœ, ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์–ด์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ์˜ˆ์ƒ๊ฐ’๊ณผ ๊ธฐ๋Œ€๊ฐ’์กฐ์ฐจ ์ž‘์„ฑํ•˜๊ธฐ ์–ด๋ ค์› ๋‹ค. 

public List<String> inputCarNames() {
    System.out.println("๊ฒฝ์ฃผํ•  ์ž๋™์ฐจ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”.(์ด๋ฆ„์€ ์‰ผํ‘œ(,) ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„)");
    String input = Console.readLine();
    String[] carNameArray = input.split(",");
    for (String carName : carNameArray) {
        carNames.add(carName);
    }
    return carNames;
}

 

ํ•จ์ˆ˜ ๋ถ„๋ฆฌ๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ๊ฐ€ ๊น”๋”ํ•ด์กŒ๋‹ค. ๋‚ด๋ถ€ ๋กœ์ง์— ๋งž๊ฒŒ ๋ฉ”์„œ๋“œ๋ช…์„ ๋ฐ”๊ฟจ๋‹ค.(inputCarNames → createCarNames)

์ด์ œ ์ด ํ•จ์ˆ˜๋Š” ์‚ฌ์šฉ์ž์˜ input๊ฐ’์„ ๋ฐ›์•„์„œ List๋กœ ๋ณ€ํ™˜๋˜๋Š”์ง€๋ฅผ ํ™•์ธ ํ•˜๋ฉด ๋œ๋‹ค.

๋”์šฑ์ด, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ์˜ˆ์ƒ๊ฐ’๊ณผ ๊ธฐ๋Œ€๊ฐ’์„ ๋น„๊ตํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด "isEqualTo"๋งŒ์„ ์‚ฌ์šฉํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

public List<String> createCarNames(String input) {
    System.out.println("๊ฒฝ์ฃผํ•  ์ž๋™์ฐจ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”.(์ด๋ฆ„์€ ์‰ผํ‘œ(,) ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„)");
    String[] inputCarNames = split(input);
    return toList(inputCarNames);
}

[ํ•จ์ˆ˜๋ถ„๋ฆฌ๋ฅผ ์ž˜ํ•˜๋ฉด ์ฝ”๋“œ ์ฝ๊ธฐ๊ฐ€ ์‰ฌ์›Œ์ง„๋‹ค.]

ํ•จ์ˆ˜๋ถ„๋ฆฌ๋ฅผ ํ•˜๊ธฐ ์ „์—๋Š” ๋ฉ”์„œ๋“œ ์ด๋ฆ„๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋‚ด๋ถ€์—์„œ ๋งŽ์€ ์ผ๋“ค์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ์—ˆ๋‹ค. ์ฆ‰, ํ•จ์ˆ˜์˜ ์ด๋ฆ„๋งŒ ๋ด์„œ๋Š” ํ•จ์ˆ˜์˜ ๊ธฐ๋Šฅ์„ ์•Œ ์ˆ˜ ์—†์—ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, inputCarNames() ๋Š” ์ž…๋ ฅ๊ฐ’ ๋ฐ›๊ณ , ๋‚˜๋ˆ„๊ณ , List ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ๋ชจ๋“  ๋กœ์ง์„ ์ฝ์–ด์•ผ๋งŒ ํ•จ์ˆ˜์˜ ๊ธฐ๋Šฅ์„ ์•Œ ์ˆ˜๊ฐ€ ์žˆ์—ˆ๊ณ , ์ด๋Š” ๋ฉ”์„œ๋“œ ์ด๋ฆ„๊ณผ๋„ ์–ด์šธ๋ฆฌ์ง€ ์•Š์•˜๋‹ค.

๊ทธ๋Ÿฌ๋‚˜, ํ•จ์ˆ˜๋ถ„๋ฆฌ๋ฅผ ์ง„ํ–‰ํ•˜์ž ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„๋งŒ ๋ณด๊ณ , ๋‚ด๋ถ€๋ฅผ ์ฝ์ง€ ์•Š๊ณ  return๊ฐ’๋งŒ ๋ด๋„ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฌด์Šจ ๊ธฐ๋Šฅ์ธ์ง€ ์‰ฝ๊ฒŒ ๋ˆˆ์— ๋“ค์–ด์™”๋‹ค.

ํŠนํžˆ, ํ•จ์ˆ˜๋ถ„๋ฆฌ๊ฐ€ ์ž˜๋˜์ž ์ฝ”๋“œ๊ฐ€ ์˜์–ด ์ง€๋ฌธ์„ ์ฝ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ž˜ ์ฝํ˜”๋‹ค.

๊ฐ€๋…์„ฑ์ด ์—„์ฒญ ํ–ฅ์ƒ๋จ์„ ๋Š๊ผˆ๊ณ , private ์€ ์„ ํƒ์ ์œผ๋กœ ์ฝ๋Š” ๋ฉ”์„œ๋“œ๋ž€ ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

์ด๋Š” ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์„ ๋•Œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋„์›€์ด ๋  ๊ฒƒ์ด๊ณ , ๋‚˜๋„ ์‚ฌ๋žŒ๋“ค์˜ ์ฝ”๋“œ๋“ค ์ค‘ public ๋งŒ ์ฝ์Œ์œผ๋กœ์จ ํ๋ฆ„์„ ์žก์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค!!

โœ… pushํ•œ ์ปค๋ฐ‹ ๋˜๋Œ๋ฆฌ๊ธฐ

๊ธฐ๋Šฅ๋งˆ๋‹ค ์ปค๋ฐ‹ํ•˜๊ณ , ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์— ์ต์ˆ™ํ•ด์ง€๊ธฐ ์œ„ํ•ด 2์ฃผ์ฐจ ๊ณผ์ œ๋ฅผ 2๋ฒˆ ๊ตฌํ˜„ํ–ˆ์—ˆ๋‹ค.

 

์ฒซ ๋ฒˆ์งธ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ ๊ธฐ๋Šฅ๋งˆ๋‹ค ์ปค๋ฐ‹ํ•˜๋Š” ๊ฒƒ์ด ์ต์ˆ™์น˜ ์•Š์•„์„œ ๋‚ด ๋ง˜๋Œ€๋กœ ์ปค๋ฐ‹์„ ํ•˜๊ณค ํ–ˆ๋‹ค.

๋’ค์ฃฝ๋ฐ•์ฃฝ์œผ๋กœ ๋ณด๋ƒˆ๋˜ ์ปค๋ฐ‹์„ ๋˜๋Œ๋ฆฌ๊ธฐ ์œ„ํ•ด, ํฌํฌ๋ฅผ ์ƒˆ๋กœํ•˜๊ณ  ๊นƒ์„ ํด๋ก ํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ์ƒˆ๋กœ์šด git ๋ช…๋ น์–ด์ธ reset ์„ ํ•™์Šตํ–ˆ๋‹ค.

 

reset ์€ ์• ์ดˆ์— ์ปค๋ฐ‹์„ ํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ, reset ๋ช…๋ น์–ด๋Š” ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊ณ ์ณ์“ด๋‹ค๋Š” ์  ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์‚ฌ์šฉํ•˜๋Š” remote ๋ธŒ๋žœ์น˜์—์„œ๋Š” ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

reset ๋ช…๋ น์–ด๋Š” ํ”„๋ฆฌ์ฝ”์Šค ๊ณผ์ œ์™€ ๊ฐ™์ด ๋‚˜ ํ˜ผ์ž ์ž‘์—…ํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ!

 

reset ๋ช…๋ น์–ด๊ฐ€ ์ž˜ ์ž‘๋™ํ•˜๋Š” ์ง€ ์•Œ๊ธฐ ์œ„ํ•ด ์ง€๊ธˆ๊ป ์ปค๋ฐ‹ํ•œ ๊ธฐ๋ก์„ ๋ณด์—ฌ์ฃผ๋Š” ๋ช…๋ น์–ด์ธ git log ๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

  • git log --oneline : ์ง€๊ธˆ๊นŒ์ง€ ์ปค๋ฐ‹ํ•œ ๋‚ด์šฉ์„ ๋ณด์—ฌ์ฃผ๋Š” git ๋ช…๋ น์–ด

git log ์— ์˜ํ•ด ์ตœ๊ทผ ์ปค๋ฐ‹ํ•œ ์ˆœ์œผ๋กœ feat์™€ docs๊ฐ€ ๋‚˜์˜ค๋Š” ๋ชจ์Šต

git log --oneline ์„ ํ†ตํ•ด feat ์™€ docs๋กœ ์ปค๋ฐ‹์ด ๋˜์–ด ์žˆ์Œ์„ ํ™•์ธํ–ˆ๋‹ค.

 

reset ์„ ํ†ตํ•ด ์ปค๋ฐ‹์„ ์‚ญ์ œํ•ด ๋ณด์ž. 

  • git reset HEAD~n : HEAD ๊ธฐ์ค€์œผ๋กœ n๊ฐœ ๋งŒํผ ๋˜๋Œ๋ฆฌ๊ธฐ

HEAD๊ฐ€ ์žˆ๋Š” ์ปค๋ฐ‹์—์„œ 1๊ฐœ ์‚ญ์ œํ•˜๊ธฐ

๊ทธ๋ฆฌ๊ณ , git log --oneline์„ ํ†ตํ•ด ์ปค๋ฐ‹ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ด์„œ ์ปค๋ฐ‹์ด ์ž˜ ์ง€์›Œ์ ธ ์žˆ๋Š”์ง€ ํ™•์ธ๊นŒ์ง€!

feat: ์ž๋™์ฐจ๊ฐ€ ์ด๋™ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ๋ž€ ์ปค๋ฐ‹์ด ์ง€์›Œ์กŒ๋‹ค.

 

ํ•˜์ง€๋งŒ, ์›๊ฒฉ ์ €์žฅ์†Œ์ธ ๊นƒ ํ—ˆ๋ธŒ์—๋Š” ์‚ญ์ œ ์ปค๋ฐ‹์ด ๋ฐ˜์˜๋˜์ง€ ์•Š์•˜๋‹ค.

์›๊ฒฉ ์ €์žฅ์†Œ์—๋„ ๋˜‘๊ฐ™์ด ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ git ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

  • git push -f origin [๋ธŒ๋žœ์น˜์ด๋ฆ„] : ์›๊ฒฉ ์ €์žฅ์†Œ์— ํŠน์ • ๋ธŒ๋žœ์น˜์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๊ฐ•์ œ๋กœ(push --force) ํ‘ธ์‹œ(push)ํ•˜๋Š” ๋ช…๋ น์–ด

jonghyeok-97 ๋ธŒ๋žœ์น˜์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ์›๊ฒฉ ์ €์žฅ์†Œ์— ๊ฐ•์ œ๋กœ ํ‘ธ์‹œํ•˜๋Š” ๋ช…๋ น์–ด

โœ… ์•„์‰ฌ์›€

[๊ฐ์ฒด์ง€ํ–ฅ๋Š” ๋งŒ๋งŒํ•˜์ง€ ์•Š์•˜๋‹ค]

์ •๋ง .. ๊ฐ์ฒด์ง€ํ–ฅ์€ ๋งŒ๋งŒํ•˜์ง€ ์•Š์•˜๋‹ค.. 1์ฃผ์ฐจ์— ๊นจ๋‹ฌ์Œ์„ ์–ป๊ณ  2์ฃผ์ฐจ์— ์ž˜ ์ ์šฉํ•˜์ž ๋‹ค์งํ–ˆ์ง€๋งŒ ์–ด๋ฆผ๋„ ์—†์—ˆ๋‹ค..

 

๋‹ค์Œ์€ ๋‚ด ์ฝ”๋“œ์ด๋‹ค.

Game๊ฐ์ฒด๊ฐ€ User๊ฐ์ฒด์—๊ฒŒ ์ž…๋ ฅ๊ฐ’์„ ์ž…๋ ฅํ•˜๋ผ๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ณ  ์–ป์€ ๊ฐ’์„ List ์— ๋ณด๊ด€ํ•˜๊ณ  ์žˆ๋‹ค.

public class Game {
    Private User user;
    
    public void start() {
        List<String> carNames = user.InputCarNames();
    }
}

 

...

User ๊ฐ์ฒด์˜ ์ƒํƒœ์ธ private List<String>์ด Game๊ฐ์ฒด์— ๋“œ๋Ÿฌ๋‚ฌ๋‹ค... ์ƒํƒœ๋ฅผ private ์œผ๋กœ ์„ค์ •๋งŒ ํ•œ๋‹ค๊ณ  ์บก์Šํ™”๊ฐ€ ์ง€์ผœ์ง€๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์—ˆ๋‹ค.

์–ธ์ œ๋“  carNames ๋Š” ๋ณ€๊ฒฝ๋  ์œ„ํ—˜์ด ์žˆ์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ, ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์บก์Šํ™”๋ฅผ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ์„์ง€ ๋งŽ์€ ๊ณ ๋ฏผ์„ ํ–ˆ๋‹ค.

 

์ด ์ค‘, ImmutableCollections(๋ถˆ๋ณ€ ์ปฌ๋ ‰์…˜)์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

๋ถˆ๋ณ€ ์ปฌ๋ ‰์…˜์ด๋ž€ ์ปฌ๋ ‰์…˜์˜ ๋‚ด๋ถ€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •(add, remove, sort ...๋“ฑ)์„ ํ•˜๋ฉด UnsupportedOperationException ์˜ˆ์™ธ๊ฐ€ ์ผ์–ด๋‚˜๊ฒŒ ํ•˜๋Š” ์ปฌ๋ ‰์…˜์ด๋‹ค.

 static abstract class AbstractImmutableList<E> extends AbstractImmutableCollection<E>
            implements List<E>, RandomAccess {

        // all mutating methods throw UnsupportedOperationException
        @Override public void    add(int index, E element) { throw uoe(); }
        @Override public boolean addAll(int index, Collection<? extends E> c) { throw uoe(); }
        @Override public E       remove(int index) { throw uoe(); }
        @Override public void    replaceAll(UnaryOperator<E> operator) { throw uoe(); }
        @Override public E       set(int index, E element) { throw uoe(); }
        @Override public void    sort(Comparator<? super E> c) { throw uoe(); }
...

๊ทธ๋ž˜์„œ, ๋‚˜์˜ carNames ์˜ ๋ณ€๊ฒฝ์„ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ ๋ถˆ๋ณ€ ์ปฌ๋ ‰์…˜์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ์ด ๋ถˆ๋ณ€ ์ปฌ๋ ‰์…˜์˜ ์‚ฌ์šฉ ์šฉ๋„๋Š” ๊ฐ’์„ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด ์ƒํƒœ๋ฅผ ๊ฐ์ฒด์—์„œ ๊บผ๋‚ด์•ผ ํ•  ๋•Œ!! ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

๋‚ด๊ฐ€ carNames ๋ž€ ์ƒํƒœ๋ฅผ API์— ๋“œ๋Ÿฌ๋‚ธ ์ด์œ ๋Š” ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ์˜€๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด ๋ฌธ์ œ์— ๋ถˆ๋ณ€ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋‹จ์ง€ ์ž„์‹œ๋ฐฉํŽธ์ด๋ผ ์ƒ๊ฐํ•ด์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋‹ค.

 

๊ทผ๋ณธ์ ์ธ ์›์ธ์„ ์ฐพ๊ณ  ์‹ถ์—ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜,, ๋งŽ์€ ์‹œ๊ฐ„์„ ์‹œ๊ฐ„์„ ํˆฌ์žํ–ˆ์ง€๋งŒ ๊ฒฐ๊ตญ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ด์„œ ๋„ˆ๋ฌด ์•„์‰ฌ์› ๋‹ค.

 

User ๊ฐ€ ์ž…๋ ฅ์„ ๋ฐ›์„ ์ฑ…์ž„๊ณผ Car๋ฅผ ์ด๋™์‹œํ‚ฌ ์ฑ…์ž„์ด ์žˆ๋Š”์ง€, ์•„๋‹ˆ๋ฉด ๋‚˜์ฒ˜๋Ÿผ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š”๋ฐ ํŠน์ • ๋ฐฉ์‹์ด ๋”ฐ๋กœ ์žˆ๋Š” ๊ฑด์ง€ ๊ณ ๋ฏผํ•˜๋ฉฐ ๊ฐ์ฒด ์„ค๊ณ„๋ฅผ ์ž˜ํ•˜๊ธฐ ์œ„ํ•ด ๊พธ์ค€ํžˆ ๊ณ ๋ฏผํ•ด์•ผ๊ฒ ๋‹ค.

๐Ÿ˜Š๋งˆ์น˜๋ฉฐ

2์ฃผ์ฐจ ์ค‘๊ฐ„์—๋Š” ์ฝ”๋“œ์— ์ง„์ „์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์•„ ์Šค์Šค๋กœ์—๊ฒŒ ์‹ค๋ง๋„ ํ–ˆ์—ˆ์ง€๋งŒ, ๊ธฐ๋ก์„ ํ†ตํ•ด ๊ฝค ๋งŽ์ด ๋…ธ๋ ฅํ•œ๊ฑธ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค๐Ÿ˜๐Ÿ˜๐Ÿ˜

์‚ฝ์งˆ์„ ํ•œ๋งŒํผ ๋‹ค์Œ ๋ฒˆ์—๋Š” ์‚ฝ์งˆ์„ ์•ˆํ•  ํ…Œ๋‹ˆ๊นŒ!!

 

  • ์ •๊ทœ์‹ํ•™์Šต
  • AssertJํ•จ์ˆ˜ ํ•™์Šต, ๊ณต์‹๋ฌธ์„œ์—์„œ ํ•จ์ˆ˜ ์ฐพ๊ธฐ
  • ํ•จ์ˆ˜๋ถ„๋ฆฌ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ
  • 1์ฃผ์ฐจ ๊ณต๋™ ํ”ผ๋“œ๋ฐฑ ํ•™์Šต
  • ๋ถˆ๋ณ€์ปฌ๋ ‰์…˜
  • ์š”๊ตฌ์‚ฌํ•ญ์„ ๋Œ€ํ•˜๋Š” ์ž์„ธ

๋‹ค๋งŒ 2์ฃผ์ฐจ๊ฐ€ ๋๋‚˜๊ณ ๋Š” ๊ตฌํ˜„ํ•œ ๊ธฐ๋Šฅ๋งˆ๋‹ค ์ปค๋ฐ‹ํ•˜๊ณ , ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ๊ณผ ํ•จ์ˆ˜๋ถ„๋ฆฌ์— ์ต์ˆ™ํ•ด์ง€๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ์ด๋ฃจ์ง€ ๋ชปํ•ด ์•„์‰ฝ๋‹ค.

 

์˜ค๋Š˜๋„ 3์ฃผ์ฐจ์— ์˜์‹์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์ง์„ ํ•ด๋ณธ๋‹ค.

"์™œ ์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฑฐ์•ผ?" ๋ฅผ ์˜์‹์ ์œผ๋กœ ์ž๋ฌธํ•˜๊ธฐ

 

๋งˆ์ง€๋ง‰์œผ๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ๋Œ€ํ•ด ํ•™์Šตํ•˜๋ฉฐ ์ฝ์—ˆ๋˜ ์ฑ… ์ค‘ ์ธ์ƒ ๊นŠ์—ˆ๋˜ ๋ง์„ ์ ์œผ๋ฉฐ 2์ฃผ์ฐจ๋„ ๋!

์ฝ”๋“œ๋ฅผ ๋‹ค ์ž‘์„ฑํ•˜๊ณ  ๋‚˜์„œ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋ฉด ์•ˆ๋œ๋‹ค.
์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ '์–ด๋–ป๊ฒŒ ํ…Œ์ŠคํŠธ๋ฅผ ํ•  ๊ฒƒ์ธ๊ฐ€?'๋ฅผ ์ž๋ฌธํ•˜๊ธฐ
p. 23 ไธญ ์ข‹์€ ์ฝ”๋“œ, ๋‚˜์œ ์ฝ”๋“œ