Skip to content

The source code from the third edition of Effective Java, with minor additions as necessary to make it runnable.

Notifications You must be signed in to change notification settings

jongheonleee/effective_java

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 

Repository files navigation

๐Ÿš€ Effective Java

๐Ÿ“Œ 02. ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ํŒŒ๊ดด



๐Ÿ“ฆ Item 01. ์ƒ์„ฑ์ž ๋Œ€์‹  ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ๊ณ ๋ คํ•˜๋ผ

๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ new ์ƒ์„ฑ์ž()๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์ง€์–‘, ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ ํ™œ์šฉํ•˜์—ฌ ์ž์› ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉ, ๊ฐ์ฒด ์ ๊ทน์ ์œผ๋กœ ์žฌ์‚ฌ์šฉ

  • ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ : static ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์˜๋ฏธ

  • new ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•œ ๊ฐ์ฒด ์ƒ์„ฑ์€ ์ž์›์„ ๋‚ญ๋น„ํ•จ, new ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด heap์˜์—ญ์— ํ•ญ์ƒ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ํ™•๋ณด๋จ

  • ๋”ฐ๋ผ์„œ, ๊ฐ์ฒด๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ

  • ์žฅ์ 

    • (1) ์ด๋ฆ„์„ ๊ฐ–์Œ - ๋ฉ”์„œ๋“œ ์—ฌ๋Ÿฌ๊ฐœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ
    • (2) ์ธ์Šคํ„ด์Šค ์žฌ์‚ฌ์šฉ - ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์ƒ์„ฑํ•  ํ•„์š” ์—†์ด ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ(flyweight ํŒจํ„ด)
    • (3) ๋‹คํ˜•์„ฑ, ๊ณต๋ณ€์ด ๊ฐ€๋Šฅํ•จ - ๋ฐ˜ํ™˜ํ•  ํด๋ž˜์Šค๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์„ ํƒ ๊ฐ€๋Šฅ. ์˜ˆ๋ฅผ ๋“ค์–ด, Car car = CarFactory.getInstance("sportCar");
    • (4) ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฐ์ฒด ๋ฐ˜ํ™˜ - CarFactory.getInstance("truck"), CarFactory.getInstance("sportCar"), ...
    • (5) ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, ๋ฐ˜ํ™˜ ๊ฐ์ฒด ํด๋ž˜์Šค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•„๋„๋จ - Future ํŒจํ„ด๊ณผ ์œ ์‚ฌ(๋นˆ ๋ฐ•์Šค์ œ๊ณต)
  • ๋‹จ์ 

    • (1) ์ƒ์† ๋ถˆ๊ฐ€๋Šฅ - ์ƒ์„ฑ์ž๊ฐ€ private ์ด๊ธฐ ๋•Œ๋ฌธ
    • (2) ๋ฉ”์„œ๋“œ ์ฐพ๊ธฐ ์–ด๋ ค์›€ - ์ด๋ฆ„์ด ์—ฌ๋Ÿฌ๊ฐœ์ž„

๐Ÿ“ฆ Item 02. ์ƒ์„ฑ์ž์— ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋งŽ๋‹ค๋ฉด ๋นŒ๋”๋ฅผ ๊ณ ๋ คํ•˜๋ผ

iv๊ฐ€ ๋งŽ๊ณ  ๊ฐ์ฒด ์ƒ์„ฑ์‹œ์— ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ, ์ƒ์„ฑ์ž๋‚˜ ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๋ณด๋‹จ ๋นŒ๋” ํŒจํ„ด์„ ํ™œ์šฉ

  • ๋นŒ๋” ํŒจํ„ด : "์ƒ์„ฑ์ž์— ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋งŽ์Œ -> ์ƒ์„ฑ์ž ์˜ค๋ฒ„๋กœ๋”ฉ ๋งŽ์ดํ•จ, ๋งค๊ฐœ๋ณ€์ˆ˜ ์ˆœ์„œ ํ˜ผ๋™" ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ ๋นŒ๋” ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•ด์„œ ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉ

๐Ÿ“ฆ Item 03. private ๏ฟฝ๏ฟฝ๏ฟฝ์„ฑ์ž๋‚˜ ์—ด๊ฑฐ ํƒ€์ž…์œผ๋กœ ์‹ฑ๊ธ€ํ„ด์ž„์„ ๋ณด์ฆํ•˜๋ผ

์—ด๊ฑฐํ˜•์œผ๋กœ ์‹ฑ๊ธ€ํ†ค ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์ด ๊ฐ€์žฅ ์ข‹์Œ

  • ์‹ฑ๊ธ€ํ†ค : ์ธ์Šคํ„ด์Šค ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•˜๊ณ  ๊ณต์œ 
  • ๊ตฌํ˜„ ๋ฐฉ๋ฒ• - (1) public static final -> (2) ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ -> (3) ์—ด๊ฑฐํ˜•

๐Ÿ“ฆ Item 04. ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ๋ง‰์œผ๋ ค๊ฑฐ๋“  private ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ผ

private ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ธ์Šคํ„ด์Šคํ™” ๋ง‰์Œ

  • ๊ตณ์ด ์ด๋ ‡๊ฒŒ ๊นŒ์ง€ ํ•  ํ•„์š”๋Š” ์—†์Œ, ๋ฌผ๋ก  ์‹ฑ๊ธ€ํ†ค๊ฐ™์€ ๋””์ž์ธ ํŒจํ„ด์—๋Š” ์ ์šฉํ•ด์•ผํ•จ

๐Ÿ“ฆ Item 05. ์ž์›์„ ์ง์ ‘ ๋ช…์‹œํ•˜์ง€ ๋ง๊ณ  ์˜์กด ๊ฐ์ฒด ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ผ

์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์‹œ ํ•„์š”ํ•œ ์ž์›์„ ๋„˜๊ฒจ์คŒ, ๋ฉ”์„œ๋“œ๋กœ ๋„˜๊ฒจ์ค„ ์ˆ˜๋„ ์žˆ์Œ(sort("๋น„๊ต๋Œ€์ƒ", "๋น„๊ต๊ธฐ์ค€"))

  • ์ „๋žต ํŒจํ„ด, ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์™ธ๋ถ€์—์„œ ํ†ต์งธ๋กœ ๏ฟฝ๏ฟฝ์–ด์คŒ
  • ์˜ˆ์‹œ์—์„œ ๋‚˜์˜จ ๋งž์ถค๋ฒ• ๊ฒ€์‚ฌ๊ธฐ์˜ ๋ฌธ์ œ์ ์€ "์ž์ฃผ ๋ณ€๊ฒฝ๋  ๋ถ€๋ถ„์ด ๊ตฌ์ฒด์ ์œผ๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์Œ"
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ์–ธ์–ด๋งˆ๋‹ค ๋งž์ถค๋ฒ•์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋ถ€๋ถ„์„ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผํ•จ(์ „๋žต ํŒจํ„ด)

๐Ÿ“ฆ Item 06. ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ์„ ํ”ผํ•˜๋ผ

์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋Š” ๊ณต์œ ํ•ด์„œ ์‚ฌ์šฉํ•˜์ž

  • ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ๋„ ๊ณ ๋ คํ•ด์•ผํ•จ
  • ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋ผ๋Š” ์˜๋ฏธ๋Š” ๊ณต์œ  ๊ฐ€๋Šฅํ•œ ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  ์žˆ๋ƒ๋„ ํฌํ•จ์ž„
  • ์ฆ‰, ๋‚ด๋ถ€ iv๊ฐ€ ๋ถˆ๋ณ€์ด ์•„๋‹Œ ๊ฒฝ์šฐ, ๋˜ํ•œ ๋™๊ธฐํ™” ์ฒ˜๋ฆฌ๊ฐ€ ์•ˆ๋˜์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๊ณต์œ ํ•ด์„œ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ํ”„๋กœ๊ทธ๋žจ์— ํ˜ผ๋™์„ ์•ผ๊ธฐํ•  ์ˆ˜ ์ž‡์Œ

๐Ÿ“ฆ Item 07. ๋‹ค ์“ด ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ํ•ด์ œํ•˜๋ผ!

  • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ํšŒ์ˆ˜ํ•˜์ง€๋งŒ, 100% ํšŒ์ˆ˜ํ•ด์ฃผ์ง€ ์•Š์Œ
  • ์ฐธ์กฐ๊ฐ€ ๊ฑธ๋ ค์žˆ์ง€๋งŒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” ํšŒ์ˆ˜ํ•˜์ง€ ๋ชปํ•จ
    • ๋Œ€ํ‘œ์ ์œผ๋กœ Flyweight ํŒจํ„ด์—์„œ ๋งต์— ์ €์žฅ๋œ ์•ˆ์“ฐ๋Š” ๊ฐ์ฒด ํšŒ์ˆ˜ ๋ชปํ•จ
  • ์œ„์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฐธ์กฐ๋ฅผ ํ•ด์ œํ•ด์•ผํ•จ

๐Ÿ“ฆ Item 08. finalizer์™€ cleaner ์‚ฌ์šฉ์„ ํ”ผํ•˜๋ผ


๐Ÿ“ฆ Item 09. try-finally ๋ณด๋‹ค๋Š” try-with-resources๋ฅผ ์‚ฌ์šฉํ•˜๋ผ


๐Ÿ“Œ 03. ๋ชจ๋“  ๊ฐ์ฒด์˜ ๊ณตํ†ต ๋ฉ”์„œ๋“œ



๐Ÿ“ฆ Item 10. equals๋Š” ์ผ๋ฐ˜ ๊ทœ์•ฝ์„ ์ง€์ผœ ์žฌ์ •์˜ํ•˜๋ผ

  • ํ•ต์‹ฌ์€ "๊ตฌ์ฒด ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•ด ์ƒˆ๋กœ์šด ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋ฉด์„œ equals() ๊ทœ์•ฝ์„ ๋งŒ์กฑ์‹œํ‚ฌ ๋ฐฉ๋ฒ•์€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค."

  • equals()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜์ง€ ์•Š์•„์•ผํ•˜๋Š” ์ƒํ™ฉ

    • (1) ๊ฐ ์ธ์Šคํ„ด์Šค๋Š” ๊ณ ์œ ํ•จ : ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฐธ์กฐ ๋น„๊ต๊ฐ€ ์ •์ƒ์ž„
    • (2) ์ธ์Šคํ„ด์Šค์˜ '๋…ผ๋ฆฌ์  ๋™์น˜์„ฑ'์„ ๊ฒ€์‚ฌํ•  ์ผ์ด ์—†์Œ : ๊ฐ’ ๋น„๊ต(๋…ผ๋ฆฌ์  ๋™์น˜์„ฑ)๋ฅผ ์˜๋ฏธํ•จ
    • (3) ์กฐ์ƒ์—์„œ ์žฌ์ •์˜ํ•œ equals()๊ฐ€ ์ž์†์—์„œ๋„ ๋”ฑ ๋“ค์–ด๋งž๋Š”๋‹ค
      • ์กฐ์ƒ, ์ž์†์€ iv์˜ ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ™๊ฑฐ๋‚˜ ๋‹ค๋ฆ„
      • ์ž์†์—์„œ iv๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ  equals()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ
        • ๋™์น˜๊ด€๊ณ„(๋นˆ์‚ฌ์„ฑ, ๋Œ€์นญ์„ฑ, ์ถ”์ด์„ฑ, ์ผ๊ด€์„ฑ, null-์•„๋‹˜) ์ถฉ์กฑ ๋ชปํ•จ

  • ์–‘์งˆ์˜ equals()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜๊ธฐ ์œ„ํ•œ ๊ทœ์น™
    • (1) == ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ์ž…๋ ฅ์ด ์ž๊ธฐ ์ž์‹ ์ธ์ง€ ํ™•์ธ
    • (2) instanceof ๋ฅผ ํ†ตํ•ด ํƒ€์ž… ํ™•์ธ
    • (3) ๋Œ€์‘๋˜๋Š” 'ํ•ต์‹ฌ' ํ•„๋“œ๋“ค์ด ๋ชจ๋‘ ์ผ์น˜ํ•˜๋Š”์ง€ ํ•˜๋‚˜์”ฉ ํ™•์ธ
    • (4) ๋Œ€์นญ์ ? ์ถ”์ด์„ฑ? ์ผ๊ด€์ ? ์Šค์Šค๋กœ ์ž๋ฌธ

๐Ÿ“ฆ Item 11. equals๋ฅผ ์žฌ์ •์˜ํ•˜๋ ค๊ฑฐ๋“  hashCode๋„ ์žฌ์ •์˜ํ•˜๋ผ

  • ํ•ต์‹ฌ์€ "equals()๋ฅผ ์žฌ์ •์˜ํ•œ ํด๋ž˜์Šค ๋ชจ๋‘ hashCode๋ฅผ ์žฌ์ •์˜ํ•ด์•ผํ•จ"
  • ๊ฐ™์€ ๊ฐ์ฒด๋Š” ๊ฐ™์€ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ
  • ํ•ด์‹œ์ฝ”๋“œ(hashCode) : ๋””์ง€ํ„ธ ์ง€๋ฌธ, ๋””์ง€ํ„ธ ์ฆ๊ฑฐ์šฉ์œผ๋กœ์„œ ๋งŽ์ด ์‚ฌ์šฉํ•จ, ํŒŒ์ผ์„ ๊ฑด๋“œ๋ฆฌ๋ฉด ๋””์ง€ํ„ธ ์ง€๋ฌธ์ด ๋ณ€๊ฒฝ๋จ
  • ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœํ•  ๋•Œ ๋งˆ๋‹ค ํ•ด์‹œ ๊ฐ’์„ ๋งค๋ฒˆ ๊ณ„์‚ฐํ•  ํ•„์š” ์—†์Œ
    • ํ•œ๋ฒˆ๋งŒ ๊ณ„์‚ฐํ•˜๊ณ  ์ €์žฅ ํ•ด๋‘์—ˆ๋‹ค๊ฐ€ ๊ทธ ๊ฐ’์„ ๋ฐ˜ํ™˜
    • ํ•ด์‹œ๊ฐ’์€ ๋ถˆ๋ณ€
  • hashCode() ๋ฉ”์„œ๋“œ์˜ ๊ฒฝ์šฐ, ์Šค๋ ˆ๋“œ ์•ˆ์ •์„ฑ๊นŒ์ง€ ๊ณ ๋ คํ•ด์•ผํ•จ

๐Ÿ“ฆ Item 12. toString์„ ํ•ญ์ƒ ์žฌ์ •์˜ํ•˜๋ผ

  • ๊ธฐ๋ณธ์ ์œผ๋กœ, ํด๋ž˜์Šค_์ด๋ฆ„@16์ง„์ˆ˜_ํ•ด์‹œ์ฝ”๋“œ
  • ๋ชจ๋“  ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ toString์„ ์žฌ์ •์˜, ๊ทธ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง„ ์ฃผ์š” ์ •๋ณด ๋ชจ๋‘ ๋ฐ˜ํ™˜
    • ๋””๋ฒ„๊น… ์šฉ์ด
    • ๊ฐ์ฒด ์ •๋ณด ํŒŒ์•… ์šฉ์ด

๐Ÿ“ฆ Item 13. clone ์žฌ์ •์˜๋Š” ์ฃผ์˜ํ•ด์„œ ํ•˜๋ผ

  • Cloneable ์ธํผํ…Œ์ด์Šค, clone ๊ฐ€๋Šฅํ•œ ํด๋ž˜์Šค ์ž„์„ ์˜๋ฏธ
  • clone์€ ์›๋ณธ ๊ฐ์ฒด์— ์˜ํ–ฅ x, ๋ณต์ œ๋œ ๊ฐ์ฒด์˜ ๋ถˆ๋ณ€์‹์„ ๋ณด์žฅํ•ด์•ผํ•จ
  • ์ฃผ์˜ํ•  ์ 
    • ๊นŠ์€ ๋ณต์‚ฌ vs ์–•์€ ๋ณต์‚ฌ
    • ๋™๊ธฐํ™” ์ฒ˜๋ฆฌ
  • ๋ณต์‚ฌ ์ƒ์„ฑ์ž, ๋ณต์‚ฌ ํŒฉํ„ฐ๋ฆฌ ํ™œ์šฉ ํ•  ์ˆ˜ ์žˆ์Œ
  • ์™ ๋งŒํ•˜๋ฉด "๋ณต์ œ ๊ธฐ๋Šฅ์€ ์ƒ์„ฑ์ž์™€ ํŒฉํ„ฐ๋ฆฌ๋ฅผ ์ด์šฉํ•˜๋Š”๊ฒŒ ์ข‹์Œ"

๐Ÿ“ฆ Item 14. Comparable์„ ๊ตฌํ˜„ํ• ์ง€ ๊ณ ๋ คํ•˜๋ผ

  • ๊ธฐ๋ณธ ๋น„๊ต ๊ธฐ์ค€, ๊ธฐ๋ณธ ๋น„๊ต ๊ธฐ์ค€ ์ด์™ธ Comparator๋กœ ๊ตฌํ˜„
  • ๋™์น˜์„ฑ + ์ˆœ์„œ ๋น„๊ต, ๊ฐ์ฒด์˜ ์ˆœ์„œ ๋น„๊ต
  • ๋ฐ˜์‚ฌ์„ฑ, ๋Œ€์นญ์„ฑ, ์ถ”์ด์„ฑ ์ถฉ์กฑ
  • <์™€ >๋Š” ์ถ”์ฒœํ•˜์ง€ ์•Š์Œ, == ๊ณผ compareTo() ํ™œ์šฉ

About

The source code from the third edition of Effective Java, with minor additions as necessary to make it runnable.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 100.0%