16-2-7.Á¤È®ÇÑ ¿¬»ê

¼ýÀÚ°£ÀÇ ±âº»ÀûÀÎ ¿¬»êÀº ¾ð¾î°¡ Á¦°øÇÏ´Â ¿¬»êÀÚ¸¦ »ç¿ëÇÑ´Ù. ±×·¯³ª µðÁöÅÐÀÇ ÇÑ°è·Î ÀÎÇØ ¶§·Î´Â »ó½ÄÀûÀÎ ¿¬»êµµ ºÎÁ¤È®ÇÏ°Ô Ã³¸®µÇ´Â °æ¿ì°¡ ÀÖ´Ù. ´ÙÀ½ ¿¹Á¦¸¦ º¸ÀÚ.

 

overflow

½ÇÇà°á°ú

class JavaTest {

      public static void main(String[] args) {

             int i = 1500000000;

             int j = 1500000000;

             int k = i + j;

             System.out.println(k);

      }

}

-1294967296

 

15¾ï + 15¾ïÀº ´ç¿¬È÷ 30¾ïÀÌ´Ù. ±×·¯³ª ÀÌ´Â int ŸÀÔÀÇ Ç¥Çö ¹üÀ§¸¦ ³Ñ¾î¼± °ªÀ̾ 30¾ïÀÇ º¸¼ö°¡ ´ë½Å Ãâ·ÂµÈ´Ù. µÎ °³ÀÇ Å« °ªÀ» ´õÇߴµ¥ ¿À¹öÇ÷ο쿡 ÀÇÇØ ¿ÀÈ÷·Á À½¼ö°¡ µÇ¾î ¹ö·È´Ù. ¿Ö ÀÌ·± Çö»óÀÌ ¹ß»ýÇß´ÂÁö ÀÌÇØÇÒ ¼ö ÀÖÁö¸¸ ºÐ¸í ¿øÇÏ´Â °ªÀº ¾Æ´Ï´Ù.

±âº» ¿¬»êÀÚ´Â ±ÔÄ¢¿¡ µû¶ó ºñÆ®³¢¸® ¿¬»êÇßÀ» »ÓÀÌ¸ç ¿À¹öÇ÷ο찡 ¹ß»ýÇصµ Å¿¬ÇÏ°Ô ±× °á°ú¸¦ º¯¼ö¿¡ ´ëÀÔÇØ ¹ö¸°´Ù. ¹®Á¦´Â ÀÌ·± À߸øµÈ °ªÀÌ ³ª¿Ô´ÂÁö ¸ð¸¥ ä ÇÁ·Î±×·¥Àº °è¼Ó ½ÇÇàµÇ¸ç ÀÌÈÄÀÇ ½ÇÇàÀº ¿¹Ãø ºÒ°¡ÇÏ´Ù´Â Á¡ÀÌ´Ù. 1.8¿¡¼­ »õ·Î Ãß°¡µÈ MathÀÇ ´ÙÀ½ Á¤Àû ¸Þ¼­µå´Â ±âº» ¿¬»êÀÚ°¡ ÇÏ´Â µ¿ÀÛÀ» ¶È°°ÀÌ ¼öÇàÇÑ´Ù.

 

¸Þ¼­µå

¼³¸í

int incrementExact(int a) 

°ªÀ» 1Áõ°¡½ÃŲ´Ù.

int decrementExact(int a) 

°ªÀ» 1°¨¼Ò½ÃŲ´Ù.

int addExact(int x, int y) 

µÎ °ªÀ» ´õÇÑ´Ù.

int subtractExact(int x, int y) 

µÎ °ªÀ» »«´Ù.

int multiplyExact(int x, int y) 

µÎ °ªÀ» °öÇÑ´Ù.

int negateExact(int a)

À½¼ö°ªÀ» ±¸ÇÑ´Ù.

int toIntExact(long value)

long ŸÀÔ º¯¼ö¸¦ int ŸÀÔÀ¸·Î º¯È¯ÇÑ´Ù.

 

ÀÌ ¸Þ¼­µå´Â ¿¬»êÁß ¿À¹öÇ÷ο찡 ¹ß»ýÇϸé ArithmeticException ¿¹¿Ü¸¦ ´øÁ® ÀÌ»óÀÌ ¹ß»ýÇßÀ½À» ¾Ë¸°´Ù. ¿¬»ê¹®À» ¿¹¿Üó¸® ±¸¹®À¸·Î °¨½Î ¿À¹öÇÃ·Î¿ì ¿¹¿Ü¸¦ Àû±ØÀûÀ¸·Î ó¸®ÇÒ ¼ö ÀÖ´Ù. ´Ü, ³ª´©±â´Â ¿À¹öÇ÷ο찡 ¹ß»ýÇÏÁö ¾ÊÀ¸¹Ç·Î º°µµÀÇ ¸Þ¼­µå°¡ Á¤ÀǵǾî ÀÖÁö ¾Ê´Ù.

 

arexception

½ÇÇà°á°ú

class JavaTest {

      public static void main(String[] args) {

             int i = 1500000000;

             int j = 1500000000;

            try {

                   int k = Math.addExact(i, j);

                   System.out.println(k);

             }

             catch (ArithmeticException e) {

                   System.out.println("»ê¼ú ¿¬»ê ¿¹¿Ü ¹ß»ý");

             }

      }

}

»ê¼ú ¿¬»ê ¿¹¿Ü ¹ß»ý

 

°íÀÇ·Î ¿À¹öÇÃ·Î¿ì ¿¹¿Ü¸¦ ÀÏÀ¸Å°´Â ¿¬»êÀ» ÇØ º¸°í ¿¹¿Ü ó¸® ±¸¹®À¸·Î °¨½Õ´Ù. üũµå ¿¹¿Ü´Â ¾Æ´Ï¾î¼­ Çʼö´Â ¾Æ´ÏÁö¸¸ ÇÊ¿äÇÒ ¶§ ¿¹¿Ü¸¦ Àâ¾Æ ó¸®ÇÒ ¼ö ÀÖ´Ù. ´Ü¼øÈ÷ ¿¹¿Ü »ç½ÇÀ» ¸Þ½ÃÁö·Î Ãâ·ÂÇߴµ¥ ¹«³­ÇÑ °ªÀ¸·Î ó¸®Çϰųª ÀçÀÔ·ÂÀ» ¿ä±¸ÇÒ ¼ö ÀÖ´Ù.

´ÙÀ½Àº ³ª¸ÓÁö ¿¬»êÀÚ %ÀÇ Æ¯¼º¿¡ ´ëÇØ ¿¬±¸ÇØ º¸ÀÚ. ³ª¸ÓÁö ¿¬»êÀº ¿©·¯ °¡Áö ¿ëµµ·Î ¸¹ÀÌ ¾²À̴µ¥ ´ë°³ÀÇ °æ¿ì ¹®Á¦°¡ ¾øÁö¸¸ ÇÇÁ¬¼ö°¡ À½¼öÀÏ ¶§´Â À½¼ö °á°ú°¡ ³ª¿Â´Ù´Â ¹®Á¦°¡ ÀÖ´Ù. ´ÙÀ½ Äڵ带 º¸ÀÚ.

 

System.out.println(5 % 2);                    // 1

System.out.println(-5 % 2);                   // -1

 

5 % 2°¡ 1ÀÎ °ÍÀº ÀÌ°ßÀÇ ¿©Áö°¡ ¾ø´Ù. ³ª¸ÓÁö ¿¬»êÀº ÇÇÁ¬¼ö = Á¬¼ö * ¸ò + ³ª¸ÓÁöÀÇ ½ÄÀ» ¸¸µç ÈÄ ¸òÀº ¹ö¸®°í ³ª¸ÓÁö¸¸ ÃëÇÏ´Â ¿¬»êÀ¸·Î Á¤ÀǵǾî ÀÖ´Ù. ±×·¡¼­ 5 % 2´Â ´ÙÀ½°ú °°ÀÌ °è»êµÈ´Ù.

 

5 = 2 * 2 + 1

 

¸ò 2´Â ¹ö¸®°í ³ª¸ÓÁö 1À» ¸®ÅÏÇÑ´Ù. ÀÌ¿¡ ºñÇØ 6 % 2´Â ¸òÀÌ 3ÀÌ°í ³ª¸ÓÁö´Â ¾øÀ¸¹Ç·Î 0ÀÌ ¸®ÅϵȴÙ. ±×·¡¼­ % ¿¬»êÀڴ Ȧ¦ ÆǺ°¿¡ ÈçÈ÷ »ç¿ëµÇ¸ç ³ª¸ÓÁö°¡ 1À̸é Ȧ¼ö´Ù. ±×·¯³ª À½¼öÀÇ °æ¿ì¿¡´Â ÀÌ»óÇÑ °á°ú°¡ ³ª¿Â´Ù.

 

-5 = 2 * -2 + (-1)

 

¸òÀÌ -2ÀÌ°í ³ª¸ÓÁö°¡ -1ÀÌ µÈ´Ù. ÀÌ °è»ê¿¡ ÀÇÇϸé -5´Â Ȧ¼ö°¡ ¾Æ´Ï¸ç ±×·¸´Ù°í ¦¼öµµ ¾Æ´Ñ ¾Ö¸ÅÇÑ »óÅ°¡ µÇ¾î ¹ö¸°´Ù. ¼öÇÐÀûÀ¸·Î a % b ³ª¸ÓÁö ¿¬»êÀÇ °á°ú´Â 0 ~ b »çÀÌÀÇ Á¤¼ö·Î ±ÔÁ¤µÇ¾î ÀÖ´Ù. ¿¹¸¦ µé¾î ¾î¶² ¼ö¸¦ 3À¸·Î ³ª´« ³ª¸ÓÁö´Â 0, 1, 2 ¼ÂÁß Çϳª¿©¾ß ÇÑ´Ù. ¼öÇеµ Àý´ëÀû Áø¸®°¡ ¾Æ´Ï¶ó ÇÕÀÇ¿¡ ÀÇÇÑ ¾à¼ÓÀÌ´Ù.

±×·¯³ª µðÁöÅÐ ¿¬»ê¿¡¼­´Â ÀÌ ±ÔÄ¢À» ÁöÅ°Áö ¾Ê°í ´õ °£ÆíÇÑ ¹æ¹ýÀ¸·Î ³ª¸ÓÁö¸¦ ±¸ÇÑ´Ù. ¿¬»ê ±ÔÄ¢µµ ÇϳªÀÇ ¾à¼ÓÀ̱⠶§¹®¿¡ ¾î¶² °ÍÀÌ ²À ¸Â´Ù°í ÇÒ ¼ö ¾øÁö¸¸ ¼öÇÐÀû Á¤ÀÇ¿Í ´Þ¶ó °¡²û ¹®Á¦°¡ µÈ´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇØ Math´Â floorMod ¸Þ¼­µå¸¦ Á¦°øÇÏ¸ç ¼öÇÐÀû Á¤ÀÇ¿¡ µû¶ó ³ª¸ÓÁö ¿¬»êÀ» ¼öÇàÇÑ´Ù.

 

System.out.println(Math.floorMod(5, 2));                              // 1

System.out.println(Math.floorMod(-5, 2));                             // 1

 

ÀÌ ¸Þ¼­µå·Î ³ª¸ÓÁö ¿¬»êÀ» ¼öÇàÇÏ¸é °á°ú´Â Ç×»ó 0 ~ Á¬¼ö »çÀÌÀÇ °ªÀÌ µÇ¾î À½¼ö¿¡ ´ëÇؼ­µµ Ȧ¦ ÆǺ°À» Á¤È®ÇÏ°Ô ¼öÇàÇÑ´Ù. ÀÌ·± ³ª¸ÓÁö ¿¬»êÀ» À§Çؼ­´Â ³ª´©±â ¿¬»êµµ Á¤È®ÇÏ°Ô Á¤ÀÇÇØ¾ß ÇÑ´Ù. / ¿¬»êÀÚ´Â 0¿¡ °¡±î¿î ¸òÀ» µ¹·Á Áִµ¥ ºñÇØ floorDiv´Â °¡±ÞÀû Å« ¸òÀ» °è»êÇÑ´Ù. ´ÙÀ½ Äڵ带 º¸ÀÚ.

 

System.out.println(5 / 2);                                                                                              // 2

System.out.println(-5 / 2);                                                                                             // -2

System.out.println(Math.floorDiv(5, 2));                                // 2

System.out.println(Math.floorDiv(-5, 2));                               // -3

 

¾ç¼ö³¢¸®ÀÇ ³ª´°¼À¿¡ ´ëÇؼ­´Â Å« ÀÌ°ßÀÌ ¾ø´Ù. ±×·¯³ª À½¼öÀÎ °æ¿ì¿¡´Â / ¿¬»êÀÚ·Î ³ª´« °æ¿ì¿Í floorDiv·Î ³ª´« °æ¿ìÀÇ °á°ú°¡ ´Ù¸£´Ù. -5 / 2´Â ¸òÀ» 2·Î °è»êÇϴµ¥ ºñÇØ floorDiv´Â -3À¸·Î °è»êÇÑ´Ù.