junghyunlyoo item 59 - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฅ์ 1 :: ์๋ง์ ํ๋ก๊ทธ๋๋จธ๋ค์ ๊ฒฝํ์ด ๋ น์์๋ค
๋ค์์ ๋ฌด์์ ์ ์ ํ๋๋ฅผ ์์ฑํ๋ ์ฝ๋์ด๋ค.
static Random rnd = new Random();
static int random(int n) {
return Math.abs(rnd.nextInt()) % n;
}
์ด ์ฝ๋๋ ์ธ ๊ฐ์ง ๋ฌธ์ ์ ์ ๊ฐ์ง๊ณ ์๋ค.
- n์ด ๊ทธ๋ฆฌ ํฌ์ง ์์ 2์ ์ ๊ณฑ์๋ผ๋ฉด ์ผ๋ง ์ง๋์ง ์์ ๊ฐ์ ์์ด์ด ๋ฐ๋ณต๋๋ค.
- n์ด 2์ ์ ๊ณฑ์๊ฐ ์๋๋ผ๋ฉด ๋ช๋ช ์ซ์๊ฐ ํ๊ท ์ ์ผ๋ก ๋ ์์ฃผ ๋ฐํ๋๋ค.
- ์ง์ ํ ๋ฒ์ ๋ฐ๊นฅ์ ์๊ฐ ์ข ์ข ์์ฑ๋ ์ ์๋ค.
์ด๋ ๊ฒ ์ง์ ์์ฑํ๋ ๊ฒ์ ๋ฌธ์ ์ ์ ๊ฐ์ง๊ณ ์์ ํ๋ฅ ์ด ํฌ๋ค.
์ง์ ์์ฑํ๋ ๋ฐฉ๋ฒ ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ํ๊ฒ ์ํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๋ค.
Random.nextInt(int)๋ ์ ๋ฌธ์ ์ ์ ํด๊ฒฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ํธ์ด๋ค. ์๊ณ ๋ฆฌ์ฆ์ ๋ฅํตํ ๊ฐ๋ฐ์๊ฐ ์ค๊ณํ๊ณ ๊ตฌํํ๊ณ , ์ด ๋ถ์ผ์ ์ฌ๋ฌ ์ ๋ฌธ๊ฐ๊ฐ ์์ ์ฑ๊ณผ ์ ํ์ฑ์ ๊ฒ์ฆํด์คฌ๋ค.
์ด๋ ๊ฒ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ทธ ์ฝ๋๋ฅผ ์์ฑํ ์ ๋ฌธ๊ฐ์ ์ง์๊ณผ ์ฐ๋ฆฌ๋ณด๋ค ์์ ์ฌ์ฉํ ๋ค๋ฅธ ํ๋ก๊ทธ๋๋จธ๋ค์ ๊ฒฝํ์ ํ์ฉํ ์ ์๋ค.
์๋ฐ 7๋ถํฐ๋ Random์ ๋ ์ด์ ์ฌ์ฉํ์ง ์๋๊ฒ ์ข๋ค.
ThreadLocalRandom์ด๋ผ๋ ์ฑ๋ฅ์ด ๊ฐ์ ๋ ์ ํธ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ถ์ฒํ๋ค.
ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฅ์ 2 :: ์๊ฐ ์ ์ฝ
ํต์ฌ์ ์ธ ์๋น์ค ๊ตฌํ์ ํฌ๊ฒ ๊ด๋ จ ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋ผ ์๊ฐ์ ํ๋นํ์ง ์์๋ ๋๋ค.
ํ๋ก๊ทธ๋๋จธ๋ค์ ํ๋ถ ๊ณต์ฌ๋ฅผ ํ๊ธฐ๋ณด๋ค๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ธฐ๋ฅ ๊ฐ๋ฐ์ ์ง์คํ๊ณ ์ถ์ดํ๋ค.
ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฅ์ 3 :: ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฑ๋ฅ ๊ฐ์
ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฑ๋ฅ์ด ์ง์ํด์ ๊ฐ์ ๋๋ค. ์ฌ์ฉ์๊ฐ ๋ง๊ณ ์ ๊ณ ํ์ค ๋ฒค์น๋งํฌ๋ฅผ ์ฌ์ฉํด ์ฑ๋ฅ์ ํ์ธํ๊ธฐ ๋๋ฌธ์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์์๋ค์ ๋ ๋์ ๋ฐฉ๋ฒ์ ๊พธ์คํ ๋ชจ์ํ ์๋ฐ์ ์๋ค.
์๋ฐ ํ๋ซํผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ง์ ๋ถ๋ถ์ด ์ ๋ ์ ๊ฑธ์ณ ์ง์ํด์ ๋ค์ ์์ฑ๋๋ฉฐ, ๋๋ก ์ฑ๋ฅ์ด ๊ทน์ ์ผ๋ก ๊ฐ์ ๋๊ธฐ๋ ํ๋ค.
ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฅ์ 4 :: ์ ์ ๋ง์์ง๋ ๊ธฐ๋ฅ
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ถ์กฑํ ๋ถ๋ถ์ด ์๋ค๋ฉด ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ์์ ์ด์ผ๊ธฐ๊ฐ ๋์ค๊ณ ๋ ผ์๋ ํ ๋ค์ ๋ฆด๋ฆฌ์ค์ ํด๋น ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋๊ณค ํ๋ค.
ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฅ์ 5 :: ๋ฒ์ฉ์ ์ธ ์ฝ๋ ์์ฑ ๊ฐ๋ฅ
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ง์ ์ฌ๋์๊ฒ ๋ฏ์ต์ ์ฝ๋๊ฐ ๋๋ค. ์์ฐ์ค๋ฝ๊ฒ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ๋ ์ฝ๊ธฐ ์ข๊ณ , ์ ์ง๋ณด์ํ๊ธฐ ์ข๊ณ , ์ฌํ์ฉํ๊ธฐ ์ฌ์ด ์ฝ๋๊ฐ ๋๋ค.
๊ทธ๋ฌ๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์!
๋ง์ ํ๋ก๊ทธ๋๋จธ๋ค์ ์ข์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋์ง ์ ๋ชฐ๋ผ์ ์ง์ ๊ตฌํํด์ ์ฐ๊ณค ํ๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ์ต๊ด์ ๊ธฐ๋ฅด๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋ง์ ๊ธฐ๋ฅ๋ค์ ์ค๋ช ํด๋์ ๊ฒ์ด ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฉ์ด์ ๋ฆด๋ฆฌ์ฆ์ด๋ค.
์ด ๋ฉ์ด์ ๋ฆด๋ฆฌ์ฆ๋ฅผ ์ฝ์ผ๋ฉด ์ข๋ค. ์๋์ ์ฝ๋๋ฅผ ํตํด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฅ์ ์ ํ์ธํด๋ณด์.
public static void main(String[] args) throws IOException {
try (InputStream in = new URL(args[0]).openStream()) {
in.transferTo(System.out);
}
}
์์ ์๋ ์์ฑํ๊ธฐ๊ฐ ๊น๋ค๋ก์ด ๊ธฐ๋ฅ์ด์์ง๋ง, ์๋ฐ 9์์ InputStream์ ์ถ๊ฐ๋ transferTo ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋๋ฌด ๋ฐฉ๋ํ์ฌ ๋ชจ๋ API ๋ฌธ์๋ฅผ ๊ณต๋ถํ๊ธฐ๋ ๋ฒ ์ฐจ๊ฒ ์ง๋ง ์๋ฐ ํ๋ก๊ทธ๋๋จธ๋ผ๋ฉด ์ ์ด๋ java.lang, java.util, java.io์ ๊ทธ ํ์ ํจํค์ง๋ค์๋ ์ต์ํด์ ธ์ผ ํ๋ค.
๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ํ์ํ ๋๋ง๋ค ์ตํ์ผ ํ๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋งค๋ ์์ฃผ ๋น ๋ฅด๊ฒ ์ฑ์ฅํ๊ณ ์์ผ๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ์์ฝํ๋ ๊ฑด ๋ฌด๋ฆฌ๋ค.
๋ช ๊ฐ์ง ์ธ๊ธํด๋ ๋งํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ค. ์ปฌ๋ ์ ํ๋ ์์ํฌ์ ์คํธ๋ฆผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค.
java.util.concurrent์ ๋์์ฑ ๊ธฐ๋ฅ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์์๋๋ฉด ํฐ ๋์์ด ๋๋ค.
์ด ํจํค์ง๋ ๋ฉํฐ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ ์์ ์ ๋จ์ํํด์ฃผ๋ ๊ณ ์์ค์ ํธ์ ๊ธฐ๋ฅ์ ๋ฌผ๋ก , ๋ฅ์ํ ๊ฐ๋ฐ์๊ฐ ์์ ๋ง์ ๊ณ ์์ค ๊ฐ๋ ์ ์ง์ ๊ตฌํํ ์ ์๋๋ก ๋์์ฃผ๋ ์ ์์ค ์์๋ค์ ์ ๊ณตํ๋ค.
(java.util.concurrent์ ๊ณ ์์ค ๊ฐ๋ ์ item 80๊ณผ item 81์์ ๋ค๋ฃฌ๋ค)
๋๋๋ก ํ์ํ ๊ธฐ๋ฅ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ถฉ๋ถํ ์ ๊ณตํ์ง ๋ชปํ ์ ์๋ค. ๋ ์ ๋ฌธ์ ์ธ ๊ธฐ๋ฅ์ ์๊ตฌํ ์๋ก ์ด๋ฐ ์ํฉ์ด ๋ ์์ฃผ ์๊ธธ ๊ฒ์ด๋ค.
์ฐ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ค ์๋ํด๋ณด์. ์ด๋ค ์์ญ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋์ง ์ดํด๋ณด๊ณ , ์ํ๋ ๊ธฐ๋ฅ์ด ์๋๋ผ ํ๋จ๋๋ฉด ๋์์ ์ฌ์ฉํ์.
์ด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์ ํํ๋ฏ๋ก ํญ์ ๋น ๊ตฌ๋ฉ์ด ์๊ธฐ ๋ง๋ จ์ด๋ค.
์๋ฐ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ํ๋ ๊ธฐ๋ฅ์ ์ฐพ์ง ๋ชปํ๋ฉด, ๊ทธ๋ค์ ์ ํ์ง๋ ๊ณ ํ์ง์ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ ๊ฒ์ด๋ค.
๊ตฌ๊ธ์ ๋ฉ์ง ๊ตฌ์๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ํ์ ์ด๋ค. ์ ํฉํ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฐพ์ง ๋ชปํ๋ค๋ฉด, ๋ค๋ฅธ ์ ํ์ด ์์ผ๋ ์ง์ ๊ตฌํํ์.