23-2-4.@FunctionalInterface

ÇÔ¼öÇü ÀÎÅÍÆäÀ̽º¿¡ ¼ÓÇÑ Ãß»ó ¸Þ¼­µå¸¦ ÇÔ¼ö ¼³¸íÀÚ(Function descriptor)¶ó°í ÇÏ¸ç ¶÷´Ù½ÄÀÇ ½Ã±×´Ïó¸¦ Á¤ÀÇÇÑ´Ù. ¾Õ¿¡¼­ ¿¹·Î µç i -> i+1 ¶÷´Ù½ÄÀÇ ½Ã±×´Ïó¸¦ Á¤ÀÇÇϱâ À§ÇØ ´ÙÀ½°ú °°Àº ÇÔ¼öÇü ÀÎÅÍÆäÀ̽º¸¦ ¼±¾ðÇß´Ù.

 

@FunctionalInterface

interface PlusOne {

     int plus(int i);

}

 

ÀÌ ¼±¾ð¿¡ ÀÇÇØ Á¤¼öÇü Àμö Çϳª¸¦ ÃëÇÏ°í Á¤¼öÇüÀ» ¸®ÅÏÇÏ´Â ½Ã±×´Ïó°¡ Á¤ÀǵȴÙ. ÀÌ·± ÇüÅÂÀÇ ¶÷´Ù½ÄÀ» Àμö·Î ¹ÞÀ» ¶§´Â PlusOne ÀÎÅÍÆäÀ̽º ŸÀÔÀ» ¹Þ°í È£ÃâÇÒ ¶§´Â plus¶ó´Â Ãß»ó ¸Þ¼­µå À̸§À» »ç¿ëÇÑ´Ù. ¾Õ Ç׿¡¼­ ¿¹·Î µç print ÇÔ¼ö°¡ Á¤È®È÷ ÀÌ·¸°Ô ÇÏ°í ÀÖ´Ù.

 

static void print(int i, PlusOne po) {

     System.out.println("result = " + po.plus(i));

}

 

ÇÔ¼öÇü ÀÎÅÍÆäÀ̽º´Â µü ÇϳªÀÇ Ãß»ó ¸Þ¼­µå¸¸ °¡Áö¸ç µÎ °³ ÀÌ»óÀÇ ¸Þ¼­µå¸¦ °¡Á®¼­´Â ¾ÈµÈ´Ù. À̸¦ ¸íÈ®È÷ Çϱâ À§ÇØ @FunctionalInterface ¾Ö³ëÅ×À̼ÇÀ» ºÙÀδÙ. ÀÌ ¾Ö³ëÅ×À̼ÇÀÌ ÀÖ´Â »óÅ¿¡¼­ µÎ °³ÀÇ ¸Þ¼­µå¸¦ ¼±¾ðÇÏ¸é ¿¡·¯ 󸮵ȴÙ.

 

@FunctionalInterface

interface PlusOne {

     int plus(int i);

     int minus(int a, int b);

}

 

½Ã±×´Ïó¸¦ Á¤ÀÇÇÏ´Â ÀÎÅÍÆäÀ̽º°¡ µÎ °³ÀÇ ¸Þ¼­µå¸¦ °¡Áö¸é ¾î¶² °ÍÀÌ ÇÔ¼ö ¼³¸íÀÚÀÎÁö ¸íÈ®ÇÏÁö ¾Ê´Ù. µü ÇϳªÀÇ ¸Þ¼­µå¸¸ ¼±¾ðÇÒ ¼ö ÀÖµÇ ´Ù¸¸ µðÆúÆ® ¸Þ¼­µå¿Í Á¤Àû ¸Þ¼­µå´Â ¿©·¯ °³ À־ »ó°ü¾ø´Ù. ¾Ö³ëÅ×À̼ÇÀº ½Ç¼öÇÒ °¡´É¼ºÀ» Â÷´ÜÇϸç ÀÚ¹Ù ¶óÀ̺귯¸®ÀÇ ÇÔ¼öÇü ÀÎÅÍÆäÀ̽º¿¡´Â ¸ðµÎ ¾Ö³ëÅ×À̼ÇÀÌ ºÙ¾î ÀÖ´Ù.

ÇÔ¼öÇü ÀÎÅÍÆäÀ̽º´Â ¶÷´Ù½ÄÀÇ Àμö ŸÀÔÀ» Ãß·ÐÇϴµ¥ »ç¿ëµÈ´Ù. plus ÇÔ¼ö ¼³¸íÀÚ¿¡ ÀÇÇØ ÀμöÀÇ Å¸ÀÔÀÌ intÇüÀ̶ó´Â °ÍÀÌ ¸íÈ®ÇØ ¶÷´Ù½Ä¿¡´Â ÀμöÀÇ Å¸ÀÔÀ» »ý·«ÇÒ ¼ö ÀÖ´Ù. ¿ø·¡ (int i) -> i+1·Î ½á¾ß ÇÏÁö¸¸ iÀÇ Å¸ÀÔÀ» ¹àÈ÷Áö ¾Ê¾Æµµ ÄÄÆÄÀÏ·¯´Â plus ÇÔ¼ö ¼³¸íÀÚÀÇ ½Ã±×´Ïó¸¦ º¸°í Àμö°¡ Á¤¼öÇüÀÓÀ» Ãß·ÐÇÑ´Ù. ¸®ÅÏ Å¸ÀÔµµ ¸¶Âù°¡Áö ¹æ¹ýÀ¸·Î Ãß·ÐÇÑ´Ù.

ÇÔ¼öÇü ÀÎÅÍÆäÀ̽º³ª ÇÔ¼ö ¼³¸íÀÚÀÇ À̸§Àº º° Àǹ̰¡ ¾ø´Ù. i -> i+1 ¶÷´Ù½ÄÀÇ ½Ã±×´Ïó¸¦ Á¤ÀÇÇÏ´Â ¿¹·Î µé´Ù º¸´Ï PlusOneÀ̶ó´Â À̸§À» ºÙ¿´°í ¸Þ¼­µå´Â plus¶ó°í ºÙ¿´À» »ÓÀÌÁö ²À ±×·¡¾ß ÇÏ´Â °ÍÀº ¾Æ´Ï´Ù. plus´Â 1À» ´õÇÏ´Â µ¿ÀÛÀ» Á¤ÀÇÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó Á¤¼öÇü Çϳª¸¦ ¹Þ¾Æ Á¤¼ö¸¦ ¸®ÅÏÇÑ´Ù´Â ½Ã±×´Ïó¸¸ Á¤ÀÇÇÒ »Ó ½ÇÁ¦ µ¿ÀÛÀº ¶÷´Ù½ÄÀÇ º»Ã¼ Äڵ忡 ÀÇÇØ °áÁ¤µÈ´Ù.

plus ÇÔ¼ö ¼³¸íÀÚ¿¡ ´ëÀԵǴ ÄÚµå´Â Á¤¼öÇüÀ» ¹Þ¾Æ Á¤¼öÇüÀ» ¸®ÅÏÇÏ¸é ¾î¶² °ÍÀÌµç °¡´ÉÇÏ´Ù. ¾Õ¿¡¼­ 1À» »©´Â ¶÷´Ù½Ä, 2¸¦ °öÇÏ´Â ¶÷´Ù½Äµµ PlusOne ŸÀÔÀÇ Àμö·Î ³Ñ°Üº¸¾Ò´Ù. Ãß»ó ¸Þ¼­µå´Â ÇüŸ¸ Á¤ÀÇÇÒ »Ó ±¸Ã¼ÀûÀÎ µ¿ÀÛÀ» Á¤ÀÇÇÏÁö ¾Ê´Â´Ù. ±×·¡¼­ ½Ã±×´Ïó¸¦ ¼³¸íÇÏ´Â À̸§À» ºÙÀÌ´Â°Ô ´õ ³ªÀ» °Í °°´Ù. Àμö_¸®ÅÏ°ª ½ÄÀ¸·Î À̸§À» ºÙÀÎ´Ù¸é ´ÙÀ½°ú °°´Ù.

 

interface Int_Int {

     int int_int(int i);

}

 

±×·¯³ª º¸±â ÁÁÁö ¾Ê°í Àμö ¸ñ·Ï°ú ¸®ÅÏ Å¸ÀÔÀÌ ¸í½ÃµÇ¾î ÀÖ¾î ºÒÇÊ¿äÇÑ Á¤º¸ÀÌ´Ù. ±×·¸´Ù°í À̸§¾øÀÌ ¸Þ¼­µå¸¦ Á¤ÀÇÇÒ ¼ö ¾øÀ¸´Ï ÀÌ ÇüÅÂÀÇ ½Ã±×´Ïó·Î ÇÒ ¼ö ÀÖ´Â µ¿ÀÛÁß ´ëÇ¥ÀûÀÎ À̸§À» ºÙ¿© ³õ´Â °ÍÀÌ´Ù. FindMax ÀÎÅÍÆäÀ̽ºµµ µÎ Á¤¼ö¸¦ ¹Þ¾Æ Å« Á¤¼ö Çϳª¸¦ ¸®ÅÏÇÑ´Ù´Â Àǹ̷ΠÀ̸§À» ºÙ¿© ³õ¾ÒÀ» »ÓÀÌ¸ç ºñ½ÁÇÑ À¯ÇüÀÇ ´Ù¸¥ ÀÛ¾÷À» ÇÏ´Â ¶÷´Ù½ÄÀ» ¹ÞÀ» ¼ö ÀÖ´Ù.

 

findmax

class JavaTest {

     public static void main(String[] args) {

          FindMax add = (a, b) -> a+b;

          System.out.println("result = " + add.max(3, 7));

          FindMax getsum = (a, b) -> {

              int sum = 0;

              for (int i = a; i <= b; i++) sum += i;

              return sum;

          };

          System.out.println("result = " + getsum.max(3, 7));

     }

}

 

interface FindMax {

     int max(int a, int b);

}

½ÇÇà°á°ú

result = 10

result = 25

 

FindMax ŸÀÔÀÇ ¶÷´Ù½Ä µÑÀ» Á¤ÀÇÇ쵂 Çϳª´Â µÎ °ªÀ» ´õÇØ ¸®ÅÏÇÏ°í Çϳª´Â µÎ °ª »çÀÌÀÇ Á¤¼öÇÕÀ» ±¸ÇØ ¸®ÅÏÇÑ´Ù. µ¿ÀÛÀº Å« °ª ã±â¿Í ÀüÇô ´Ù¸£Áö¸¸ int (int, int) ŸÀÔ°ú ȣȯµÇ´Ï ÀÌ·± ¶÷´Ù½ÄÀ» FindMax ŸÀÔÀÇ °´Ã¼¿¡ ´ëÀÔÇÒ ¼ö ÀÖ´Ù.

ÇÔ¼öÇü ÀÎÅÍÆäÀ̽º¿¡¼­ À¯½ÉÈ÷ º¼ °ÍÀº À̸§ÀÌ ¾Æ´Ï¶ó ½Ã±×´ÏóÀÓÀ» ¸í½ÉÇÏÀÚ. ¿ø·¡ ´Ù¸¥ ¿ëµµ·Î ¾²´ø ¼±¾ð¹®À» ¶÷´Ù½Ä ½Ã±×´Ïó Á¤ÀÇ¿¡ Àû¿ëÇÏ´Ù º¸´Ï Àǹ̵µ ¾ø´Â À̸§À» ºÙ¿©¾ß ÇÑ´Ù´Â ¸é¿¡¼­ ¹®¹ýÀÌ ¾î»öÇØÁ³´Ù. ±×·³¿¡µµ ºÒ±¸ÇÏ°í ¶÷´Ù½ÄÀ» ¹«¸®ÇÏ°Ô µµÀÔÇÑ ÀÌÀ¯´Â ¸ð¹ÙÀÏ°ú ±×·¡ÇÈ È¯°æ¿¡¼­ À̺¥Æ® 󸮿¡ ²À ÇÊ¿äÇϱ⠶§¹®ÀÌ´Ù.