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;
} 
  • ์„ธ๊ฐ€์ง€ ๋ฌธ์ œ์ ์„ ๋‚ดํฌํ•˜๊ณ  ์žˆ๋‹ค.
  1. n์ด ๊ทธ๋ฆฌ ํฌ์ง€ ์•Š์€ 2์˜ ์ œ๊ณฑ์ˆ˜๋ผ๋ฉด ์–ผ๋งˆ ์ง€๋‚˜์ง€ ์•Š์•„ ๊ฐ™์€ ์ˆ˜์—ด์ด ๋ฐ˜๋ณต๋œ๋‹ค.
  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์˜ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์•Œ์•„๋‘๋ฉด ํฐ ๋„์›€์ด ๋œ๋‹ค.

ํ•ต์‹ฌ ์ •๋ฆฌ

๋ฐ”ํ€ด๋ฅผ ๋‹ค์‹œ ๋ฐœ๋ช…ํ•˜์ง€ ๋ง์ž. ์•„์ฃผ ํŠน๋ณ„ํ•œ ๋‚˜๋งŒ์˜ ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋ผ๋ฉด ๋ˆ„๊ตฐ๊ฐ€ ์ด๋ฏธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜•ํƒœ๋กœ ๊ตฌํ˜„ํ•ด๋†“์•˜์„ ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋‹ค. 
์ผ๋ฐ˜์ ์œผ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ๋Š” ์—ฌ๋Ÿฌ๋ถ„์ด ์ง์ ‘ ์ž‘์„ฑํ•˜๋Š” ์ฝ”๋“œ๋ณด๋‹ค ํ’ˆ์งˆ์ด ์ข‹๊ณ  ์ ์ฐจ ๊ฐœ์„ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋‹ค. 
์ฝ”๋“œ ํ’ˆ์งˆ์—๋„ ๊ทœ๋ชจ์˜ ๊ฒฝ์ œ๊ฐ€ ์ ์šฉ๋œ๋‹ค. ๊ฐ์ž๊ฐ€ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ฃผ๋ชฉ์„ ํ›จ์”ฌ ๋งŽ์ด ๋ฐ›์•„์•ผํ•˜๋ฏ€๋กœ ์ฝ”๋“œ ํ’ˆ์งˆ๋„ ๊ทธ๋งŒํผ ๋†’์•„์ง„๋‹ค.