leekyunghee item 59 - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ตํ๊ณ ์ฌ์ฉํ๋ผ
๋ฌด์์ ์ ์ ํ๋๋ฅผ ์์ฑํ๊ณ ์ถ์ ๊ฒฝ์ฐ
- ๊ฐ์ ๋ฒ์๋ 0๋ถํฐ ๋ช ์ํ ์ ์ฌ์ด๋ค.
// ํํ์ง๋ง ๋ฌธ์ ๊ฐ ์ฌ๊ฐํ ์ฝ๋
์ฝ๋ 59-1
static Random rnd = new Random();
static int random(int n) {
return Math.abs(rnd.nextInt()) % n;
}
- ์ธ๊ฐ์ง ๋ฌธ์ ์ ์ ๋ดํฌํ๊ณ ์๋ค.
- n์ด ๊ทธ๋ฆฌ ํฌ์ง ์์ 2์ ์ ๊ณฑ์๋ผ๋ฉด ์ผ๋ง ์ง๋์ง ์์ ๊ฐ์ ์์ด์ด ๋ฐ๋ณต๋๋ค.
- n์ด 2์ ์ ๊ณฑ์๊ฐ ์๋๋ผ๋ฉด ๋ช๋ช ์ซ์๊ฐ ํ๊ท ์ ์ผ๋ก ๋ ์์ฃผ ๋ฐํ๋๋ค. n๊ฐ์ด ํฌ๋ฉด ์ด ํ์์ ๋ ๋๋๋ฌ์ง๋ค.
- ์ ํํ ๋ฒ์์์ ๋ฌด์์ ์๋ฅผ ๋ฐฑ๋ง๊ฐ ์์ฑํ ๋ค์ ๊ทธ์ค ์ค๊ฐ ๊ฐ๋ณด๋ค ์์ ๊ฒ ๋ช๊ฐ์ธ์ง ์ถ๋ ฅํ๋ ์์
public static void main(String[] args) {
int n = 2 * (Integer.MAX_VALUE / 3);
int low = 0;
for (int i = 0; i < 10000000; i++)
if(random(n) < n/2)
low++;
System.out.println(low);
}
- random ๋ฉ์๋๊ฐ ์ด์์ ์ผ๋ก ๋์ํ๋ค๋ฉด ์ฝ 50๋ง ๊ฐ๊ฐ ์ถ๋ ฅ๋ผ์ผ ํ์ง๋ง ์ค์ ๋ก 666,666์ ๊ฐ๊น์ด ๊ฐ์ ์ป๋๋ค.
- ๋ฌด์์๋ก ์์ฑ๋ ์ ์ค์์ 2/3๊ฐ๋ ์ค๊ฐ๊ฐ ๋ณด๋ค ๋ฎ์ ์ชฝ์ผ๋ก ์ ๋ฆฐ ๊ฒ์ด๋ค.
- random ๋ฉ์๋์ ์ธ๋ฒ์งธ ๊ฒฐํจ์ผ๋ก ์ง์ ํ ๋ฒ์ ๋ฐ๊นฅ์ ์๊ฐ ์ข ์ข ํ์ด๋์ฌ ์ ์๋ค.
rnd.nextInt()๊ฐ ๋ฐํํ ๊ฐ์ Math.abs๋ฅผ ์ด์ฉํด ์์๊ฐ ์๋ ์ ์๋ก ๋งคํํ๊ธฐ ๋๋ฌธ์ด๋ค.
- nextInt()๊ฐ Integer.MIN_VALUE๋ฅผ ๋ฐํํ๋ฉด Math.abs๋ Integer.MIN_VALUE๋ฅผ ๋ฐํํ๊ณ ๋๋จธ์ง ์ฐ์ฐ์(*)๋ ์์๋ฅผ ๋ฐํํด๋ฒ๋ฆฐ๋ค. (n์ด 2์ ์ ๊ณฑ์๊ฐ ์๋ ๋์ ์๋๋ฆฌ์ค๋ค)
์ด๋ ๊ฒ ๋๋ฉด ํ๋ก๊ทธ๋จ์ ์คํจํ ๊ฒ์ด๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ถ์ด๋ ํ์์ ์ฌํํ๊ธฐ๊ฐ ์ฝ์ง ์์ ๊ฒ์ด๋ค.
์ด ๊ฒฐํจ์ ํด๊ฒฐํ๋ ค๋ฉด ์์ฌ๋์, ์์ฑ๊ธฐ, ์ ์๋ก , 2์ ๋ณด์ ๊ณ์ฐ ๋ฑ์ ์กฐ์๊ฐ ๊น์ด์ผ ํ๋ค.
Random.nextInt(int)๊ฐ ์ด๋ฏธ ํด๊ฒฐํด๋จ์ผ๋ ์ง์ ํด๊ฒฐํ ํ์๋ ์๋ค.
ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ทธ ์ฝ๋๋ฅผ ์์ฑํ ์ ๋ฌธ๊ฐ์ ์ง์๊ณผ ์ฌ๋ฌ๋ถ๋ณด๋ค ์์ ์ฌ์ฉํ ๋ค๋ฅธ ํ๋ก๊ทธ๋๋จธ๋ค์ ๊ฒฝํ์ ํ์ฉํ ์ ์๋ค.
์๋ฐ 7๋ถํฐ๋ Random์ ๋์ด์ ์ฌ์ฉํ์ง ์๋๊ฒ ์ข๋ค.
- ThreadLocalRandom์ผ๋ก ๋์ฒดํ๋ฉด ๋๋ถ๋ถ ์ ์๋ํ๋ค. Random๋ณด๋ค ๋ ๊ณ ํ์ง์ ๋ฌด์์ ์๋ฅผ ์์ฑํ ๋ฟ ์๋๋ผ ์๋๋ ๋ ๋น ๋ฅด๋ค.
- ํฌํฌ-์กฐ์ธ ํ์ด๋ ๋ณ๋ ฌ ์คํธ๋ฆผ์์๋ SplittableRandom์ ์ฌ์ฉํ๋ผ.
ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐ๋ ์ด์
- ํต์ฌ์ ์ธ ์ผ๊ณผ ํฌ๊ฒ ๊ด๋ จ ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋ผ ์๊ฐ์ ํ๋นํ์ง ์์๋ ๋๋ค๋ ๊ฒ์ด๋ค.
- ํ๋ก๊ทธ๋๋จธ๋ค์ ํ๋ถ ๊ณต์ฌ๋ฅผ ํ๊ธฐ๋ณด๋ค๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ธฐ๋ฅ ๊ฐ๋ฐ์ ์ง์คํ๊ณ ์ถ์ดํ๋ค.
- ๋ฐ๋ก ๋ ธ๋ ฅํ์ง ์์๋ ์ฑ๋ฅ์ด ์ง์ํด์ ๊ฐ์ ๋๋ค๋ ์ ์ด๋ค.
- ๊ธฐ๋ฅ์ด ์ ์ ๋ง์์ง๋ค๋ ๊ฒ์ด๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ถ์กฑํ ๋ถ๋ถ์ด ์๋ค๋ฉด ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ์์ ์ด์ผ๊ธฐ๊ฐ ๋์ค๊ณ ๋ ผ์๋ ํ ๋ค์ ๋ฆด๋ฆฌ์ฆ์ ํด๋น ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋๊ณค ํ๋ค.
- ๋ง์ ์ฌ๋์๊ฒ ๋ฏ์ต์ ์ฝ๋๊ฐ ๋๋ค. ์ฝ๊ธฐ์ข๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ข๊ณ ์ฌํ์ฉํ๊ธฐ ์ฌ์ด ์ฝ๋๊ฐ ๋๋ค.
ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์๋ณด์ด์ง๋ง ์ค์์ ๋ง์ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ๊ตฌํํด ์ฐ๊ณ ์๋ค ์๊ทธ๋ด๊น?
- ์๋ง๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ทธ๋ฐ ๊ธฐ๋ฅ์ด ์๋์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค. [java8-feature, java9-feature] (https://www.oracle.com/technetwork/java/javase/10-relnote-issues-4108729.html#NewFeature)
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋๋ฌด ๋ฐฉ๋ํ์ฌ ๋ชจ๋ API ๋ฌธ์๋ฅผ ๊ณต๋ถํ๊ธฐ๋ ๋ฒ ์ฐจ๊ฒ ์ง๋ง ์๋ฐ ํ๋ก๊ทธ๋๋จธ๋ผ๋ฉด ์ ์ด๋ java.lang, java.util, java.io ์ ๊ทธ ํ์ ํจํค์ง๋ค์๋ ์ต์ํด์ ธ์ผ ํ๋ค.
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋งค๋ ์์ฃผ ๋น ๋ฅด๊ฒ ์ฑ์ฅํ๊ณ ์์ผ๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ์์ฝํ๋ ๊ฑด ๋ฌด๋ฆฌ๋ค.
- ์ปฌ๋ ์ ํ๋ ์์ํฌ์ ์คํธ๋ฆผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, java.util.concurrent์ ๋์์ฑ ๊ธฐ๋ฅ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์์๋๋ฉด ํฐ ๋์์ด ๋๋ค.
ํต์ฌ ์ ๋ฆฌ
๋ฐํด๋ฅผ ๋ค์ ๋ฐ๋ช
ํ์ง ๋ง์. ์์ฃผ ํน๋ณํ ๋๋ง์ ๊ธฐ๋ฅ์ด ์๋๋ผ๋ฉด ๋๊ตฐ๊ฐ ์ด๋ฏธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํํ๋ก ๊ตฌํํด๋์์ ๊ฐ๋ฅ์ฑ์ด ํฌ๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ๋๋ ์ฌ๋ฌ๋ถ์ด ์ง์ ์์ฑํ๋ ์ฝ๋๋ณด๋ค ํ์ง์ด ์ข๊ณ ์ ์ฐจ ๊ฐ์ ๋ ๊ฐ๋ฅ์ฑ์ด ํฌ๋ค.
์ฝ๋ ํ์ง์๋ ๊ท๋ชจ์ ๊ฒฝ์ ๊ฐ ์ ์ฉ๋๋ค. ๊ฐ์๊ฐ ์์ฑํ๋ ๊ฒ๋ณด๋ค ์ฃผ๋ชฉ์ ํจ์ฌ ๋ง์ด ๋ฐ์์ผํ๋ฏ๋ก ์ฝ๋ ํ์ง๋ ๊ทธ๋งํผ ๋์์ง๋ค.