Effective Java

toString์ ํญ์ ์ฌ์ ์ํ๋ผ Object์ ๊ธฐ๋ณธ toString ๋ฉ์๋๋ ์ปค์คํ ์ผ๋ก ์์ฑ๋ ํด๋์ค์ ์ ํฉํ ๋ฌธ์์ด์ ๋ฐํํ๋ ๊ฒฝ์ฐ๊ฐ ๊ฑฐ์ ์๊ณ , ํด๋์ค์ด๋ฆ@ํด์์ฝ๋ ํํ๋ก ๋ฐํํ๋ค. toString์ ์ผ๋ฐ ๊ท์ฝ ์ค... ๊ฐ๊ฒฐํ๋ฉด์ ์ฌ๋์ด ์ฝ๊ธฐ ์ฌ์ด ํํ์ ์ ์ตํ ์ ๋ณด๋ฅผ ๋ฐํํ๋ผ ๋ชจ๋ ํ์ ํด๋์ค์์ ์ด ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๋ผ ์ค์ ์์ toString์ ๊ทธ ๊ฐ์ฒด๊ฐ ๊ฐ์ง ์ฃผ์ ์ ๋ณด ๋ชจ๋๋ฅผ ๋ฐํํ๋ ๊ฒ ์ข๋ค. ๊ฐ์ฒด๋ฅผ ์ถ๋ ฅํ์ ๋ {Jenny=PhoneNumber@123dsdfa12l} ์ด๋ฐ ์ ๋ณด๋ณด๋ค๋ {Jenny=707-349-1284}๋ผ๋ ๋ฉ์์ง๊ฐ ํจ์ฌ ์ ์ตํ ์ ๋ณด๋ผ๊ณ ํ ์ ์๋ค. โก๏ธ ์ค์ค๋ก๋ฅผ ์๋ฒฝํ ์ค๋ช ํ๋ ๋ฌธ์์ด์ด์ด์ผ ํ๋ค. ๊ณ ๋ คํด๋ณผ ์ฌํญ ๋ฐํ๊ฐ์ ํฌ๋งท์ ๋ฌธ์ํํ ์ง ์ ํด์ผ ํ๋ค. ์ ํ๋ฒํธ๋ ํ๋ ฌ ๊ฐ..

equals๋ฅผ ์ฌ์ ์ํ๋ ค๊ฑฐ๋ hashCode๋ ์ฌ์ ์ํ๋ผ equals๋ฅผ ์ฌ์ ์ํ ํด๋์ค ๋ชจ๋์์ hashCode๋ ์ฌ์ ์ํด์ผ ํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด hashCode์ ์ผ๋ฐ ๊ท์ฝ์ ์ด๊ธฐ๊ฒ ๋์ด ํด๋น ํด๋์ค์ ์ธ์คํด์ค๋ฅผ HashMap, HashSet ๋ฑ์ ์์๋ก ์ฌ์ฉํ ๋ ๋ฌธ์ ๋ฅผ ์ผ์ผํจ๋ค. - equals ๋น๊ต์ ์ฌ์ฉ๋๋ ์ ๋ณด๊ฐ ๋ณ๊ฒฝ๋์ง ์์๋ค๋ฉด, hashCode ๋ฉ์๋๋ ๋ช ๋ฒ์ ํธ์ถํด๋ ๊ฐ์ ๊ฐ์ ๋ฐํํด์ผ ํ๋ค. - equals๊ฐ ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ค๊ณ ํ๋จํ๋ค๋ฉด, hashCode๋ ๋๊ฐ์ ๊ฐ์ ๋ฐํํด์ผ ํ๋ค. - equals๊ฐ ๋ ๊ฐ์ฒด๋ฅผ ๋ค๋ฅด๋ค๊ณ ํ๋จํ๋๋ผ๋, hashCode๊ฐ ๋ค๋ฅธ ๊ฐ์ ๋ฐํํ ํ์๋ ์๋ค. ํ์ง๋ง ๋ค๋ฅธ ๊ฐ์ฒด๋ ๋ค๋ฅธ ๊ฐ์ ๋ฐํํด์ผ ํด์ํ ์ด๋ธ์ ์ฑ๋ฅ์ด ์ข์์ง๋ค. equals๊ฐ ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ค๊ณ ..

equals๋ ์ผ๋ฐ ๊ท์ฝ์ ์ง์ผ ์ฌ์ ์ํ๋ผ ํด๋์ค๋ฅผ ์ฌ์ ์ ํ์ง ์๊ฒ ๋๋ฉด ์ธ์คํด์ค๋ ์ค์ง ์๊ธฐ ์์ ๊ณผ๋ง ๊ฐ๊ฒ ๋๋ค. ๋ค์ ์ํฉ์ ํด๋นํ๋ค๋ฉด ์ฌ์ ์ํ์ง ์๋ ๊ฒ์ด ์ต์ ์ด๋ค. ๊ฐ ์ธ์คํด์ค๊ฐ ๋ณธ์ง์ ์ผ๋ก ๊ณ ์ ํ๋ค. ์ธ์คํด์ค์ '๋ ผ๋ฆฌ์ ๋์น์ฑ(logical equality)'์ ๊ฒ์ฌํ ์ผ์ด ์๋ค. ์์ ํด๋์ค์์ ์ฌ์ ์ํ equals๊ฐ ํ์ ํด๋์ค์๋ ๋ฑ ๋ค์ด๋ง๋๋ค. ํด๋์ค๊ฐ private์ด๊ฑฐ๋ package-private์ด๊ณ equals ๋ฉ์๋๋ฅผ ํธ์ถํ ์ผ์ด ์๋ค. equals๋ฅผ ์ฌ์ ์ํด์ผ ํ ๋?! ์์ ํด๋์ค์ equals๊ฐ ๋ ผ๋ฆฌ์ ๋์น์ฑ์ ๋น๊ตํ๋๋ก ์ฌ์ ์๋์ง ์์์ ๋ ์ฃผ๋ก ๊ฐ ํด๋์ค๋ค์ด ์ฌ๊ธฐ ํด๋นํ๋ค. equals๋ฅผ ์ฌ์ ์ํ ๋ ๋ฐ๋ผ์ผํ ์ผ๋ฐ ๊ท์ฝ ๋ฐ์ฌ์ฑ(reflexivity) : null์ด ์๋ ๋ชจ..

๊ธฐ์กด์ ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ์๋ก ์์ฑํ ๋ ์ฌ์ฌ์ฉํ์ // 1๋ฒ String s = new String("hello"); // 2๋ฒ String s = "hello"; ๋ ๊ฐ์ String์ ๊ฐ์ ๋ฌธ์์ด์ ์ฌ์ฉํ์ง๋ง 1๋ฒ์ ๊ฒฝ์ฐ์๋ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ , 2๋ฒ์ ๊ฒฝ์ฐ์๋ String Pool์์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ์ฌ ์ฌ์ฌ์ฉํ๋ค. ๋ง์ฝ s += " java"; ๋ผ๋ ์ฝ๋๊ฐ ์คํ๋๋ค๋ฉด? "hello java"๋ผ๋ ์ธ์คํด์ค๋ฅผ ์๋ก ์์ฑํ ๋ค String Pool์์ ์ด ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๋ค. boolean b1 = new Boolean(true); boolean b2 = Boolean.valueOf(true); ------- int i1 = new Integer(10); int i2 = Integer.valueO..

ํ๋ ์ด์์ ์์์ ์์กดํ ๊ฒฝ์ฐ ์๋ชป ๊ตฌํํ ๋ฐฉ๋ฒ ์ฝ๋ 5-1 : ์ ์ ์ ํธ๋ฆฌํฐ ์ฌ์ฉ public class SpellChecker { private static final Lexicon dictionary = A_dictionary; private SpellChecker() {} // ๊ฐ์ฒด ์์ฑ ๋ฐฉ์ง public static boolean isValid(String word) { ... } public static List suggestions(String typo) { ... } } ์ฝ๋ 5-2 : ์ฑ๊ธํด์ ์ฌ์ฉ public class SpellChecker { private final Lexicon dictionary = A_dictionary; private SpellChecker() {} // ..

์ ์ ๋ฉ์๋์ ์ ์ ํ๋๋ง์ ๋ด์ ํด๋์ค ๊ธฐ๋ณธ ํ์ ๊ฐ์ด๋ ๋ฐฐ์ด ๊ด๋ จ ๋ฉ์๋๋ค ํน์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ฃผ๋ ์ ์ ๋ฉ์๋ final ํด๋์ค์ ๊ด๋ จํ ๋ฉ์๋๋ค ์ด๋ฌํ ์ ์ ๋ฉค๋ฒ๋ฅผ ๋ด์ ํด๋์ค๋ ์ ํธ๋ฆฌํฐ ํด๋์ค๋ผ๊ณ ๋ถ๋ฆฌ๋๋ฐ, ์ ๋ถ static์ผ๋ก ์ ์ธ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ธ์คํด์คํ๊ฐ ํ์ํ์ง ์๊ฒ ๋๋ค. ์์ ์ฝ๋ public class StringUtil { public staic List splitStr(String str) { return Arrays.stream(categories.split(",")).collect(Collectors.toList()); } } ๋ค๋ฅธ ํด๋์ค์์ StringUtil.splitStr(); ์ ์ด์ฉํ์ฌ ์ฌ์ฉ! ์ธ์คํด์คํ๋ฅผ ๋ง๋ ๋ฐฉ๋ฒ ์ถ์ ํด๋์ค๋ก ๋ง๋ค๊ฒ ๋๋ฉด ํ..