item 51 sijun - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
๋ฉ์๋ ์๊ทธ๋์ฒ(Method Signature): ๋ฉ์๋์ ์ด๋ฆ๊ณผ ๋งค๊ฐ๋ณ์ ๋ฆฌ์คํธ์ ์กฐํฉ์ผ๋ก ๋ฉ์๋์ ์ ์ธ๋ถ์ ์ผ๋ถ๋ถ์ด๋ค.
// ๋ฉ์๋ ์๊ทธ๋์ฒ -> doSomething(String name)
public static void doSomething(String name){
}
ํญ์ ํ์ค ๋ช ๋ช ๊ท์น(์์ดํ 68)์ ๋ฐ๋ผ์ผ ํ๋ค.
์ดํดํ ์ ์๊ณ , ๊ฐ์ ํจํค์ง์ ์ํ ๋ค๋ฅธ ์ด๋ฆ๋ค๊ณผ ์ผ๊ด๋๊ฒ ์ง์ด์ผ ํ๋ค.
๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ์์ ๋๋ฆฌ ๋ฐ์๋ค์ฌ์ง๋ ์ด๋ฆ์ ์ฌ์ฉํด์ผํ๋ฉฐ, ๊ธด ์ด๋ฆ์ ํผํด์ผ ํ๋ค.
์ ๋งคํ๋ฉด ์๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ API ๊ฐ์ด๋๋ฅผ ์ฐธ์กฐํ๋ผ. ์๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ ๋ฐฉ๋ํ๋ค ๋ณด๋ ์ผ๊ด๋์ง ์์ ์ด๋ฆ๋ ์ ๋ฒ ๋ง์ง๋ง ๋๋ถ๋ถ์ ๋ฉ๋ํ ๋งํ ์์ค์ด๋ค.
๋ชจ๋ ๋ฉ์๋๋ ๊ฐ๊ฐ ์์ ์ ์์์ ๋คํด์ผ ํ๋ค.
ํด๋์ค๋ ์ธํฐํ์ด์ค ๋ชจ๋ ๋ฉ์๋๊ฐ ๋ง์ผ๋ฉด ์ตํ๊ณ , ์ฌ์ฉํ๊ณ , ๋ฌธ์ํํ๊ณ , ํ ์คํธํ๊ณ , ์ ์ง๋ณด์ํ๊ธฐ ์ด๋ ต๋ค.
ํด๋์ค๋ ์ธํฐํ์ด์ค๋ ์์ ์ ๊ฐ ๊ธฐ๋ฅ์ ์๋ฒฝํ ์ํํ๋ ๋ฉ์๋๋ก ์ ๊ณตํด์ผ ํ๋ค. ์์ฃผ ์์ฃผ ์ฐ์ผ ๊ฒฝ์ฐ์๋ง ๋ณ๋์ ์ฝ์นญ ๋ฉ์๋๋ฅผ ๋๊ธฐ ๋ฐ๋๋ค. ํ์ ์ด ์์ง ์์ผ๋ฉด ๋ง๋ค์ง ๋ง์.
๋งค๊ฐ๋ณ์๋ 4๊ฐ ์ดํ๊ฐ ์ข๊ณ , ๊ฐ์ ํ์ ์ ๋งค๊ฐ๋ณ์ ์ฌ๋ฌ ๊ฐ๊ฐ ์ฐ๋ฌ์ ๋์ค๋ฉด ์ค์๋ก ์์๋ฅผ ๋ฐ๊พธ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ ์ฃผ์ํด์ผ ํ๋ค.
๊ณผํ๊ฒ ๊ธด ๋งค๊ฐ๋ณ์ ๋ชฉ๋ก์ ์ค์ด๋ ๋ฐฉ๋ฒ 3๊ฐ์ง๋ฅผ ์๊ฐํ๋ค.
-
์ฌ๋ฌ ๋ฉ์๋๋ก ์ชผ๊ฐ ๋ค.
์ชผ๊ฐ์ง ๋ฉ์๋ ๊ฐ๊ฐ์ ์๋ ๋งค๊ฐ๋ณ์ ๋ชฉ๋ก์ ๋ถ๋ถ์งํฉ์ ๋ฐ๋๋ค. ์๋ชปํ๋ฉด ๋ฉ์๋๊ฐ ๋๋ฌด ๋ง์์ง ์ ์์ง๋ง, ์ง๊ต์ฑ์ ๋์ฌ ์คํ๋ ค ๋ฉ์๋ ์๋ฅผ ์ค์ฌ์ฃผ๋ ํจ๊ณผ๋ ์๋ค.
์ง๊ต์ฑ์ด ๋๋คโ๊ณตํต์ ์ด ์๋ ๊ธฐ๋ฅ๋ค์ด ์ ๋ถ๋ฆฌ๋์ด ์๋ค. ๊ธฐ๋ฅ์ ์์์ ์ผ๋ก ์ชผ๊ฐ ์ ๊ณตํ๋ค.
์๋ฅผ๋ค์ด,
List
์ ์ง์ ๋ ๋ฒ์์์ ์ธ๋ฑ์ค๋ฅผ ์ฐพ๋๋ค๊ณ ๊ฐ์ ํ์.ํ๋์ ๋ฉ์๋๋ก ๊ตฌํํ๋ฉด, ์ง์ ๋ ๋ฒ์์ (์์, ๋, ์ฐพ์ ์์) 3๊ฐ์ง ๋งค๊ฐ๋ณ์๊ฐ ํ์ํ๋ค.
ํ์ง๋ง
subList
๋ฉ์๋์indexOf
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋งค๊ฐ๋ณ์๋ฅผ ์ค์ด๋ฉฐ ์ง๊ต์ฑ๋ ๋์ผ ์ ์๋ค. -
๋งค๊ฐ๋ณ์ ์ฌ๋ฌ ๊ฐ๋ฅผ ๋ฌถ์ด์ฃผ๋ ๋์ฐ๋ฏธ ํด๋์ค๋ฅผ ๋ง๋ ๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ด๋ฐ ๋์ฐ๋ฏธ ํด๋์ค๋ ์ ์ ๋ฉค๋ฒ ํด๋์ค๋ก ๋๋ค. ํนํ ์๋ฐ๋ฅธ ๋งค๊ฐ๋ณ์ ๋ช ๊ฐ๋ฅผ ๋ ๋ฆฝ๋ ํ๋์ ๊ฐ๋ ์ผ๋ก ๋ณผ ์ ์์ ๋ ์ถ์ฒํ๋ ๊ธฐ๋ฒ์ด๋ค.
์๋ฅผ๋ค์ด, ์นด๋๊ฒ์์ ํด๋์ค๋ก ๋ง๋ ๋ค๊ณ ํด๋ณด์. ๊ทธ๋ฌ๋ฉด ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ์นด๋์ ์ซ์(rank)์ ๋ฌด๋ฌ(suit)๋ฅผ ๋ปํ๋ ๋ ๋งค๊ฐ๋ณ์๋ฅผ ํญ์ ๊ฐ์ ์์๋ก ์ ๋ฌํ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์ด ๋์ ๋ฌถ๋ ๋์ฐ๋ฏธ ํด๋์ค๋ฅผ ๋ง๋ค์ด ํ๋์ ๋งค๊ฐ๋ณ์๋ก ์ฃผ๊ณ ๋ฐ์ผ๋ฉด API๋ ๋ฌผ๋ก ํด๋์ค ๋ด๋ถ ๊ตฌํ๋ ๊น๋ํด์ง ๊ฒ์ด๋ค.
public class CardGame { ... static class Card{ int rank; String suit; public Card(int rank, String suit) { super(); this.rank = rank; this.suit = suit; } } }
-
๊ฐ์ฒด ์์ฑ์ ์ฌ์ฉํ ๋น๋ ํจํด์ ๋ฉ์๋ ํธ์ถ์ ์์ฉํ๋ค.
์์ ๋ ๊ธฐ๋ฒ์ ํผํฉํ ๊ฒ์ผ๋ก, ๊ฐ์ฒด ์์ฑ์ ์ฌ์ฉํ ๋น๋ ํจํด์ ๋ฉ์๋ ํธ์ถ์ ์์ฉํ๋ค๊ณ ๋ณด๋ฉด ๋๋ค. ์ด ๊ธฐ๋ฒ์ ๋งค๊ฐ๋ณ์๊ฐ ๋ง์ ๋, ํนํ ๊ทธ์ค ์ผ๋ถ๋ ์๋ตํด๋ ๊ด์ฐฎ์ ๋ ๋์์ด ๋๋ค.
๋จผ์ ๋ชจ๋ ๋งค๊ฐ๋ณ์๋ฅผ ํ๋์ ๊ฐ์ฒด๋ก ์ ์ํ๊ณ , ํด๋ผ์ด์ธํธ์์ ์ด ๊ฐ์ฒด์ ์ธํฐ ๋ฉ์๋๋ฅผ ํธ์ถํด ํ์ํ ๊ฐ์ ์ค์ ํ๊ฒ ํ๋ ๊ฒ์ด๋ค. ํ์ํ ๋งค๊ฐ๋ณ์๋ฅผ ๋ค ์ค์ ํ ๋ค์, execute ๋ฉ์๋๋ฅผ ํธ์ถํด ์์ ์ค์ ํ ๋งค๊ฐ๋ณ์๋ค์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๋ค.
public class NutritionFacts { ... private final int calories; ... public static class Builder { ... private int calories = 0; ... public Builder calories(int val){ calories = val; return this; } ... public execute(Builder builder){ // ๋งค๊ฐ๋ณ์ ์ ํจ์ฑ ๊ฒ์ฌํ๋ ์ฝ๋๊ฐ ๋ค์ด๊ฐ๋ค } public NutritionFacts build() { return new NutritionFacts(this); } private NutritionFacts(Builder builder) { calories = builder.calories; ... } }
๋งค๊ฐ๋ณ์๋ก ์ ํฉํ ์ธํฐํ์ด์ค๊ฐ ์๋ค๋ฉด ๊ทธ ์ธํฐํ์ด์ค๋ฅผ ์ง์ ์ฌ์ฉํ์. ๋ค์ํ ํํ์ ๊ตฌํ์ฒด๋ ์ธ์๋ก ๊ฑด๋ฌ ์ ์๊ณ , ์ฌ์ง์ด ์กด์ฌํ์ง ์๋ ๊ตฌํ์ฒด๋ ์ ๋ฌ๊ฐ๋ฅํ๋ค (์ฑ๋ฅ ์ข์ ์๋ก์ด ๊ตฌํ์ฒด๊ฐ ๋์ค๋ฉด ์ ๋ฌ ๊ฐ๋ฅ).
// ํ์
public void doSomethingGood(List<String> list) {
}
// ํ์ง๋ง์
public void doSomethingBad(ArrayList<String> list) {
}
์ด๊ฑฐ ํ์ ์ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ฅผ ์ฝ๊ณ ์ฐ๊ธฐ๊ฐ ๋ ์ฌ์์ง๋ค.
์๋ฅผ๋ค์ด, ํ์จ์จ๋์ ์ญ์จ์จ๋๋ฅผ ์ ๋ฌํ์ฌ์ผ ํ๋ค๊ณ ๊ฐ์ ํ์.
public enum TemperatureScale { FARENHEIT, CELSIUS }
Thermometer.newInstance(true) // ๋ถ๋ช
ํํ๋ค
Thermometer.newInstance(Temperaturescale.CELSIUS) // ๋ช
ํํ๋ค
๋๋ฒ์งธ ์ฝ๋ ํธ์ถ๋ถ๋ง ๋ณด๋๋ผ๋ ๋ฌด์์ด ์ ๋ฌ๋๋์ง ๋ช ํํ๋ค.
๋ํ, ์ถํ์ KELVIN ์จ๋๊ฐ ์ถ๊ฐ ๋๋๋ผ๋ ์ด๊ฑฐ ํ์ ์๋ง ์ถ๊ฐํ๋ฉด ๋๋ค.