diff --git "a/\352\271\200\355\230\204\354\242\205/delete_me" "b/\352\271\200\355\230\204\354\242\205/delete_me" deleted file mode 100644 index e69de29..0000000 diff --git "a/\355\225\230\354\235\200\355\230\234/3\354\243\274\354\260\250 item 6~8.md" "b/\355\225\230\354\235\200\355\230\234/3\354\243\274\354\260\250 item 6~8.md" deleted file mode 100644 index 1e99726..0000000 --- "a/\355\225\230\354\235\200\355\230\234/3\354\243\274\354\260\250 item 6~8.md" +++ /dev/null @@ -1,18 +0,0 @@ -# 3์ฃผ์ฐจ. item 6~8 - -## ๐Ÿ“– ํ•ต์‹ฌ ๋‚ด์šฉ -- ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ์„ ํ”ผํ•˜๋ผ -- ๋‹ค ์“ด ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ํ•ด์ œํ•˜๋ผ -- finalizer์™€ cleaner ์‚ฌ์šฉ์„ ํ”ผํ•˜๋ผ - -## ๐Ÿค” ํšŒ๊ณ  (๋А๋‚€ ์  ๋ฐ ๊ฐœ์„ ์ ) -- ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„๊ณผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณ ๋ คํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ธ์ง€ํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ for๋ฌธ์˜ ์‚ฌ์šฉ๋“ฑ์˜ ๋กœ์ง๋‹จ์˜ ๊ณ ๋ฏผ๋งŒ ํ–ˆ์—ˆ์ง€ ์ƒ์„ฑ ๋น„์šฉ์ด ๋น„์‹ผ ๊ฐ์ฒด๋‚˜ ์˜คํ† ๋ฐ•์‹ฑ์˜ ๋นˆ๋„์™€ ๊ฐ™์€ ๋ถ€๋ถ„์€ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์—ˆ๋‹ค. ์ถ”ํ›„ ๊ฐœ๋ฐœ ์‹œ์—๋Š” ์ด๋Ÿฐ ๋ถ€๋ถ„๋„ ๊ณ ๋ คํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. -- ์•ฝํ•œ ์ฐธ์กฐ(weak reference)์˜ ๊ฐœ๋…์— ๋Œ€ํ•œ ๊ณต๋ถ€๊ฐ€ ๋” ํ•„์š”ํ•˜๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ๊ฐ•์˜๋ฅผ ๋“ค์œผ๋ฉฐ ์–ด๋–ค ๋А๋‚Œ์ธ์ง€๊นŒ๋Š” ์ธ์ง€ํ–ˆ์œผ๋‚˜ ์ด ๊ฐœ๋…์ด ์–ด๋–ค ๋•Œ ์ฃผ๋กœ ์“ฐ์ด๋ฉฐ, ๋ญ˜ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ธ์ง€๊ฐ€ ๊ถ๊ธˆํ•ด์กŒ๋‹ค. -## ๐Ÿ’ก ๋…ผ์˜ ํ•˜๊ณ  ์‹ถ์€ ๋ถ€๋ถ„ -- new String()์„ ํ™œ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ด ๋ณธ ๊ฒฝํ—˜์ด ์žˆ๋Š”์ง€ ์žˆ๋‹ค๋ฉด ๊ทธ ์ด์œ ๋Š” ์–ด๋–ค ๊ฒƒ์ด ์˜€๋Š”์ง€ -- ์ •๊ทœ์‹ ์‚ฌ์šฉ ์‹œ ์–ด๋–ค ์‹์œผ๋กœ ํ™œ์šฉํ–ˆ์—ˆ๋Š”์ง€ -- ์˜คํ†  ๋ฐ•์‹ฑ๊ณผ ์–ธ๋ฐ•์‹ฑ์„ ํ‰์†Œ์—๋„ ์ž์ฃผ ํ™œ์šฉํ•˜๋Š” ํŽธ์ธ์ง€ - - -## ๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ ๋ฐ ์ถ”๊ฐ€ ํ•™์Šต ์ž๋ฃŒ -- [๊ฐ•์˜ ๋‚ด์šฉ ์ •๋ฆฌ ๋…ธ์…˜](https://ehhahappy.notion.site/687f50e46adc4bfba2fc5abd426558d6?pvs=4) \ No newline at end of file diff --git "a/\355\225\230\354\235\200\355\230\234/item1.md" "b/\355\225\230\354\235\200\355\230\234/Chap2-\352\260\235\354\262\264\354\235\230_\354\203\235\354\204\261\352\263\274_\355\214\214\352\264\264/item1.md" similarity index 99% rename from "\355\225\230\354\235\200\355\230\234/item1.md" rename to "\355\225\230\354\235\200\355\230\234/Chap2-\352\260\235\354\262\264\354\235\230_\354\203\235\354\204\261\352\263\274_\355\214\214\352\264\264/item1.md" index e3e8ee7..7715c39 100644 --- "a/\355\225\230\354\235\200\355\230\234/item1.md" +++ "b/\355\225\230\354\235\200\355\230\234/Chap2-\352\260\235\354\262\264\354\235\230_\354\203\235\354\204\261\352\263\274_\355\214\214\352\264\264/item1.md" @@ -379,7 +379,7 @@ ``` - ์ž๋ฐ”๋… ์ƒ์„ฑ ์‹œ, ์ƒ์„ฑ์ž๋Š” ์ƒ์„ฑ์ž์˜ ์˜์—ญ์ด ๋”ฐ๋กœ ์กด์žฌํ•˜์—ฌ ์ธ์Šคํ„ด์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ง€๋ฅผ ํ•œ ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๋ฉด ์ •์  ํŒฉํ† ๋ฆฌ ๋งค์„œ๋“œ๋Š” ๋ฉ”์„œ๋“œ ๋ถ€๋ถ„์— ๋“ค์–ด๊ฐ€ ์žˆ์–ด ํ•ด๋‹น ํด๋ž˜์Šค์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ๋งŽ์•„์ง€๋Š” ๊ฒฝ์šฐ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋Š” ์šฉ๋„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐพ๊ธฐ๊ฐ€ ์–ด๋ ต๊ฒŒ ๋ ์ˆ˜๋„ ์žˆ๋‹ค. - ![image.png](image/javadoc_settings.png) + ![image.png](../image/javadoc_settings.png) - ์ด์— ์ฑ…์—์„œ๋Š” ๋„ค์ด๋ฐ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์•Œ์•„๋ณด๊ธฐ ์‰ฝ๊ฒŒ ํ•˜๋Š” ๊ฒƒ๊ณผ ๋ฌธ์„œํ™”๋ฅผ ์ œ์•ˆํ•˜๊ณ  ์žˆ๋‹ค. ๋ฌธ์„œํ™”์˜ ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ```java @@ -405,4 +405,4 @@ } ``` - ![image.png](image/javadoc_settings2.png) + ![image.png](../image/javadoc_settings2.png) diff --git "a/\355\225\230\354\235\200\355\230\234/item2.md" "b/\355\225\230\354\235\200\355\230\234/Chap2-\352\260\235\354\262\264\354\235\230_\354\203\235\354\204\261\352\263\274_\355\214\214\352\264\264/item2.md" similarity index 100% rename from "\355\225\230\354\235\200\355\230\234/item2.md" rename to "\355\225\230\354\235\200\355\230\234/Chap2-\352\260\235\354\262\264\354\235\230_\354\203\235\354\204\261\352\263\274_\355\214\214\352\264\264/item2.md" diff --git "a/\355\225\230\354\235\200\355\230\234/item3.md" "b/\355\225\230\354\235\200\355\230\234/Chap2-\352\260\235\354\262\264\354\235\230_\354\203\235\354\204\261\352\263\274_\355\214\214\352\264\264/item3.md" similarity index 100% rename from "\355\225\230\354\235\200\355\230\234/item3.md" rename to "\355\225\230\354\235\200\355\230\234/Chap2-\352\260\235\354\262\264\354\235\230_\354\203\235\354\204\261\352\263\274_\355\214\214\352\264\264/item3.md" diff --git "a/\355\225\230\354\235\200\355\230\234/item4.md" "b/\355\225\230\354\235\200\355\230\234/Chap2-\352\260\235\354\262\264\354\235\230_\354\203\235\354\204\261\352\263\274_\355\214\214\352\264\264/item4.md" similarity index 100% rename from "\355\225\230\354\235\200\355\230\234/item4.md" rename to "\355\225\230\354\235\200\355\230\234/Chap2-\352\260\235\354\262\264\354\235\230_\354\203\235\354\204\261\352\263\274_\355\214\214\352\264\264/item4.md" diff --git "a/\355\225\230\354\235\200\355\230\234/item5.md" "b/\355\225\230\354\235\200\355\230\234/Chap2-\352\260\235\354\262\264\354\235\230_\354\203\235\354\204\261\352\263\274_\355\214\214\352\264\264/item5.md" similarity index 100% rename from "\355\225\230\354\235\200\355\230\234/item5.md" rename to "\355\225\230\354\235\200\355\230\234/Chap2-\352\260\235\354\262\264\354\235\230_\354\203\235\354\204\261\352\263\274_\355\214\214\352\264\264/item5.md" diff --git "a/\355\225\230\354\235\200\355\230\234/item6.md" "b/\355\225\230\354\235\200\355\230\234/Chap2-\352\260\235\354\262\264\354\235\230_\354\203\235\354\204\261\352\263\274_\355\214\214\352\264\264/item6.md" similarity index 100% rename from "\355\225\230\354\235\200\355\230\234/item6.md" rename to "\355\225\230\354\235\200\355\230\234/Chap2-\352\260\235\354\262\264\354\235\230_\354\203\235\354\204\261\352\263\274_\355\214\214\352\264\264/item6.md" diff --git "a/\355\225\230\354\235\200\355\230\234/item7.md" "b/\355\225\230\354\235\200\355\230\234/Chap2-\352\260\235\354\262\264\354\235\230_\354\203\235\354\204\261\352\263\274_\355\214\214\352\264\264/item7.md" similarity index 100% rename from "\355\225\230\354\235\200\355\230\234/item7.md" rename to "\355\225\230\354\235\200\355\230\234/Chap2-\352\260\235\354\262\264\354\235\230_\354\203\235\354\204\261\352\263\274_\355\214\214\352\264\264/item7.md" diff --git "a/\355\225\230\354\235\200\355\230\234/item8.md" "b/\355\225\230\354\235\200\355\230\234/Chap2-\352\260\235\354\262\264\354\235\230_\354\203\235\354\204\261\352\263\274_\355\214\214\352\264\264/item8.md" similarity index 100% rename from "\355\225\230\354\235\200\355\230\234/item8.md" rename to "\355\225\230\354\235\200\355\230\234/Chap2-\352\260\235\354\262\264\354\235\230_\354\203\235\354\204\261\352\263\274_\355\214\214\352\264\264/item8.md" diff --git "a/\355\225\230\354\235\200\355\230\234/Chap2-\352\260\235\354\262\264\354\235\230_\354\203\235\354\204\261\352\263\274_\355\214\214\352\264\264/item9.md" "b/\355\225\230\354\235\200\355\230\234/Chap2-\352\260\235\354\262\264\354\235\230_\354\203\235\354\204\261\352\263\274_\355\214\214\352\264\264/item9.md" new file mode 100644 index 0000000..51bbf02 --- /dev/null +++ "b/\355\225\230\354\235\200\355\230\234/Chap2-\352\260\235\354\262\264\354\235\230_\354\203\235\354\204\261\352\263\274_\355\214\214\352\264\264/item9.md" @@ -0,0 +1,87 @@ +# ITEM 9. try-finally ๋ณด๋‹ค try-with-resouces๋ฅผ ์‚ฌ์šฉํ•˜๋ผ + +> **๊ผญ ํšŒ์ˆ˜ํ•ด์•ผํ•˜๋Š” ์ž์›์„ ๋‹ค๋ฃฐ ๋•Œ๋Š” try-finally ๋ง๊ณ , try-with-resources๋ฅผ ์‚ฌ์šฉํ•˜์ž. ์˜ˆ์™ธ๋Š” ์—†๋‹ค. ์ฝ”๋“œ๋Š” ๋” ์งง๊ณ  ๋ถ„๋ช…ํ•ด์ง€๊ณ , ๋งŒ๋“ค์–ด์ง€๋Š” ์˜ˆ์™ธ ์ •๋ณด๋„ ํ›จ์”ฌ ์œ ์šฉํ•˜๋‹ค. try-finally๋กœ ์ž‘์„ฑํ•˜๋ฉด ์‹ค์šฉ์ ์ด์ง€ ๋ชปํ•  ๋งŒํผ ์ฝ”๋“œ๊ฐ€ ์ง€์ €๋ถ„ํ•ด์ง€๋Š” ๊ฒฝ์šฐ๋ผ๋„, try-with-resources๋กœ๋Š” ์ •ํ™•ํ•˜๊ณ  ์‰ฝ๊ฒŒ ์ž์›์„ ํšŒ์ˆ˜ํ•  ์ˆ˜ ์žˆ๋‹ค.** + +## Try-Finally + +- try-finally๋Š” ๋”์ด์ƒ ์ตœ์„ ์˜ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋‹ค.(์ž๋ฐ”7๋ถ€ํ„ฐ) +- ์ด์ „์—๋Š” try-finally ๊ตฌ๋ฌธ์„ ์ด์šฉํ•ด์„œ ์ž์›์„ ํšŒ์ˆ˜ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜๋Š”๋ฐ, ํšŒ์ˆ˜ํ•ด์•ผ ํ•  ์ž์›์ด ๋งŽ์•„์ง€๋ฉด ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง€๋ฉด์„œ ๊ฐ€๋…์„ฑ์ด ๋‚˜๋น ์ง€๊ณ  ์ž์›์„ ์ œ๋Œ€๋กœ ํšŒ์ˆ˜ํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ๋‹ค. + +```java +// ์ฝ”๋“œ 9-1 : ๊ฐ„๋‹จํ•œ try-finally ์˜ˆ์ œ +// ๋ฌธ์ œ ์—†์ด ์ •์ƒ๋™์ž‘ํ•œ๋‹ค. +static String firstLineOfFile(String path) throws IOException { + BufferedReader br = new BufferedReader(new FileReader(path)); + try { + return br.readLine(); + }finally { + br.close(); + } +} +``` + +```java +// ์ฝ”๋“œ 9-2 : ํšŒ์ˆ˜ํ•ด์•ผํ•  ์ž์›์ด ๋‘˜ ์ด์ƒ์ธ try-finally ์˜ˆ์ œ +// ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ ธ ๊ฐ€๋…์„ฑ์ด ๋‚˜๋น ์ง„๋‹ค. +public class Copy { + + private static final int BUFFER_SIZE = 8 * 1024; + + static void copy(String src, String dst) throws IOException { + + FileInputStream in = new FileInputStream(src); + try { + FileOutputStream out = new FileOutputStream(dst); + try { + byte[] buf = new byte[BUFFER_SIZE]; + int n; + while ((n = in.read(buf)) >= 0) + out.write(buf, 0, n); + }finally { + out.close(); + } + }finally { + in.close(); + } + + } + +} +``` + +```java +// ๋‹จ์ผ try-finally๋กœ ๊ตฌ์„ฑํ•œ ์˜ˆ์ œ +// ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ์ž์›์ด ์ œ๋Œ€๋กœ ํšŒ์ˆ˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. +static void copyLeak(String src, String dst) throws IOException { + FileInputStream in = new FileInputStream(src); + FileOutputStream out = new FileOutputStream(dst); + try { + byte[] buf = new byte[BUFFER_SIZE]; + int n; + while ((n = in.read(buf)) >= 0) + out.write(buf, 0, n); + }finally { + // ์—ฌ๊ธฐ์„œ ์—๋Ÿฌ ๋ฐœ์ƒํ•˜๋ฉด + out.close(); + // ์ด๊ฑด ์‹คํ–‰ ์•ˆ๋จ. + in.close(); + } +} +``` + +## Try-With-Resources + +- try-with-resources๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋” ์งง๊ณ  ๋ถ„๋ช…ํ•˜๋‹ค. + +```java +static String firstLineOfFileWithResources(String path) throws IOException { + try(BufferedReader br = new BadBufferReader(new FileReader(path));) { + return br.readLine(); + } +} +``` + +- ๋งŒ๋“ค์–ด์ง€๋Š” ์˜ˆ์™ธ ์ •๋ณด๋„ ํ›จ์”ฌ ์œ ์šฉํ•˜๋‹ค. + - try-finally๋กœ ์ž‘์„ฑํ•  ๊ฒฝ์šฐ, ์ฒซ๋ฒˆ์งธ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋Š” ๋ณด์—ฌ์ฃผ์ง€ ์•Š๊ณ , ๋งˆ์ง€๋ง‰ ์˜ˆ์™ธ๋งŒ ๋ณด์—ฌ์ง€๋Š” ํ˜•ํƒœ๊ฐ€ ๋œ๋‹ค + - ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์ฒซ๋ฒˆ์งธ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๊ฐ€ ํ›„์† ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„ ์–ด๋–ค ์ง€์ ์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ๋˜์—ˆ๋Š”์ง€๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ฒซ๋ฒˆ์งธ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค. + - try-with-resources ๋ชจ๋“  ์˜ˆ์™ธ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. diff --git "a/\355\225\230\354\235\200\355\230\234/Chap3-\353\252\250\353\223\240_\352\260\235\354\262\264\354\235\230_\352\263\265\355\206\265_\353\251\224\354\204\234\353\223\234/item10.md" "b/\355\225\230\354\235\200\355\230\234/Chap3-\353\252\250\353\223\240_\352\260\235\354\262\264\354\235\230_\352\263\265\355\206\265_\353\251\224\354\204\234\353\223\234/item10.md" new file mode 100644 index 0000000..c8072ad --- /dev/null +++ "b/\355\225\230\354\235\200\355\230\234/Chap3-\353\252\250\353\223\240_\352\260\235\354\262\264\354\235\230_\352\263\265\355\206\265_\353\251\224\354\204\234\353\223\234/item10.md" @@ -0,0 +1,54 @@ +# ITEM 10. equals๋Š” ์ผ๋ฐ˜ ๊ทœ์•ฝ์„ ์ง€์ผœ ์žฌ์ •์˜ํ•˜๋ผ + +> **๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด equals๋ฅผ ์žฌ์ •์˜ํ•˜์ง€ ๋ง์ž. ๋งŽ์€ ๊ฒฝ์šฐ์— Object์˜ equals๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์ด ์›ํ•˜๋Š” ๋น„๊ต๋ฅผ ์ •ํ™•ํžˆ ์ˆ˜ํ–‰ํ•ด์ค€๋‹ค. ์žฌ์ •์˜ํ•ด์•ผ ํ•  ๋•Œ๋Š” ๊ทธ ํด๋ž˜์Šค์˜ ํ•ต์‹ฌ ํ•„๋“œ ๋ชจ๋‘๋ฅผ ๋น ์ง์—†์ด, ๋‹ค์„ฏ ๊ฐ€์ง€ ๊ทœ์•ฝ์„ ํ™•์‹คํžˆ ์ง€์ผœ๊ฐ€๋ฉฐ ๋น„๊ตํ•ด์•ผ ํ•œ๋‹ค.** + +## equals๋ฅผ ์žฌ์ •์˜ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ตœ์„  + +- ๋‹ค์Œ์˜ ๊ฒฝ์šฐ์— ํ•ด๋‹นํ•œ๋‹ค๋ฉด equals๋ฅผ ์žฌ์ •์˜ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. +- ๊ฐ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ณธ์งˆ์ ์œผ๋กœ ๊ณ ์œ ํ•˜๋‹ค. +- ์ธ์Šคํ„ด์Šค์˜ โ€˜๋…ผ๋ฆฌ์  ๋™์น˜์„ฑโ€™์„ ๊ฒ€์‚ฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. + - String๊ณผ ๊ฐ™์€ ์ž๋ฃŒํ˜• +- ์ƒ์œ„ ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜ํ•œ equls๊ฐ€ ํ•˜์œ„ ํด๋ž˜์Šค์—๋„ ์ ์ ˆํ•˜๋‹ค. + - list๋‚˜ set์˜ ๊ฒฝ์šฐ, list๋Š” abstract list์— set์€ abstract set์— ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค. +- ํด๋ž˜์Šค๊ฐ€ private์ด๊ฑฐ๋‚˜ package-private์ด๊ณ  equals ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ผ์ด ์—†๋‹ค. + - publicํด๋ž˜์Šค๋Š” ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด equals ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ์ผ์ด ์žˆ์„ ์ง€ ์•„๋‹ ์ง€ ์•Œ ์ˆ˜๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— equals ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ ์žฅ๋‹ดํ•  ์ˆ˜ ์—†๋‹ค. ํ•˜์ง€๋งŒ ์ œํ•œ๋˜์–ด ์žˆ๋Š” ํด๋ž˜์Šค์ธ ๊ฒฝ์šฐ, equals๋ฅผ ์•ˆ์“ธ๊บผ๋ผ๋Š” ๊ฒƒ์„ ์–ด๋А์ •๋„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. +- equals๋ฅผ ์žฌ์ •์˜ ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ + - ๊ฐ์ฒด ์‹๋ณ„์„ฑ(object identity, ๋‘ ๊ฐ์ฒด๊ฐ€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ฐ™์€๊ฐ€)์ด ์•„๋‹Œ โ€œ๋…ผ๋ฆฌ์  ๋™์น˜์„ฑโ€์„ ํ™•์ธํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ƒ์œ„ ํด๋ž˜์Šค์˜ equals๊ฐ€ ๋…ผ๋ฆฌ์  ๋™์น˜์„ฑ์„ ๋น„๊ตํ•˜๋„๋ก ์žฌ์ •์˜ ๋˜์ง€ ์•Š์•˜์„ ๋•Œ (์ฃผ๋กœ ๊ฐ’ ํด๋ž˜์Šค) + +## equals ๊ทœ์•ฝ + +- ๋ฐ˜์‚ฌ์„ฑ : A.equals(A) == true +- ๋Œ€์นญ์„ฑ : A.equals(B) == B.equals(A) + - CaseInsensitiveString + - Date์™€ Timestamp๋Š” ์ด ๋Œ€์นญ์„ฑ ๊ทœ์•ฝ์ด ๊นจ์ ธ์žˆ๋‹ค.(๋‘˜์€ ์ƒ์†๊ด€๊ณ„) + - ์•ˆ์ •์ ์œผ๋กœ ๋Œ€์นญ์„ฑ์ด ์œ ์ง€๋œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ƒ์†๊ด€๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋‚ด๋ถ€์—์„œ ์„ ์–ธํ•˜์—ฌ ๊ฐ๊ฐ์˜ ํ•„๋“œ๊ฐ€ ๊ฐ™์€์ง€ ํ™•์ธํ•˜๋Š” ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค. +- ์ถ”์ด์„ฑ : A.equals(B) && B.equal(C), A.equals(C) + - Point, ColorPoint(inherit), CounterPointer, ColorPoint(comp) +- ์ผ๊ด€์„ฑ : A.equals(B) == A.equals(B) + - ์ผ๊ด€์„ฑ์„ ์ง€ํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ฒŒ ๊ตฌ์„ฑํ•˜๋ฉด ์•ˆ๋œ๋‹ค. + - ๋ณต์žกํ•˜๊ฒŒ ๋˜์–ด์žˆ๋Š” ์˜ˆ์‹œ๋กœ๋Š” URL์— ์žˆ๋Š” equals ์ด๋‹ค. URL์— ์žˆ๋Š” equals๋Š” ๊ทธ URL์ด ๊ฐ€๋ฅดํ‚ค๋Š” ip๊นŒ์ง€๋ฅผ ํ™•์ธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๊ด€์„ฑ์ด ๊นจ์ง„๋‹ค. +- null-์•„๋‹˜ : A.equals(null) == false + +## equals ๊ตฌํ˜„ ๋ฐฉ๋ฒ• + +- == ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ์ž๊ธฐ ์ž์‹ ์˜ ์ฐธ์กฐ์ธ์ง€ ํ™•์ธํ•œ๋‹ค. +- instanceof ์—ฐ์‚ฐ์ž๋กœ ์˜ฌ๋ฐ”๋ฅธ ํƒ€์ž…์ธ์ง€ ํ™•์ธํ•œ๋‹ค. +- ์ž…๋ ฅ๋œ ๊ฐ’์„ ์˜ฌ๋ฐ”๋ฅธ ํƒ€์ž…์œผ๋กœ ํ˜•๋ณ€ํ™˜ ํ•œ๋‹ค. +- ์ž…๋ ฅ ๊ฐ์ฒด์™€ ์ž๊ธฐ ์ž์‹ ์˜ ๋Œ€์‘๋˜๋Š” ํ•ต์‹ฌ ํ•„๋“œ๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. +- ์ถ”๊ฐ€. + - float์ด๋‚˜ double๊ณผ ๊ฐ™์€ ๋ถ€๋™์†Œ์ˆ˜์ ์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ์ž๋ฃŒํ˜•๋“ค์€ equals๊ฐ€ ์•„๋‹Œ ํ•ด๋‹น ์ž๋ฃŒํ˜•์—์„œ ์ œ๊ณตํ•˜๋Š” compare()ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋น„๊ตํ•˜๋ผ. + - ๋ ˆํผ๋Ÿฐ์Šค ํƒ€์ž…์˜ ๊ฒฝ์šฐ๋Š” ๋ ˆํผ๋Ÿฐ์Šค ํƒ€์ž…์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” equals๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๊ตํ•˜๋ฉด ๋œ๋‹ค. + - null์„ ํ—ˆ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด Objecs.equals()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. + +- ๊ตฌ๊ธ€์˜ AutoValue ๋˜๋Š” Lombok์„ ์‚ฌ์šฉํ•œ๋‹ค. +- IDE์˜ ์ฝ”๋“œ ์ƒ์„ฑ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•œ๋‹ค. + - ์ฝ”๋“œ๊ฐ€ ์•ฝ๊ฐ„ ์ง€์ €๋ถ„ํ•ด์งˆ ์ˆ˜ ์žˆ๊ณ , ํ•„๋“œ๊ฐ€ ๋Š˜์–ด๋‚  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ๋งŒ๋“ค์–ด์ค˜์•ผํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. +- Record ๊ธฐ๋Šฅ + - ์ž๋ฐ”14๋ฒ„์ „๋ถ€ํ„ฐ ๋“ค์–ด๊ฐ€ ์žˆ๊ณ , ์ž๋ฐ” ๋ฒ„์ „์˜ 15๋ฒ„์ „๋ถ€ํ„ฐ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. + - ์ž๋ฐ” 17๋ฒ„์ „์ด์ƒ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•. + +- ์ฃผ์˜์‚ฌํ•ญ + - equals๋ฅผ ์žฌ์ •์˜ ํ•  ๋•Œ hashCode๋„ ๋ฐ˜๋“œ์‹œ ์žฌ์ •์˜ํ•˜์ž(์•„์ดํ…œ11) + - ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ฒŒ ํ•ด๊ฒฐํ•˜์ง€ ๋ง์ž. + - Object๊ฐ€ ์•„๋‹Œ ํƒ€์ž…์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›๋Š” equals ๋ฉ”์„œ๋“œ๋Š” ์„ ์–ธํ•˜์ง€ ๋ง์ž. + - ๋…ผ๋ฆฌ์ ์ธ ๋™์น˜์„ฑ์„ ๋ณด์žฅํ•˜๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ equals ๋ฉ”์†Œ๋“œ๋ฅผ orverride ํ•ด์•ผํ•œ๋‹ค. diff --git "a/\355\225\230\354\235\200\355\230\234/Chap3-\353\252\250\353\223\240_\352\260\235\354\262\264\354\235\230_\352\263\265\355\206\265_\353\251\224\354\204\234\353\223\234/item11.md" "b/\355\225\230\354\235\200\355\230\234/Chap3-\353\252\250\353\223\240_\352\260\235\354\262\264\354\235\230_\352\263\265\355\206\265_\353\251\224\354\204\234\353\223\234/item11.md" new file mode 100644 index 0000000..119a251 --- /dev/null +++ "b/\355\225\230\354\235\200\355\230\234/Chap3-\353\252\250\353\223\240_\352\260\235\354\262\264\354\235\230_\352\263\265\355\206\265_\353\251\224\354\204\234\353\223\234/item11.md" @@ -0,0 +1,39 @@ +# ITEM 11. equals๋ฅผ ์žฌ์ •์˜ํ•˜๋ ค๊ฑฐ๋“  hashCode๋„ ์žฌ์ •์˜ํ•˜๋ผ + +> **equals๋ฅผ ์žฌ์ •์˜ํ•  ๋•Œ๋Š” hashCode๋„ ๋ฐ˜๋“œ์‹œ ์žฌ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. ์žฌ์ •์˜ํ•œ hashCode๋Š” Object์˜ API๋ฌธ์„œ์— ๊ธฐ์ˆ ๋œ ์ผ๋ฐ˜ ๊ทœ์•ฝ์„ ๋”ฐ๋ผ์•ผ ํ•˜๋ฉฐ, ์„œ๋กœ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋ผ๋ฉด ๋˜๋„๋ก ํ•ด์‹œ์ฝ”๋“œ๋„ ์„œ๋กœ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์ง€๋Š” ์•Š์ง€๋งŒ ์กฐ๊ธˆ ๋”ฐ๋ถ„ํ•œ ์ผ์ด๊ธด ํ•˜๋‹ค. ํ•˜์ง€๋งŒ ๊ฑฑ์ •๋งˆ์‹œ๋ผ. ์•„์ดํ…œ 10์—์„œ ์ด์•ผ๊ธฐํ•œ AutoValue ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ‹์ง„ equals์™€ hashCode๋ฅผ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค. IDE๋“ค๋„ ์ด๋Ÿฐ ๊ธฐ๋Šฅ์„ ์ผ๋ถ€ ์ œ๊ณตํ•œ๋‹ค.** + +## hashCode ๊ทœ์•ฝ + +- equals ๋น„๊ต์— ์‚ฌ์šฉํ•˜๋Š” ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด hashCode๋Š” ๋งค๋ฒˆ ๊ฐ™์€ ๊ฐ’์„ ๋ฆฌํ„ดํ•ด์•ผ ํ•œ๋‹ค. ( ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค์‹œ ์‹คํ–‰ํ–ˆ๋‹ค๋ฉด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค. ) +- **๋‘ ๊ฐ์ฒด์— ๋Œ€ํ•œ equals๊ฐ€ ๊ฐ™๋‹ค๋ฉด, hashCode์˜ ๊ฐ’๋„ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.** +- ๋‘ ๊ฐ์ฒด์— ๋Œ€ํ•œ equals๊ฐ€ ๋‹ค๋ฅด๋”๋ผ๋„, hashCode์˜ ๊ฐ’์€ ๊ฐ™์„ ์ˆ˜ ์žˆ์ง€๋งŒ ํ•ด์‹œ ํ…Œ์ด๋ธ” **์„ฑ๋Šฅ์„ ๊ณ ๋ คํ•ด ๋‹ค๋ฅธ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.** + - ํ•ญ์ƒ ๊ฐ™์€ hashCode๋ฅผ ๋ฆฌํ„ดํ•˜๊ฒŒ ๋˜๋ฉด ์„ฑ๋Šฅ์ด O(1) ์—์„œ O(n) ์œผ๋กœ ๋–จ์–ด์ง€๊ฒŒ ๋œ๋‹ค. + +## hashCode ๊ตฌํ˜„ ๋ฐฉ๋ฒ• + +```java +@Override public int hashCode() { + int result = Short.hashCode(areaCode); // 1 + result = 31 * result + Short.hashCode(prefix); // 2 + result = 31 * result + Short.hashCode(lineNum); // 3 + return result; +} + +// areacode, prefix, lineNum์€ PhoneNumber(์„ ์–ธํ•œ ํด๋ž˜์Šค)ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜๋‹ค. +``` + +1. ํ•ต์‹ฌ ํ•„๋“œ ํ•˜๋‚˜์˜ ๊ฐ’์˜ ํ•ด์‰ฌ๊ฐ’์„ ๊ณ„์‚ฐํ•ด์„œ result ๊ฐ’์„ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค. +2. ๊ธฐ๋ณธ ํƒ€์ž…์€ Type.hashCode + ์ฐธ์กฐ ํƒ€์ž…์€ ํ•ด๋‹น ํ•„๋“œ์˜ hashCode + ๋ฐฐ์—ด์€ ๋ชจ๋“  ์›์†Œ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ์œ„์˜ ๋กœ์ง์„ ์ ์šฉํ•˜๊ฑฐ๋‚˜, Arrays.hashCode + result = 31 * result + ํ•ด๋‹น ํ•„๋“œ์˜ hashCode ๊ณ„์‚ฐ๊ฐ’ +3. result๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. + +- 31์ธ ์ด์œ  + - ํ™€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค. (์ง์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋น„ํŠธ์—ฐ์‚ฐ์ด ๋ฐœ์ƒํ•˜์—ฌ ๊ฐ’์ด ์™ผ์ชฝ์œผ๋กœ ๋ฐ€๋ฆฌ๋ฉด์„œ ๋‚ ์•„๊ฐˆ์ˆ˜ ์žˆ๋‹ค.) + - ํ•ด์‹œ ์ถฉ๋Œ์ด ๊ฐ€์žฅ ์ ๊ฒŒ ๋‚˜๋Š” ์ˆซ์ž์ด๋‹ค. + +## ๊ธฐํƒ€ + +- ๊ทธ๋ƒฅ ์ž๋ฐ”์˜ Objects.hash()๋ฅผ ์จ๋ผ. +- equals์™€ hashCode๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ํ•ด๋‹น ๊ตฌํ˜„์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋„ ํ•ด์•ผํ•œ๋‹ค. ํ•˜์ง€๋งŒ lombok์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ๋ถ€๋ถ„์€ ํ…Œ์ŠคํŠธ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. diff --git "a/\355\225\230\354\235\200\355\230\234/Chap3-\353\252\250\353\223\240_\352\260\235\354\262\264\354\235\230_\352\263\265\355\206\265_\353\251\224\354\204\234\353\223\234/item12.md" "b/\355\225\230\354\235\200\355\230\234/Chap3-\353\252\250\353\223\240_\352\260\235\354\262\264\354\235\230_\352\263\265\355\206\265_\353\251\224\354\204\234\353\223\234/item12.md" new file mode 100644 index 0000000..4969997 --- /dev/null +++ "b/\355\225\230\354\235\200\355\230\234/Chap3-\353\252\250\353\223\240_\352\260\235\354\262\264\354\235\230_\352\263\265\355\206\265_\353\251\224\354\204\234\353\223\234/item12.md" @@ -0,0 +1,11 @@ +# ITEM 12. toString์„ ํ•ญ์ƒ ์žฌ์ •์˜ํ•˜๋ผ + +> **๋ชจ๋“  ๊ตฌ์ฒด ํด๋ž˜์Šค์—์„œ Object์˜ toString์„ ์žฌ์ •์˜ํ•˜์ž. ์ƒ์œ„ ํด๋ž˜์Šค์—์„œ ์ด๋ฏธ ์•Œ๋งž๊ฒŒ ์žฌ์ •์˜ํ•œ ๊ฒฝ์šฐ๋Š” ์˜ˆ์™ธ๋‹ค. toString์„ ์žฌ์ •์˜ํ•œ ํด๋ž˜์Šค๋Š” ์‚ฌ์šฉํ•˜๊ธฐ๋„ ์ฆ๊ฒ๊ณ  ๊ทธ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ ์‹œ์Šคํ…œ์„ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ํ•ด์ค€๋‹ค. toString์€ ํ•ด๋‹น ๊ฐ์ฒด์— ๊ด€ํ•œ ๋ช…ํ™•ํ•˜๊ณ  ์œ ์šฉํ•œ ์ •๋ณด๋ฅผ ์ฝ๊ธฐ ์ข‹์€ ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.** + +- toString์€ ๊ฐ„๊ฒฐํ•˜๋ฉด์„œ ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ์‰ฌ์šด ํ˜•ํƒœ์˜ ์œ ์ตํ•œ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค. +- Object์˜ toString์€ ํด๋ž˜์Šค์ด๋ฆ„@16์ง„์ˆ˜๋กœ ํ‘œ์‹œํ•œ ํ•ด์‹œ ์ฝ”๋“œ +- ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง„ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.(๊ฐ•์‚ฌ๋‹˜์€ ๋™์˜ํ•˜์ง€ ์•Š์Œ) +- ๊ฐ’ ํด๋ž˜์Šค๋ผ๋ฉด ํฌ๋งท์„ ๋ฌธ์„œ์— ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์œผ๋ฉฐ ํ•ด๋‹น ํฌ๋งท์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ •์  ํŒฉํ„ฐ๋ฆฌ๋‚˜ ์ƒ์„ฑ์ž๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. +- toString์ด ๋ฐ˜ํ™˜ํ•œ ๊ฐ’์— ํฌํ•จ๋œ ์ •๋ณด๋ฅผ ์–ป์–ด์˜ฌ ์ˆ˜ ์žˆ๋Š” API๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. +- ๊ฒฝ์šฐ์— ๋”ฐ๋ผ AutoValue, ๋กฌ๋ณต ๋˜๋Š” IDE๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๊ฒŒ ์ ์ ˆํ•  ์ˆ˜ ์žˆ๋‹ค. + - ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ์ชผ๊ฐœ์„œ ๊ฐ ๋ณ€์ˆ˜๋กœ ์ €์žฅํ•˜๋Š” ํด๋ž˜์Šค ๊ฐ™์€ ๊ฒฝ์šฐ ํ•œ ์ค„, ํ˜น์€ ํฌ๋งท๋Œ€๋กœ ๋‚˜์˜ค๋Š” ๊ฒƒ์ด ์ ์ ˆํ•  ์ˆ˜ ์žˆ๋‹ค. diff --git "a/\355\225\230\354\235\200\355\230\234/Chap3-\353\252\250\353\223\240_\352\260\235\354\262\264\354\235\230_\352\263\265\355\206\265_\353\251\224\354\204\234\353\223\234/item13.md" "b/\355\225\230\354\235\200\355\230\234/Chap3-\353\252\250\353\223\240_\352\260\235\354\262\264\354\235\230_\352\263\265\355\206\265_\353\251\224\354\204\234\353\223\234/item13.md" new file mode 100644 index 0000000..28667d5 --- /dev/null +++ "b/\355\225\230\354\235\200\355\230\234/Chap3-\353\252\250\353\223\240_\352\260\235\354\262\264\354\235\230_\352\263\265\355\206\265_\353\251\224\354\204\234\353\223\234/item13.md" @@ -0,0 +1,32 @@ +# ITEM 13. clone ์žฌ์ •์˜๋Š” ์ฃผ์˜ํ•ด์„œ ์ง„ํ–‰ํ•˜๋ผ + +> **Cloneable์ด ๋ชฐ๊ณ  ์˜จ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ๋˜์งš์–ด๋ดค์„ ๋•Œ, ์ƒˆ๋กœ์šด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ๋Š” ์ ˆ๋•Œ Cloneable์„ ํ™•์žฅํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋„ ์ด๋ฅผ ๊ตฌํ˜„ํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค. final ํด๋ž˜์Šค๋ผ๋ฉด Cloneable์„ ๊ตฌํ˜„ํ•ด๋„ ์œ„ํ—˜์ด ํฌ์ง€ ์•Š์ง€๋งŒ, ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ด€์ ์—์„œ ๊ฒ€ํ† ํ•œ ํ›„ ๋ณ„๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์—†์„ ๋•Œ๋งŒ ๋“œ๋ฌผ๊ฒŒ ํ—ˆ์šฉํ•ด์•ผํ•œ๋‹ค. (์•„์ดํ…œ 67). ๊ธฐ๋ณธ ์›์น™์€ โ€˜๋ณต์ œ ๊ธฐ๋Šฅ์€ ์ƒ์„ฑ์ž์™€ ํŒฉํ„ฐ๋ฆฌ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒŒ ์ตœ๊ณ โ€™๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ๋‹จ, ๋ฐฐ์—ด๋งŒ์€ clone ๋ฉ”์„œ๋“œ ๋ฐฉ์‹์ด ๊ฐ€์žฅ ๊น”๋”ํ•œ, ์ด ๊ทœ์น™์˜ ํ•ฉ๋‹นํ•œ ์˜ˆ์™ธ๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.** + +## ์• ๋งค๋ชจํ˜ธํ•œ clone ๊ทœ์•ฝ + +- clone ๊ทœ์•ฝ + - x.clone() != x `๋ฐ˜๋“œ์‹œ true` + - x.clone().getClass == x.getClass() `๋ฐ˜๋“œ์‹œ true` + - x.clone().equals(x) `true๊ฐ€ ์•„๋‹ ์ˆ˜๋„ ์žˆ๋‹ค.` +- ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ผ๋ฉด ๋‹ค์Œ์œผ๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค. + - Cloneable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  + - clone ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•œ๋‹ค. ์ด๋•Œ super.clone()์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. + +## hashCode ๊ตฌํ˜„ ๋ฐฉ๋ฒ• + +- ์ ‘๊ทผ ์ œํ•œ์ž๋Š” public, ๋ฐ˜ํ™˜ ํƒ€์ž…์€ ์ž์‹ ์˜ ํด๋ž˜์Šค๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค. +- super.clone์„ ํ˜ธ์ถœํ•œ ๋’ค ํ•„์š”ํ•œ ํ•„๋“œ๋ฅผ ์ ์ ˆํžˆ ์ˆ˜์ •ํ•œ๋‹ค. + - ๋ฐฐ์—ด์„ ๋ณต์ œํ•  ๋•Œ๋Š” ๋ฐฐ์—ด์˜ clone ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ. + - ๊ฒฝ์šฐ์— ๋”ฐ๋ผ final์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์„์ง€๋„ ๋ชจ๋ฅธ๋‹ค. + - ํ•„์š”ํ•œ ๊ฒฝ์šฐ deep copy๋ฅผ ํ•ด์•ผํ•œ๋‹ค. + - super.clone์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“  ๋’ค, ๊ณ ์ˆ˜์ค€ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค. + - ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋Š” ์ฐธ์กฐํ•˜์ง€ ์•Š๋„๋ก ์กฐ์‹ฌํ•ด์•ผ ํ•œ๋‹ค. + - ์ƒ์†์šฉ ํด๋ž˜์Šค๋Š” Cloneable์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. + - Cloneable์„ ๊ตฌํ˜„ํ•œ ์Šค๋ ˆ๋“œ ์•ˆ์ „ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•  ๋•Œ๋Š” ๋™๊ธฐํ™”๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค. + +## ๊ธฐํƒ€ + +- โ€œ๋ณต์‚ฌ ์ƒ์„ฑ์žโ€ ๋˜๋Š” ๋ณ€ํ™˜ ์ƒ์„ฑ์ž, โ€œ๋ณต์‚ฌ ํŒฉํ„ฐ๋ฆฌโ€ ๋˜๋Š” ๋ณ€ํ™˜ ํŒฉํ„ฐ๋ฆฌ +- ์ƒ์„ฑ์ž๋ฅผ ์“ฐ์ง€ ์•Š์œผ๋ฉฐ, ๋ชจํ˜ธํ•œ ๊ทœ์•ฝ, ๋ถˆํ•„์š”ํ•œ ๊ฒ€์‚ฌ ์˜ˆ์™ธ, final ์šฉ๋ฒ• ๋ฐฉํ•ด ๋“ฑ์—์„œ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค. +- ๋˜ ๋‹ค๋ฅธ ํฐ ์žฅ์  ์ค‘ ํ•˜๋‚˜๋กœ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ธ์ˆ˜๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. + - ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณต์ œ๋ณธ์˜ ํƒ€์ž…์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. diff --git "a/\355\225\230\354\235\200\355\230\234/Chap3-\353\252\250\353\223\240_\352\260\235\354\262\264\354\235\230_\352\263\265\355\206\265_\353\251\224\354\204\234\353\223\234/item14.md" "b/\355\225\230\354\235\200\355\230\234/Chap3-\353\252\250\353\223\240_\352\260\235\354\262\264\354\235\230_\352\263\265\355\206\265_\353\251\224\354\204\234\353\223\234/item14.md" new file mode 100644 index 0000000..757bc33 --- /dev/null +++ "b/\355\225\230\354\235\200\355\230\234/Chap3-\353\252\250\353\223\240_\352\260\235\354\262\264\354\235\230_\352\263\265\355\206\265_\353\251\224\354\204\234\353\223\234/item14.md" @@ -0,0 +1,118 @@ +# ITEM 14. Comparable์„ ๊ตฌํ˜„ํ• ์ง€ ๊ณ ๋ฏผํ•˜๋ผ + +> **์ˆœ์„œ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š” ๊ฐ’ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๋ฉด ๊ผญ Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ, ๊ทธ ์ธ์Šคํ„ด์Šค๋“ค์„ ์‰ฝ๊ฒŒ ์ •๋ ฌํ•˜๊ณ , ๊ฒ€์ƒ‰ํ•˜๊ณ , ๋น„๊ต ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์ปฌ๋ ‰์…˜๊ณผ ์–ด์šฐ๋Ÿฌ์ง€๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค. compareTo ๋ฉ”์„œ๋“œ์—์„œ ํ•„๋“œ์˜ ๊ฐ’์„ ๋น„๊ตํ•  ๋•Œ โ€œ<โ€ ์™€ โ€œ>โ€ ์—ฐ์‚ฐ์ž๋Š” ์“ฐ์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค. ๊ทธ ๋Œ€์‹  ๋ฐ•์‹ฑ๋œ ๊ธฐ๋ณธ ํƒ€์ž… ํด๋ž˜์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ •์  compare ๋ฉ”์„œ๋“œ๋‚˜ Comparator ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋น„๊ต์ž ์ƒ์„ฑ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ž.** + +## compareTo ๊ทœ์•ฝ + +- Object.equals์— ๋”ํ•ด์„œ ์ˆœ์„œ๊นŒ์ง€ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ Generic์„ ์ง€์›ํ•œ๋‹ค. +- ์ž๊ธฐ ์ž์‹ ์ด(this)์ด compareTo์— ์ „๋‹ฌ๋œ ๊ฐ์ฒด๋ณด๋‹ค ์ž‘์œผ๋ฉด ์Œ์ˆ˜, ๊ฐ™์œผ๋ฉด 0, ํฌ๋‹ค๋ฉด ์–‘์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. +- ๋ฐ˜์‚ฌ์„ฑ, ๋Œ€์นญ์„ฑ, ์ถ”์ด์„ฑ์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค. +- ๋ฐ˜๋“œ์‹œ ๋”ฐ๋ผ์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ x.compareTo(y) == 0 ์ด๋ผ๋ฉด x.equals(y)๊ฐ€ true์—ฌ์•ผ ํ•œ๋‹ค. + - BigDecimal์€ ์œ„ ์กฐ๊ฑด์„ ์„ฑ๋ฆฝํ•˜์ง€ ๋ชปํ•œ๋‹ค. + - new BigDecimal(โ€1.0โ€)๊ณผ new BigDecimal(โ€1.00โ€)์€ compareTo๋Š” 0์ด ๋‚˜์˜ค์ง€๋งŒ, equals๋Š” false๋‹ค. + +## compareTo ๊ตฌํ˜„ ๋ฐฉ๋ฒ• 1 +- ์ž์—ฐ์ ์ธ ์ˆœ์„œ๋ฅผ ์ œ๊ณตํ•  ํด๋ž˜์Šค์— implements Comparable ์„ ์„ ์–ธํ•œ๋‹ค. + + ```java + // PhoneNumber๋ฅผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ ๋‹ค. (91-92์ชฝ) + public final class PhoneNumber implements Cloneable, Comparable { + private final short areaCode, prefix, lineNum; + + public PhoneNumber(int areaCode, int prefix, int lineNum) { + this.areaCode = rangeCheck(areaCode, 999, "์ง€์—ญ์ฝ”๋“œ"); + this.prefix = rangeCheck(prefix, 999, "ํ”„๋ฆฌํ”ฝ์Šค"); + this.lineNum = rangeCheck(lineNum, 9999, "๊ฐ€์ž…์ž ๋ฒˆํ˜ธ"); + } + + private static short rangeCheck(int val, int max, String arg) { + if (val < 0 || val > max) + throw new IllegalArgumentException(arg + ": " + val); + return (short) val; + } + + @Override public boolean equals(Object o) { + if (o == this) + return true; + if (!(o instanceof PhoneNumber)) + return false; + PhoneNumber pn = (PhoneNumber)o; + return pn.lineNum == lineNum && pn.prefix == prefix + && pn.areaCode == areaCode; + } + + @Override public int hashCode() { + int result = Short.hashCode(areaCode); + result = 31 * result + Short.hashCode(prefix); + result = 31 * result + Short.hashCode(lineNum); + return result; + } + + /** + * ์ด ์ „ํ™”๋ฒˆํ˜ธ์˜ ๋ฌธ์ž์—ด ํ‘œํ˜„์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. + * ์ด ๋ฌธ์ž์—ด์€ "XXX-YYY-ZZZZ" ํ˜•ํƒœ์˜ 12๊ธ€์ž๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. + * XXX๋Š” ์ง€์—ญ ์ฝ”๋“œ, YYY๋Š” ํ”„๋ฆฌํ”ฝ์Šค, ZZZZ๋Š” ๊ฐ€์ž…์ž ๋ฒˆํ˜ธ๋‹ค. + * ๊ฐ๊ฐ์˜ ๋Œ€๋ฌธ์ž๋Š” 10์ง„์ˆ˜ ์ˆซ์ž ํ•˜๋‚˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. + * + * ์ „ํ™”๋ฒˆํ˜ธ์˜ ๊ฐ ๋ถ€๋ถ„์˜ ๊ฐ’์ด ๋„ˆ๋ฌด ์ž‘์•„์„œ ์ž๋ฆฟ์ˆ˜๋ฅผ ์ฑ„์šธ ์ˆ˜ ์—†๋‹ค๋ฉด, + * ์•ž์—์„œ๋ถ€ํ„ฐ 0์œผ๋กœ ์ฑ„์›Œ๋‚˜๊ฐ„๋‹ค. ์˜ˆ์ปจ๋Œ€ ๊ฐ€์ž…์ž ๋ฒˆํ˜ธ๊ฐ€ 123์ด๋ผ๋ฉด + * ์ „ํ™”๋ฒˆํ˜ธ์˜ ๋งˆ์ง€๋ง‰ ๋„ค ๋ฌธ์ž๋Š” "0123"์ด ๋œ๋‹ค. + */ + @Override public String toString() { + return String.format("%03d-%03d-%04d", + areaCode, prefix, lineNum); + } + + // ์ฝ”๋“œ 14-2 ๊ธฐ๋ณธ ํƒ€์ž… ํ•„๋“œ๊ฐ€ ์—ฌ๋Ÿฟ์ผ ๋•Œ์˜ ๋น„๊ต์ž (91์ชฝ) + @Override + public int compareTo(PhoneNumber pn) { + int result = Short.compare(areaCode, pn.areaCode); + if (result == 0) { + result = Short.compare(prefix, pn.prefix); + if (result == 0) + result = Short.compare(lineNum, pn.lineNum); + } + return result; + } + + + private static PhoneNumber randomPhoneNumber() { + Random rnd = ThreadLocalRandom.current(); + return new PhoneNumber((short) rnd.nextInt(1000), + (short) rnd.nextInt(1000), + (short) rnd.nextInt(10000)); + } + } + ``` + +- compareTo ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•œ๋‹ค. + + ```java + @Override + public int compareTo(PhoneNumber pn) { + int result = Short.compare(areaCode, pn.areaCode); + + if (result == 0) { + result = Short.compare(prefix, pn.prefix); + + if (result == 0) + result = Short.compare(lineNum, pn.lineNum); + } + return result; + } + ``` + +- compareTo ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ ๊ธฐ๋ณธ ํƒ€์ž…์€ ๋ฐ•์‹ฑ๋œ ๊ธฐ๋ณธ ํƒ€์ž…์˜ compare์„ ์‚ฌ์šฉํ•ด ๋น„๊ตํ•œ๋‹ค. +- ํ•ต์‹ฌ ํ•„๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ๋ผ๋ฉด ๋น„๊ต ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค. ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํ•„๋“œ๋ฅผ ๋น„๊ตํ•˜๊ณ  ๊ทธ ๊ฐ’์ด 0์ด๋ผ๋ฉด ๋‹ค์Œ ํ•„๋“œ๋ฅผ ๋น„๊ตํ•œ๋‹ค. +- ๊ธฐ์กด ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•˜๊ณ  ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ compareTo ๊ทœ์•ฝ์„ ์ง€ํ‚ฌ ์ˆ˜ ์—†๋‹ค. + - Composition์„ ํ™œ์šฉํ•  ๊ฒƒ. + +## compareTo ๊ตฌํ˜„ ๋ฐฉ๋ฒ• 2 + +- ์ž๋ฐ” 8๋ถ€ํ„ฐ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค, ๋žŒ๋‹ค, ๋ฉ”์„œ๋“œ ๋ ˆํผ๋Ÿฐ์Šค ์™€ Comparator๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ๋ฉ”์„œ๋“œ์™€ static ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ Comparator๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. +- Comparator๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• + - Comparator์˜ static ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ Comparator ์ธ์Šคํ„ด์Šค ๋งŒ๋“ค๊ธฐ + - ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด default ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ด์–ด๊ฐ€๊ธฐ (์ฒด์ด๋‹) + - static ๋ฉ”์„œ๋“œ์™€ default ๋ฉ”์†Œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ๋Š” ๋žŒ๋‹ค ํ‘œํ˜„์‹ ๋˜๋Š” ๋ฉ”์„œ๋“œ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. +- Comparator ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ๊ธฐ๊ฐ€ ํŽธํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. +- Comparator ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ์‹œ ์„ฑ๋Šฅ์ด ์•ฝ 10% ์ •๋„ ๋А๋ฆฌ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค๊ณ ๋Š” ํ•˜์ง€๋งŒ ํฌ๊ฒŒ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋  ๊ฒƒ ๊ฐ™๋‹ค.