Introduce Parameter Refactoring  

 

ÀÌ ¼½¼ÇÀº Introduce Parameter   ¸®ÆÑÅ丵 À§¿¡¼­  overview¸¦ Á¦°øÇÏ°í  how ÀÌ ¸®ÆÑÅ丵ÀÌ IntelliJ IDEA¿¡¼­ »ç¿ëµÉ ¼ö Àִ°¡¸¦ Á¦°øÇÕ´Ï´Ù.

°³¿ä


¸¸ÀÏ ´ç½ÅÀÌ ¸Þ¼Òµå ÄÝ¿¡¼­ ³Ñ¾î°¡´Â ÀϺΠ°ªÀ» ÇÊ¿ä·Î Çϸé Introduce Parameter  ¸®ÆÑÅ丵Àº ¸Å°³ º¯¼ö¸¦ ¸Þ¼Òµå ¼±¾ð¿¡ Ãß°¡Çϱâ À§ÇØ »ç¿ëµË´Ï´Ù.  ¸Þ¼Òµå »ç¿ëÀº ¶ÇÇÑ º¯°æµË´Ï´Ù.  ¸Å°³ º¯¼ö¿¡ ÂüÁ¶´Â ¸Þ¼Òµå ½Ã±×³ÊÃÄ º¯°æ ¸®ÆÑÅ丵(»ý¼ºµÈ ½ºÅ×ÀÌÆ®¸ÕÆ®°¡ ´Ü¼øÈ÷ ÅØ½ºÆ®·Î¼­ »ðÀÔµÈ °÷)°ú °°Áö ¾Ê°Ô ÇØ°áµË´Ï´Ù.

¿¹¸¦ µé¸é, ¸®ÆÑÅ丵 Àü¿¡ ´ÙÀ½ Äڵ尡 ÀÖ½À´Ï´Ù:

 
    public int myMethod(int aParam) {
        return aParam + (aParam + 1);
    }
 
    public void anotherMethod() {
        myMethod(5);
    }


±×¸®°í ´ç½ÅÀº ¶Ç ´Ù¸¥ ¸Å°³ º¯¼ö¸¦ (aParam + 1) Ç¥Çö½Ä ´ë½Å¿¡ myMethod ¿¡ »ý¼ºÇÏ´Â °ÍÀ» °áÁ¤Çß½À´Ï´Ù.  ¸®ÆÑÅ丵 ÀÌÈÄ ´ç½ÅÀº ´ÙÀ½ Äڵ带 °¡Áú °ÍÀÔ´Ï´Ù:  

 

 
    public int myMethod(int aParam, int newParam) {
        return aParam + newParam;
    }
 
    public void anotherMethod() {
        myMethod(5, (5 + 1));
    }
 

»õ·Î¿î ¸Å°³ º¯¼ö newParam ÀÌ »ý¼ºµÇ¾ú°í ¸Þ¼Òµå ÄÝ¿¡¼­ ±× ½ÇÁ¦ °ªÀº ÃʱâÈ­µÇ¾ú½À´Ï´Ù.

¸Å°³ º¯¼ö »ý¼º


¸Å°³ º¯¼ö¸¦ »ý¼ºÇϱâ À§ÇØ, ¿¡µðÅÍ¿¡¼­ ¸Å°³ º¯¼ö·Î ±³Ã¼µÉ Ç¥Çö½ÄÀ» ¼±ÅÃÇϽʽÿÀ.


Introduce Parameter ¸®ÆÑÅ丵À» Àû¿ëÇÑ Ç¥Çö½ÄÀ» ¼±ÅÃÇϱâ À§ÇØ Ctrl + W  (´Ü¾î ¼±ÅÃ)¸¦ »ç¿ëÇÏ´Â °ÍÀº ¾ÆÁÖ Æí¸®ÇÕ´Ï´Ù. ÄÚµåÀÇ ºí·Ï È®ÀåÀ» ¼±ÅÃÇÏ°í ´ç½ÅÀº ij·µÀ» ³»ºÎÀÇ ¾î´À °÷¿¡ ¹èÄ¡Çϰí, Ctrl + W¸¦ ¸î ¹ø ´­·¯¼­ ¾î¶² Ç¥Çö½ÄÀÌ¶óµµ ½±°Ô Äڵ忡¼­ ¼±ÅÃÇØµµ ÁÁ½À´Ï´Ù.


¸ÞÀÎ ¸Þ´º¿¡¼­ ¶Ç´Â ¿¡µðÅÍ¿¡¼­ ¿À¸¥ÂÊ ¹öưÀ» Ŭ¸¯ÇÏ¿© ºÒ·ÁÁö´Â ÆË¾÷ ¸Þ´º¿¡¼­ Refactor Introduce Parameter... À» Ŭ¸¯ÇÕ´Ï´Ù. ¶Ç´Â Ctrl + Alt + P   ´ÜÃà۸¦ »ç¿ëÇÕ´Ï´Ù.


·ÎÄà º¯¼ö À§¿¡¼­ ¸®ÆÑÅ丵À» Àû¿ëÇϸ鼭, ´ç½ÅÀº ¿À·ÎÁö ±×°Í À§¿¡¼­ ij·µÀ» ¹èÄ¡ÇÒ ¼ö ÀÖ½À´Ï´Ù.  ±×·¯³ª Çʵå À§¿¡¼­ ¸®ÆÑÅ丵À» Àû¿ëÇϱâ À§ÇØ, Çʵ尡 ¿¡µðÅÍ¿¡¼­ ¼±ÅõǾî¾ß¸¸ ÇÑ´Ù¶ó´Â Á¡¿¡ ÁÖÀÇÇϽʽÿÀ.



´ÙÀ½ Introduce Parameter  ´ÙÀ̾ó·Î±×°¡ ³ªÅ¸³³´Ï´Ù:



´ÙÀ̾ó·Î±×´Â ´ÙÀ½ÀÇ Á¦¾î¸¦ °¡Áý´Ï´Ù:

Parameter of type  

»ý¼ºµÈ ¸Å°³ º¯¼ö¸¦ À§ÇØ Å¸ÀÔÀ» ¼±ÅÃÇϽʽÿÀ.

Name  

»ý¼ºµÈ ¸Å°³ º¯¼ö¸¦ À§ÇÑ À̸§À» ŸÀÌÇÁÇϰųª, IDEA¿¡ ÀÇÇØ Á¦¾ÈµÈ Çϳª¸¦ »ç¿ëÇÕ´Ï´Ù.

Declare final  

¸¸ÀÏ ¼±ÅõǸé, »ý¼ºµÈ ¸Å°³ º¯¼ö´Â ÃÖÁ¾ÀûÀ¸·Î ¼±¾ðµË´Ï´Ù.

Preview usages  to be changed  

ÀÌ Ã¼Å© ¹Ú½º¸¦ ¼±ÅÃÇÏ¸é ´ç½ÅÀº ¾î¶² »ç¿ëÀÌ ¹ß°ßµÇ¾ú´ÂÁö ÃßÀûÇϰí, ±×µéÀÇ ±³Ã¼¸¦ ½ÂÀÎÇϵµ·Ï Çã¶ôÇÕ´Ï´Ù.  ÀÌ Ã¼Å© ¹Ú½º°¡ ¼±ÅõÇÁö ¾ÊÀ» ¶§, IDEA´Â ±³Ã¼¸¦ ÀÚµ¿ÀûÀ¸·Î ¼öÇàÇÕ´Ï´Ù.


½ÉÁö¾î üũ ¹Ú½º°¡ ¼±ÅõÇÁö ¾Ê¾ÒÀ» ¶§µµ, ¸¸ÀÏ ¹ß°ßµÈ »ç¿ëÀÌ ¾î¶² Àбâ Àü¿ë ÆÄÀÏ¿¡¼­ Á¸ÀçÇÏ¸é ´ç½ÅÀº »ç¿ë ±³Ã¼¸¦ È®ÀÎÇÏ´Â ÇÁ·ÒÇÁÆ®°¡ ´ç½Å¿¡ ´ë±âµÉ °Í ÀÔ´Ï´Ù.


¸®ÆÑÅ丵À» Àû¿ëÇϱâ À§ÇØ Enter¸¦ ´©¸£½Ê½Ã¿À.

Ưº°ÇÑ ÁÖ¼®


´ÙÀ½ ƯÁ¤ÀÇ À̽´´Â ¾ð±ÞµÇ¾î¾ß¸¸ ÇÕ´Ï´Ù:

  ¸¸ÀÏ Çʵ尡 ¸Þ¼Òµå ¼±¾ð¿¡¼­ »õ·Î¿î ¸Å°³ º¯¼ö·Î¼­ Á¦°øµÇ±â¸¦ ¿øÇϸé, ¸Þ¼Òµå ÄÝ¿¡¼­ ÀÌ Çʵå´Â Ŭ·¡½º ÀνºÅϽºÀÇ Çʵå·Î¼­ Á¦°øµÉ °ÍÀÔ´Ï´Ù.
 

À§ÀÇ ¿¹Á¦¸¦ »ç¿ëÇϰí ÀÖ´Â Çʵ带 Ãß°¡ÇÕ´Ï´Ù:  
 
    public class AClass {
        public int myField;
 
        public int myMethod(int aParam) {
            return aParam + (myField + 1);
        }
    }
 
    public class AnotherClass {
        AClass aClass = new AClass();
 
        public void anotherMethod() {
            aClass.myMethod(5);
        }
    }
 
¸®ÆÑÅ丵 ÀÌÈÄ ´ç½ÅÀº ´ÙÀ½ÀÇ Äڵ带 °¡Áú °ÍÀÔ´Ï´Ù:
 
    public class AClass {
        public int myField;
 
        public int myMethod(int aParam, int newParam) {
            return aParam + newParam;
        }
    }
 
    public class AnotherClass {
        AClass aClass = new AClass();
 
        public void anotherMethod() {
            aClass.myMethod(5, (aClass.myField + 1));
        }
    }



 
¸¸ÀÏ Å¬·¡½º ±¸¼º ¿ä¼Ò°¡ Á¢±ÙÇϱ⠾î·Á¿ì¸é(¿¹¸¦ µé¸é, À§ÀÇ ¿¹Á¦¿¡¼­ Çʵå´Â privateÀÔ´Ï´Ù), ±×°ÍÀº ¸Þ¼Òµå ÄÝ¿¡ »ðÀ﵃ °ÍÀÔ´Ï´Ù. ±×·¯³ª ÀÌ ÆÄÀÏÀ» ÄÄÆÄÀÏ ¾ÈµÇ°Ô ¸¸µå´Â ¿¡·¯·Î¼­ °­Á¶µÉ °ÍÀÔ´Ï´Ù.

 
¸¸ÀÏ ´ç½ÅÀÌ °ÔÅÍ¿Í ÇÔ²² Introduce Parameter  ¸®ÆÑÅ丵À» À§ÇØ Çʵ带 »ç¿ëÇϸé, ´ç½Å¿¡°Ô È®ÀåµÈ ´ÙÀ̾ó·Î±×·Î ÇÁ·ÒÇÁÆ®µÉ °ÍÀÔ´Ï´Ù:



 
´ÙÀ̾ó·Î±×´Â ¿É¼Ç ±×·ì Replace fields used in expressions with their gettersÀ» °®½À´Ï´Ù

Do not replace  

ÇʵåÀÇ ¾î´À °Íµµ °ÔÅÍ¿¡ ÄÝ·Î ±³Ã¼µÇÁö ¾ÊÀ» °ÍÀÔ´Ï´Ù.

Replace fields  inaccessible in usage context  

»ç¿ë ¹®¸ÆÀ¸·ÎºÎÅÍ Á÷Á¢ ¾×¼¼½ºµÉ ¼ö ¾ø´Â Çʵ常ÀÌ °ÔÅÍ¿¡ ÄÝ·Î ±³Ã¼µÉ °ÍÀÔ´Ï´Ù.

Replace all fields  

¸ðµç Çʵå´Â °ÔÅÍ¿¡ ÄÝ·Î ±³Ã¼µÉ °ÍÀÔ´Ï´Ù.




 
·ÎÄà º¯¼ö À§¿¡¼­ ¸®ÆÑÅ丵À» Àû¿ëÇÏ¸é µÎ °³ÀÇ ºÎ°¡ÀÇ Ã¼Å© ¹Ú½º¿Í ÇÔ²² Introduce Parameter ´ÙÀ̾ó·Î±×¸¦ ºÎ¸¦ °ÍÀÔ´Ï´Ù.  ¿¹¸¦ µé¸é, ´ç½ÅÀº ´ÙÀ½ÀÇ Äڵ带 °¡Áý´Ï´Ù:  

 
    public int myMethod(int firstPar) {
        int secondPar = firstPar + 1;
        return firstPar + secondPar;
    }


±×¸®°í ´ç½ÅÀº secondPar  º¯¼ö¸¦ ¼±ÅÃÇϰí ÀÖ´Â Introduce Parameter  ¸®ÆÑÅ丵À» Àû¿ëÇÕ´Ï´Ù .

´ç½ÅÀº ´ÙÀ½ÀÇ ´ÙÀ̾ó·Î±× À©µµ¿ìÀ» º¼ °ÍÀÔ´Ï´Ù:

Replace all  occurrences (<number_of_occurences> occurrences)  

°¡´ÉÇϸé, ¼±ÅÃµÈ º¯¼öÀÇ ¸ðµç ¹ß»ýÀº ¸Å°³ º¯¼ö·Î ±³Ã¼µÉ °ÍÀÔ´Ï´Ù. ±×¸®°í Delete variable üũ ¹Ú½º´Â »ç¿ë °¡´ÉÇÏ°Ô ÇÏ°Ô µË´Ï´Ù.  ±×·¸Áö ¾ÊÀ¸¸é, ¿À·ÎÁö ¼±ÅÃµÈ º¯¼ö »ç¿ëÀº ¸Å°³ º¯¼ö·Î ±³Ã¼µÉ °ÍÀÔ´Ï´Ù.


¿À·ÎÁö ¼±ÅÃµÈ º¯¼öÀÇ µÑ ÀÌ»óÀÇ ´õ ¸¹Àº ¹ß»ýÀÌ ÀÖÀ» °æ¿ì¿¡ ÀÌ Ã¼Å© ¹Ú½º´Â ³ªÅ¸³³´Ï´Ù.


Delete variable  definition  

°¡´ÉÇϸé, º¯¼ö Á¤ÀÇ´Â »èÁ¦µÉ °ÍÀÔ´Ï´Ù.

Use variable  initializer to initialize parameter  

°¡´ÉÇϸé, º¯¼ö À̴ϼȶóÀÌÀú´Â ¸Þ¼Òµå ÄÝ¿¡¼­ ¸Å°³ º¯¼ö¸¦ ÃʱâÈ­Çϱâ À§ÇØ »ç¿ëµÉ °ÍÀÔ´Ï´Ù.


Enter¸¦ ´©¸£¸é ¸®ÆÑÅ丵À» Àû¿ëÇÒ °ÍÀÔ´Ï´Ù.

 

ºÎÀÛ¿ë


¸¸ÀÏ ½ÇÁ¦ ¸Þ¼Òµå ¸Å°³ º¯¼öÀΠŬ·¡½º ÀνºÅϽº ¶Ç´Â Ç¥Çö½Ä À§¿¡¼­ Àû¿ëµÈ´Ù¸é, Introduce Parameter  ¸®ÆÑÅ丵À» »ç¿ëÇÏ´Â °ÍÀº ¿¹»ó¿ÜÀÇ ºÎÀÛ¿ëÀ» °¡Áú ¼ö ÀÖ½À´Ï´Ù.  ¿¹¸¦ µé¸é, ±×·± ÄÚµåÀÇ °æ¿ì¿¡´Â:  

 
class AClass {
    int field;
    int method() {
        return field;
    }
}
 
class Usage {
    void method(List list) {
        int sum = 0;
        for(Iterator it = list.iterator(); it.hasNext(); ) {
            sum += ((AClass) it.next()).method();
        }
    }
}

 

±×¸®°í field Çʵ带 À§ÇØ Àû¿ëµÈ ¸®ÆÑÅ丵 ÈÄÀÇ ÄÚµå:

 
class AClass {
    int field;
    int method(int newfield) {
        return newfield;
    }
}
 
class Usage {
    void method(List list) {
        int sum = 0;
        for(Iterator it = list.iterator; it.hasNext(); ) {
            sum += ((AClass) it.next()).method(((AClass) it.next()).field);
        }
}

 

¹Ýº¹ °ªÀº ½ÇÁ¦·Î ´ç½ÅÀÌ ¿¹»óÇß´ø ¹ÝÀÀÀÌ ¾Æ´Ñ µÎ ¹è·Î Áõ°¡µË´Ï´Ù

±×·¯³ª, IDEAÀº ÀϽÃÀû º¯¼ö¸¦ ¼º°øÀûÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ°í, ÁõºÐ/°¨·®/´ëÀÔ ¿¬»ê°ú new Ű¿öµå »ç¿ë°ú °°Àº °æ¿ì¸¦ ÇØ°áÇÒ ¼ö ÀÖ½À´Ï´Ù.

¿¹¸¦ µé¸é

 
    public int myMethod(List list) {
        return list.size();
    }
 
    public void anotherMethod() {
        myMethod(new ArrayList());
    }

±×¸®°í ¸®ÆÑÅ丵 ÈÄÀÇ ÄÚµå:  

 
    public int myMethod(List list, int newPar) {
        return list.size();
    }
 
    public void anotherMethod() {
        final ArrayList list = new ArrayList();
        myMethod(list, list.size());
    }

 

»õ·Î¿î º¯¼ö list ÀÌ »ý¼ºµÇ°í ¸Þ¼Òµå ÄÝÀ» À§ÇØ »ç¿ëµÇ´Â ¸ðµç ¸Å°³ º¯¼ö´Â ÀÌ º¯¼ö¸¦ »ç¿ëÇϸ鼭 Á¦°øµË´Ï´Ù.