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

๐Ÿ“š์ฝ์€ ์ฑ… ์ •๋ฆฌ/์ž๋ฐ” ๋งˆ์Šคํ„ฐ๋ถ

[์ž๋ฐ” ๋งˆ์Šคํ„ฐ๋ถ] 10์žฅ ๊ฐ์ฒด์ง€ํ–ฅ ์ฆ๊ธฐ๊ธฐ

10.1 ๊ธฐ๋ณธํ˜•๊ณผ ์ฐธ์กฐํ˜•์˜ ๊ฐ’ ์ „๋‹ฌํ•˜๊ธฐ

10.1.1 ๊ธฐ๋ณธํ˜•๊ณผ ์ฐธ์กฐํ˜•์˜ ๊ฐ’ ์ „๋‹ฌ ๋ฐฉ๋ฒ•

๊ธฐ๋ณธํ˜•์œผ๋กœ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ˆ˜์‹ ์ž์—์„œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด๋„ ํ˜ธ์ถœ์ž์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ๋ชปํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์ฐธ์กฐํ˜•์˜ ๊ฐ’ ์ „๋‹ฌ์„ ํ•˜๋ฉด ์ˆ˜์‹ ์ž ์•ˆ์—์„œ ๋ณ€๊ฒฝ๋œ ๊ฐ’์ด ํ˜ธ์ถœ์— ๋ฐ˜์˜๋œ๋‹ค.

 

"์ฐธ์กฐํ˜•"์˜ ๊ฒฝ์šฐ๋Š” ๊ฐ์ฒด ์ž์ฒด์˜ ๊ฐ’์„ ๋ณต์‚ฌํ•ด์„œ ๋„˜๊ธฐ๋Š” ๊ฒƒ์ด ์•„๋‹Œ '์ฐธ์กฐ'๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ํ˜ธ์ถœ๋œ ๋ฉ”์„œ๋“œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํ˜ธ์ถœ์ž์—๊ฒŒ ๋ฐ˜์˜๋œ๋‹ค.

 

๋”ฐ๋ผ์„œ, ์ธ์ˆ˜์— ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ–ˆ์„ ๋•Œ๋Š” ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ ๊ฐ’์ด ๋ณ€ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์—ฌ๋ถ€๋ฅผ ๋ช…ํ™•ํžˆ ํ•ด์•ผ๋งŒ ํ•œ๋‹ค.

์ฑ…์˜ ์ €์ž๋Š” ์ด๋ฅผ ์œ„ํ•ด ๊ทœ์น™์„ ์ •ํ•ด๋‘์—ˆ๋‹ค.

 

  • ์›์น™์ ์œผ๋กœ ์ธ์ˆ˜ ๊ฐ์ฒด์˜ ์ˆ˜์ •์€ ํ”ผํ•œ๋‹ค.
  • ๋ฐ˜ํ™˜๊ฐ’์ด void์ธ ๊ฒฝ์šฐ ์ธ์ˆ˜๊ฐ์ฒด๋ฅผ ์ˆ˜์ •ํ•ด๋„ ์ข‹๋‹ค.
  • ๋ฐ˜ํ™˜๊ฐ’์ด void ์ด์™ธ์˜ ๊ฒฝ์šฐ ์ธ์ˆ˜ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’์ด ๋”ฐ๋กœ ์กด์žฌํ•˜๋ฉด ์ธ์ˆ˜๋„ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

๋˜ํ•œ ํ˜ธ์ถœ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ Javadoc ์ฃผ์„ ๋“ฑ์—์„œ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

10.1.2 ์กฐ์ž‘ํ•ด๋„ ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ถˆ๋ณ€ ๊ฐ์ฒด ํด๋ž˜์Šค

'์›์น™์ ์œผ๋กœ ์ธ์ˆ˜ ๊ฐ์ฒด์˜ ์ˆ˜์ •์€ ํ”ผํ•œ๋‹ค' ์ด๋Ÿฐ ๊ทœ์น™์„ ์ •ํ•˜๊ธฐ ๋ณด๋‹ค ์•„์˜ˆ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋„๋ก ํ•œ ๊ฒƒ์„ ๋ถˆ๋ณ€ ๊ฐ์ฒด ํด๋ž˜์Šค๋ผ๊ณ  ํ•œ๋‹ค.

๋ถˆ๋ณ€ ๊ฐ์ฒด ํด๋ž˜์Šค๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ "Immutable Object"๋ผ๊ณ  ํ•œ๋‹ค. ex) Integer, String, Date and Time API ํด๋ž˜์Šค

 

์•„๋ž˜ ์ฝ”๋“œ๋Š” ๊ธฐ์กด string์— ๋ฌธ์ž์—ด์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.

 

String text1 = "THIS IS STRING";
System.out.println("Before Hashcode : " + text1.hashCode());
text1 = text1 + " PLUS VALUE";
System.out.println("After Hashcode : " +text1.hashCode());

 

์ถœ๋ ฅ๊ฐ’

Before Hashcode : 1464937669
After Hashcode : -404159098

 

๋˜‘๊ฐ™์€ ๋ณ€์ˆ˜๊ฐ’ text1์ด์ง€๋งŒ hashcode๊ฐ’์ด ๋‹ค๋ฅธ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด ์ธ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ถˆ๋ณ€๊ฐ์ฒดํด๋ž˜์Šค๋Š” ๋ชจ๋“  ๋ฉ”์„œ๋“œ์—์„œ ๊ฐ์ฒด ์ž์‹ ์˜ ๊ฐ’์„ ๋ฐ”๊พธ์ง€ ์•Š์œผ๋ฉฐ ์กฐ์ž‘ํ•œ ๊ฒฐ๊ณผ๋Š” ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์žˆ๋‹ค.

10.1.3 ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋Š” ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ํด๋ž˜์Šค

StringBuilder, AtomicInteger ํด๋ž˜์Šค๋Š” append() ๋ฉ”์„œ๋“œ, incrementAndGet() ๋ฉ”์„œ๋“œ ๋“ฑ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ 'ํ•˜๋‚˜๋ผ๋„' ์กด์žฌํ•˜๋ฏ€๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ํด๋ž˜์Šค์ด๋‹ค.

 

๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ํด๋ž˜์Šค์˜ ์žฅ์ ๊ณผ ๋‹จ์ 

์ผ๋‹จ ๋ถˆ๋ณ€ ํด๋ž˜์Šค๋Š” ์˜๋„ํ•˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ์— ์˜ํ•œ ๋ฒ„๊ทธ๊ฐ€ ์—†๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•ˆ์ •์„ฑ์ด ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ถˆ๋ณ€ ๊ฐ์ฒด ํด๋ž˜์Šค๋Š” ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•  ๋•Œ ๋Œ€๋Ÿ‰์œผ๋กœ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋ฏ€๋กœ ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค.

 

์ด๋Ÿฌํ•œ ๋น„ํšจ์œจ์ ์ธ ๋‹จ์ ์„ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ํด๋ž˜์Šค๊ฐ€ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

10.2 ๊ฐ€์‹œ์„ฑ์„ ์ ์ ˆํžˆ ์„ค์ •ํ•˜์—ฌ ๋ฒ„๊ทธ๊ฐ€ ์ ์€ ํ”„๋กœ๊ทธ๋žจ ๋งŒ๋“ค๊ธฐ

public -> ๋ชจ๋“  ํด๋ž˜์Šค

protected -> ์„œ๋ธŒ ํด๋ž˜์Šค ๋ฐ ๋™์ผ ํŒจํ‚ค์ง€์˜ ํด๋ž˜์Šค

package private (์ง€์ • ์—†์Œ) -> ๋™์ผ ํŒจํ‚ค์ง€์˜ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ด์šฉ ๊ฐ€๋Šฅ

private -> ์ž์‹ ์˜ ํด๋ž˜์Šค๋งŒ ์ด์šฉ ๊ฐ€๋Šฅ

 

ํด๋ž˜์Šค์—๋„ ์ด๋Ÿฌํ•œ '๊ฐ€์‹œ์„ฑ'์ด ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋จ์„ ๊ธฐ์–ตํ•˜์ž. private class๋ผ๋ฉด public๋ฉ”์„œ๋“œ์—ฌ๋„ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€ํ•˜๋‹ค.

 

10.2.2 ๊ฐ€์‹œ์„ฑ์ด ์ข‹์€ ์‚ฌ๋ก€

๊ฐ€์‹œ์„ฑ์ด ๋„“์œผ๋ฉด ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ ์ ‘๊ทผํ•˜๊ธฐ๊ฐ€ ์‰ฝ๋‹ค...์ด๋Š” ์ƒ๊ฐ์ง€ ๋ชปํ•œ ํด๋ž˜์Šค์—์„œ ํ˜ธ์ถœ๋œ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง„๋‹ค. 

๋”ฐ๋ผ์„œ, ๊ฐ€์‹œ์„ฑ์€ ์ ์ ˆํ•˜๊ฒŒ ์„ค์ •ํ•ด์•ผ๋งŒ ํ•œ๋‹ค.

 

์›์น™์ ์œผ๋กœ ๊ฐ€์žฅ ๋ฒ”์œ„๊ฐ€ ์ข์€ ๊ฐ€์‹œ์„ฑ์œผ๋กœ ํ•œ๋‹ค.

public์€ ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ ์ง์ ‘ ๋ณ€์ˆ˜์˜ ๊ฐ’์— ์ ‘๊ทผํ•˜๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

-> ํด๋ž˜์Šค์—์„œ ์„ ์–ธํ•˜๋Š” ํ•„๋“œ๋Š” private์œผ๋กœ ํ•œ๋‹ค.

-> ์™ธ๋ถ€์—์„œ ์•ก์„ธ์Šคํ•˜๋Š” ๋ฉ”์„œ๋“œ์—๋งŒ public์œผ๋กœ ํ•œ๋‹ค.

 

ํ™•์žฅ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด protected๋กœ ํ•œ๋‹ค.

private์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€์‹œ์„ฑ์„ ์ขํž ์ˆ˜ ์žˆ์ง€๋งŒ ํ™•์žฅ์„ฑ๋„ ๋‚ฎ์•„์ง€๊ฒŒ ๋œ๋‹ค.

 

์ƒ์† ๋“ฑ์„ ํ†ตํ•ด ํ™•์žฅํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ protected๋กœ ํ•˜์—ฌ ํ™•์žฅ์„ฑ์„ ๋†’์—ฌ ๋‘๋„๋ก ํ•œ๋‹ค.

protected๋Š” ๊ฐ€์‹œ์„ฑ์ด ๋„“์ง€ ์•Š์•„ ์˜๋„ํ•˜์ง€ ์•Š์€ ๊ณณ์—์„œ ๋ณ€๊ฒฝ๋˜๋Š” ์œ„ํ—˜์ด ์ ์œผ๋‚˜ ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•œ ํ™•์žฅ์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

 

ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด protected ํ•˜๊ธฐ

ํ•„๋“œ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ private์ด ์•„๋‹Œ protected ๋˜๋Š” package private์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ…Œ์ŠคํŠธ ์‹œ ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ๋ชจ์˜ ๊ฐ์ฒด๋กœ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์šฉ์ดํ•ด์ง„๋‹ค. (๊ฐ™์€ ํŒจํ‚ค์ง€ ๋˜๋Š” ์ƒ์†์—์„œ ์ ‘๊ทผ)

protected๋Š” ์ด๋Ÿฌํ•œ ํ…Œ์ŠคํŠธ์˜ ํŽธ๋ฆฌํ•จ์ด ์žˆ๋‹ค.

 

10.3 ๊ฐ์ฒด์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด ํŒŒ์•…ํ•˜๊ธฐ

๋กœ์ปฌ ๋ณ€์ˆ˜, ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜, ํด๋ž˜์Šค ๋ณ€์ˆ˜ ์„ธ ๊ฐ€์ง€ ๋ผ์ดํ”„ ์‚ฌ์ดํด์ด ์žˆ๋‹ค.

 

๋ผ์ดํ”„ ์‚ฌ์ดํด์ด ๊ธธ๋ฉด(ํด๋ž˜์Šค ๋ณ€์ˆ˜) ์˜๋„ํ•˜์ง€ ์•Š๊ฒŒ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์ปค์ง„๋‹ค. ๋”ฐ๋ผ์„œ ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ์งง๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค.

๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ๊ธธ๊ฒŒํ•˜๋ฉด ์„ฑ๋Šฅ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค. ์ƒˆ๋กญ๊ฒŒ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค..

 

10.4 ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์„ค๊ณ„ํ•˜๊ธฐ

10.4.1 ๋‹คํ˜•์„ฑ์„ ์‹คํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜

์ž๋ฐ”์˜ ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ํŠน์ง•์„ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด์„  '์ธํ„ฐํŽ˜์ด์Šค'์™€ '์ถ”์ƒ ํด๋ž˜์Šค'๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ๊ฐœ๋… ๋ฐ ๊ธฐ๋Šฅ์˜ ์ดํ•ด๊ฐ€ ํ•„์ˆ˜์ ์ด๋‹ค.

์ด๋“ค์„ ์ •ํ™•ํžˆ ์ดํ•ดํ•จ์œผ๋กœ์จ ์ข‹์€ ํด๋ž˜์Šค์™€ ์ข‹์€ API๋ฅผ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ตฌํ˜„์ฒด๊ฐ€ ArrayList์ด๋˜ LinkedList์ด๋˜ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ  ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๊ทธ๋ƒฅ ์‚ฌ์šฉ๋งŒ ํ•˜๋ฉด ๋˜๊ณ  ๋‚ด๋ถ€ ์ฒ˜๋ฆฌ๋ฅผ ์•Œ ํ•„์š”๊ฐ€ ์—†๋‹ค. (๋ชฐ๋ผ์•ผ ํ•œ๋‹ค)

10.4.2 ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ถ”์ƒ ํด๋ž˜์Šค

์ธํ„ฐํŽ˜์ด์Šค -> ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค. ์ƒ์ˆ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

์ถ”์ƒ ํด๋ž˜์Šค -> abstract ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค. (ํ•˜๋‚˜๋ผ๋„ ์žˆ์œผ๋ฉด ์ถ”์ƒ ํด๋ž˜์Šค) // ์ž์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋‹ค. // ๊ทธ ์™ธ๋Š” ํด๋ž˜์Šค์™€ ๋™์ผ

 

์ธํ„ฐํŽ˜์ด์Šค

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์—์„œ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ •์˜ํ•œ ๋ฉ”์„œ๋“œ ์ด์™ธ์— public ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ–ˆ๋‹ค๊ณ  ํ•ด๋„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค (๋‹จ, ํƒ€์ž…์„ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ)

 

์ธํ„ฐํŽ˜์ด์Šค๋Š” "์ƒ์ˆ˜"๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ƒ์ˆ˜๋งŒ์„ ๊ฐ€์ง€๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๋ผ๊ณ  ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋‹ค.

์ผ๋‹จ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ณธ๋ž˜ ๋ชฉ์ ์—์„œ ๋ฒ—์–ด๋‚œ๋‹ค. ๋˜ํ•œ ์ด์šฉํ•˜์ง€ ์•Š๋Š” ์ƒ์ˆ˜๋„ ๊ตฌํ˜„ ํด๋ž˜์Šค๊ฐ€ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

 

์ƒ์ˆ˜๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” '์ƒ์ˆ˜ ํด๋ž˜์Šค' ๋‚˜ 'enum ํด๋ž˜์Šค'๋ฅผ ์‚ฌ์šฉํ•˜์ž.

 

์ถ”์ƒ ํด๋ž˜์Šค

์ถ”์ƒ ํด๋ž˜์Šค๋Š” ํด๋ž˜์Šค๋ฅผ ์ถ”์ƒํ™”ํ•œ ๊ฒƒ์ด๋‹ค.

์—ฌ๋Ÿฌ ํด๋ž˜์Šค์—์„œ ๋™์ผํ•œ ๋ถ€๋ถ„(๊ณตํ†ต ๋ถ€๋ถ„)์„ ์Šˆํผ ํด๋ž˜์Šค๋กœ ์ž˜๋ผ ๋‚ด์–ด ์ถ”์ƒํ™”ํ•ด, ๊ณตํ†ตํ™”ํ•œ ๊ฒƒ์ด๋‹ค.

 

์‹ค์ œ ๊ณ ๋ ค

  • ์ธํ„ฐํŽ˜์ด์Šค๋Š” '์ •์˜'์— ์‚ฌ์šฉ
  • ์ถ”์ƒ ํด๋ž˜์Šค๋Š” '๋ผˆ๋Œ€' ๋‚˜ '๊ณตํ†ต ์ฒ˜๋ฆฌ'์— ์‚ฌ์šฉ

'๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ธฐ๋Šฅ'์„ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ์ด ๋•Œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ํ•œ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋กœ์ง์ด ํ†ต์‹  ๋ฐฉ์‹์— ์˜์กดํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

 

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ชฝ์—์„œ ํ†ต์‹  ์ฒ˜๋ฆฌ๋ฅผ ๊ธฐ์ˆ ํ•˜๋„๋ก ํ•˜๋ฉด ๋„คํŠธ์›Œํฌ ํ†ต์‹  ๋ฐฉ์‹์ด HTTP์ธ์ง€ SOAP์ธ์ง€, ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ธ์ง€ ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€ ์—†๋‹ค. ๊ทธ๋ƒฅ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•  ๋•Œ '๋ฌด์—‡์„ ๊ฑด๋„ค๋ฉด ๋ฌด์—‡์„ ๋ฐ˜ํ™˜๋˜๋Š”์ง€'์— ๋Œ€ํ•œ "์ •์˜"๋งŒ ์•Œ๋ฉด ๋œ๋‹ค.

 

์ด๊ฒƒ์„ ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ํ•˜๋ฉด ๊ตฌํ˜„์ด ํฌํ•จ๋˜์–ด ์ข…์†์„ฑ์ด ๊ฐ•ํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์ค‘์— ์ˆ˜์ •์ด ํž˜๋“ค์–ด์ง„๋‹ค. (๊ฐ๊ฐ์˜ ๋ชฉ์ ์— ๋งž๊ฒŒ ์“ฐ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค)

 

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์•Œ๊ณ  ์žˆ์œผ๋ฉด ๊ตฌ์ฒด์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ๋ฐ”๊ฟˆ์œผ๋กœ์จ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‚˜์ค‘์— ์ฒ˜๋ฆฌ๋ฅผ ์‹ ๊ฒฝ์“ฐ์ง€์•Š๊ณ  ๋‹ค๋ฅธ ๊ตฌํ˜„์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค.

 

์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„ ํด๋ž˜์Šค์˜ ๊ณตํ†ต ์ฒ˜๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด..

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

(์ธํ„ฐํŽ˜์ด์Šค - ์ถ”์ƒ ํด๋ž˜์Šค(๊ณตํ†ต ์ฒ˜๋ฆฌ) - ๊ตฌํ˜„ ํด๋ž˜์Šค)

 

๊ทธ๋ ‡๋‹ค๋ฉด ๊ทธ๋ƒฅ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถ”์ƒํด๋ž˜์Šค๋กœ ๋ฐ”๊พธ๋ฉด ๋˜์ง€ ์•Š์„๊นŒ..?

์ด๊ฒƒ์€ ๋‚˜์œ ํŒจํ„ด์ด๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ฆ์œผ๋กœ์จ ํด๋ž˜์Šค ๊ฐ„์˜ ์˜์กด๊ด€๊ณ„๊ฐ€ ๊ฐ•ํ•ด์ ธ๋ฒ„๋ ค ๋‚˜์ค‘์— ์ฒ˜๋ฆฌ์˜ ๋ณ€๊ฒฝ์ด ์–ด๋ ค์›Œ์ง„๋‹ค. (๋ฐ”๋กœ ๋ฐ‘์— ๋‚˜์˜ค๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ๊ทธ ์˜ˆ์‹œ์ด๋‹ค)

 

์ธํ„ฐํŽ˜์ด์Šค์˜ ์•ˆ์ •๊ฐ

์ถ”์ƒ ํด๋ž˜์Šค ๋Œ€์‹  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์˜ ์ข‹์€ ์ ์€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ์— ๋‚˜ํƒ€๋‚œ๋‹ค.

    public class AService {
        protected BService bService;
        
        public void someMethod() {
            service.excute();
            ...
        }
    }

ํ…Œ์ŠคํŠธ ์‹œ service.execute() ์•ˆ์—์„œ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์— ์•ก์„ธ์Šคํ•˜๊ณ  ์žˆ์–ด ๊ทธ๋Œ€๋กœ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ํ˜ธ์ถœ๋œ ๋ถ€๋ถ„์„ '๋ชจ์˜ ๊ฐ์ฒด'๋กœ ๋งŒ๋“ค๊ฒŒ ๋œ๋‹ค.

์ด ๋•Œ ๋งŒ์•ฝ service ๊ฐ์ฒด์˜ ํƒ€์ž…์ด ์ธํ„ฐํŽ˜์ด์Šค๋ผ๋ฉด ํ˜ธ์ถœ๋œ ๋ถ€๋ถ„(๊ตฌํ˜„ ๋ถ€๋ถ„)์ด ๋ฌด์—‡์„ ํ•˜๊ณ  ์žˆ๋“  ํ˜ธ์ถœํ•˜๋Š” ์ชฝ์—๋Š” ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธ์ถœ๋œ ๋ถ€๋ถ„์˜ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•ด์„œ๋Š” ์‹ ๊ฒฝ ์“ฐ์ง€์•Š๊ณ  '๋ชจ์˜ ๊ฐ์ฒด'๋กœ ๋งŒ๋“ค์–ด ๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ service ๊ฐ์ฒด๊ฐ€ ์ถ”์ƒ ํด๋ž˜์Šค์ธ ๊ฒฝ์šฐ ๊ทธ ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ๊ตฌํ˜„์ด ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—(ํด๋ž˜์Šค ๊ฐ„ ์˜์กด๊ด€๊ณ„๊ฐ€ ๊ฐ•ํ•ด์ง) ์ „์ฒด๋ฅผ ๋ชจ์˜ ๊ฐ์ฒดํ™” ํ•  ์ˆ˜ ์—†๋‹ค. (ํ•„์š”ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›Œ ๋ฒ„๋ฆด ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค)

 

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ…Œ์ŠคํŠธ๋ฅผ ํฌํ•จํ•˜์—ฌ ์ฝ”๋”ฉ ์‹œ์˜ ์•ˆ์ •๊ฐ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

10.4.3 ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋””ํดํŠธ ๊ตฌํ˜„

๋””ํดํŠธ ๋ฉ”์„œ๋“œ์˜ ์ถ”๊ฐ€๋กœ ๊ณตํ†ต ๋ถ€๋ถ„์„ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ถ”์ƒ ํด๋ž˜์Šค์™€ ์ฐจ์ด๊ฐ€ ์—†์–ด์ง„ ๊ฒƒ์ธ๊ฐ€..?

์‚ฌ์‹ค ๋””ํดํŠธ ๊ตฌํ˜„์˜ ์ถ”๊ฐ€๋Š” ๊ทธ ๋ฐฐ๊ฒฝ๊ณผ ๋ชฉ์ ์ด ์™„์ „ํžˆ ๋‹ค๋ฅด๋‹ค

 

์ž๋ฐ” 8์—์„œ Stream API ์ถ”๊ฐ€๋กœ ์ธํ•ด ๊ธฐ์กด์˜ ์ธํ„ฐํŽ˜์ด์Šค(java.util.List ๋“ฑ) ์— ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€๊ฐ€ ๋ถˆ๊ฐ€ํ”ผํ•ด์กŒ๋‹ค. ํ•˜์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค์— ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ตฌํ˜„ ํด๋ž˜์Šค์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ฒŒ ๋œ๋‹ค. ์ฆ‰, ์ž๋ฐ” 7๊นŒ์ง€์˜ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ์žƒ์–ด ๋ฒ„๋ฆฌ๊ฒŒ ๋œ๋‹ค.

 

์ด๋ ‡๊ฒŒ ํ˜ธํ™˜์„ฑ์„ ์žƒ๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด List ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋””ํดํŠธ ๊ตฌํ˜„์œผ๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

์ฆ‰, ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋””ํดํŠธ ๊ตฌํ˜„์€ ์ž๋ฐ”์˜ '์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ'์„ ์œ„ํ•ด ํƒ„์ƒํ–ˆ๋‹ค.

 

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ๊ณตํ†ต ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋ณด๋‹จ ์ž๋ฐ” 7 ์ด์ „ ์ฒ˜๋Ÿผ ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•Œ๊ธฐ ์‰ฌ์šธ ๊ฒƒ์ด๋‹ค. (์ €์ž์˜ ์ƒ๊ฐ)

 

10.4.4 ์ธํ„ฐํŽ˜์ด์Šค์˜ static ๋ฉ”์„œ๋“œ

์ž๋ฐ” 8 ๋ถ€ํ„ฐ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ฉ”์„œ๋“œ์˜ ๊ตฌํ˜„์„ ์ง€๋‹ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ static ๋ฉ”์„œ๋“œ๋„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

// ์ธํ„ฐํŽ˜์ด์Šค
public interface Bar {
    String say();

    static Bar newInstance(String message) {
        return new DefaultBar(message);
    }
}

// ๊ตฌํ˜„ ํด๋ž˜์Šค 
class DefaultBar implements Bar {
    private String message;

    DefaultBar(String message) {
        this.message = message;
    }
    
    @Override
    public String say() {
        return this.message;
    }
}

 

์ธํ„ฐํŽ˜์ด์Šค์˜ static ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์‚ฌ์šฉํ•ด๋ณด์ž.

Bar bar = Bar.newInstance("Hello Bar!");
System.out.println(bar.say());

static ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•จ ์ˆ˜ ์žˆ๊ฒŒ ๋จ์œผ๋กœ์จ ์ธํ„ฐํŽ˜์ด์Šค ์Šค์Šค๋กœ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” 'ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ'(newInstance)๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ž€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋งํ•œ๋‹ค. (ํŒฉํ† ๋ฆฌ ํด๋ž˜์Šค๋ž€ ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋œปํ•œ๋‹ค.)

๋ฐ˜ํ™˜๊ฐ’์€ ์ผ๋ฐ˜์ ์œผ๋กœ '์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ์ถ”์ƒํด๋ž˜์Šค'๋กœ ํ•˜์˜ ์–ด๋– ํ•œ ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋˜์—ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒŒ ํ•ด์„œ ์ฒ˜๋ฆฌ์˜ ๊ณตํ†ตํ™” ๋ฐ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๊ณ  ์žˆ๋‹ค.

 

** ์ข€ ๋” ๊นŠ๊ฒŒ ์ƒ๊ฐํ•ด๋ณด์ž **

์ธํ„ฐํŽ˜์ด์Šค๋ž€ public ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํŒจํ‚ค์ง€๋ฅผ ๋„˜์–ด์„œ ์–ด๋””์—์„œ๋‚˜ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ฉ”์„œ๋“œ๋ฅผ ๊ณต๊ฐœํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์šฐ๋ฆฌ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ ํด๋ž˜์Šค์˜ ์ฒ˜๋ฆฌ๋ฅผ ์•Œ ํ•„์š”๊ฐ€ ์—†๋‹ค.

ํ•˜์ง€๋งŒ... ๋ชจ์ˆœ์ ์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ๊ตฌํ˜„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ public์œผ๋กœ ํ•˜๊ณ  ์ฝ”๋“œ์ƒ์—์„œ๋„ ์˜ค๋ฅธ์ชฝ ์— ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ๊ธฐ์ˆ ํ•ด์•ผ๋งŒ ํ•œ๋‹ค...


Foo foo = new DefaultFoo("Hello Foo!");

์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๊ตฌํ˜„ ํด๋ž˜์Šค๊ฐ€ ๋“œ๋Ÿฌ๋‚˜๊ฒŒ ๋œ๋‹ค.

 

 

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ ‘๊ทผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„ ํด๋ž˜์Šค์— ์•ก์„ธ์Šคํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๊ตฌํ˜„ ํด๋ž˜์Šค ์ชฝ๋„ ์ „์ฒด ํด๋ž˜์Šค๋ฅผ public์œผ๋กœ ์—ด์–ด๋‘˜ ํ•„์š” ๋˜ํ•œ ์—†์–ด์ง„๋‹ค.

 

์ž๋ฐ” 8์—์„œ static ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉด์„œ ๊ตฌํ˜„ ํด๋ž˜์Šค์ธ DefaultFoo ํด๋ž˜์Šค๋ฅผ ๋”์šฑ ์™„๋ฒฝํ•˜๊ฒŒ '์€ํ'ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ์ธํ„ฐํŽ˜์ด์Šค๋งŒ์œผ๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ์ ‘๊ทผ ์ œํ•œ์ž์— ์˜ํ•œ ๊ฐ€์‹œ์„ฑ์˜ ์ •์˜๋„ ์˜๋ฏธ๊ฐ€ ์žˆ๊ฒŒ ๋œ๋‹ค.

// ์ธํ„ฐํŽ˜์ด์Šค
public interface Bar {
    String say();

    static Bar newInstance(String message) {
        return new DefaultBar(message);
    }
}

// ๊ตฌํ˜„ ํด๋ž˜์Šค 
class DefaultBar implements Bar { // package private class
    private String message;

    DefaultBar(String message) {
        this.message = message;
    }
    
    @Override
    public String say() {
        return this.message;
    }
}