ÀÌ ¼½¼ÇÀº Extract Superclass ¸®ÆÑÅ丵 À§¿¡¼ ´ç½Å¿¡°Ô Æ÷°ýÀûÀÎ overview¿Í how ÀÌ ¸®ÆÑÅ丵ÀÌ IntelliJ IDEA¿¡¼ »ç¿ëµÉ ¼ö Àִ°¡¸¦ Á¦°øÇÕ´Ï´Ù.
Extract Superclass ¸®ÆÑÅ丵Àº µÎ °³ÀÇ ¿É¼ÇÀ» °¡Áý´Ï´Ù. ù ¹øÂ° (Extract
Superclass) ´Â ±âÁ¸ Ŭ·¡½º¿¡ ±âÃÊÇÏ´Â ½´ÆÛŬ·¡½ºÀ» »ý¼ºÇϱâ À§ÇØ »ç¿ëµË´Ï´Ù.
µÎ ¹øÂ°(Rename original
class and use superclass where possible )´Â ¿ø·¡ Ŭ·¡½ºÀÇ À̸§À» º¯°æÇÏ°í »õ·Ó°Ô »ý¼ºµÈ ½´ÆÛŬ·¡½º¿¡ ´ëÇÑ ±¸ÇöÀÌ µË´Ï´Ù. ±×·± °æ¿ì, °¡´ÉÇϸé IDEA´Â ±×¶§ ½´ÆÛŬ·¡½º¸¦ »ç¿ëÇϱâ À§ÇØ ¸ðµç ¿øº» Ŭ·¡½º »ç¿ëÀ» º¯°æÇÕ´Ï´Ù (±×¸®°í ±×°ÍÀÌ ÀÖÁö ¾ÊÀº °÷¿¡¼ ±×°ÍµéÀ» º¯°æÇÏÁö ¾ÊÀ» °ÍÀÔ´Ï´Ù).
¿øÇüÀÇ Å¬·¡½º¿¡¼ Çʵå¿Í ¸Þ¼Òµå´Â ½´ÆÛŬ·¡½ºÀÇ ÂÊÀ¸·Î À̵¿µÉ ¼ö ÀÖ½À´Ï´Ù. ¶ÇÇÑ ¸Þ¼Òµå¸¦ À§ÇØ, ½´ÆÛŬ·¡½º¿¡¼ Ãß»óÀûÀ¸·Î ´ç½ÅÀº ¸Þ¼Òµå¸¦ ¼±¾ðÇϰí ÀÖ´Â ±¸Çö À̿ܿ¡ ´ÜÁö ¸Þ¼Òµå ¼±¾ðÀ» Àü¼ÛÇÒ ¼ö ¾ø½À´Ï´Ù. ±× °á°ú, ´ç½ÅÀº ½´ÆÛŬ·¡½º¿Í ¿øÇüÀÇ Å¬·¡½º¸¦ ½´ÆÛŬ·¡½º·ÎºÎÅÍ »ó¼ÓÇÏ°Ô ÇÒ °ÍÀÔ´Ï´Ù.
¿¹¸¦ µé¸é, ¿ì¸®´Â ´ÙÀ½ Ŭ·¡½º¸¦ °¡Áý´Ï´Ù:
public class OriginalClass extends JFrame implements Runnable, Scrollable {
private int foo;
public void method1(){
//some code here...
}
private void method2() {
//some code here...
}
}
Extract Superclass ¿Í ÇÔ²² ¸®ÆÑÅ丵 ÀÌÈÄ¿¡ »õ·Î¿î ½´ÆÛŬ·¡½º´Â »ý¼ºµÉ °Í ÀÔ´Ï´Ù :
public abstract class SuperClass extends JFrame implements Runnable {
public abstract void method1();
protected void method2() {
//some code here...
}
}
±×¸®°í ¿øÇüÀÇ Å¬·¡½º´Â ´ÙÀ½°ú °°ÀÌ º¸ÀÏ °Í ÀÔ´Ï´Ù.
public class OriginalClass extends SuperClass implements Scrollable {
private int foo;
public void method1(){
//some code here...
}
}
±×¸®°í ¸¸ÀÏ Rename original class and use superclass where possible ¼±ÅÃÇϸé, °á°ú ÄÚµå´Â »óÀÌÇÒ °Í ÀÔ´Ï´Ù.
»õ·Î¿î ½´ÆÛŬ·¡½º(¿øÇü Ŭ·¡½ºÀÇ À̸§À» °¡Áø):
public abstract class OriginalClass extends JFrame implements Runnable {
public abstract void method1();
private void method2() {
//some code here...
}
}
±×¸®°í À̸§ÀÌ ¹Ù²ï ¿øÇü Ŭ·¡½º:
public class PreviousOriginalClass extends OriginalClass implements Scrollable {
public void method1(){
//some code here...
}
}
½´ÆÛŬ·¡½º°¡ ÃßÃâµÇ¾ú´Ù¸é (¸¸ÀÏ Extract Superclass°¡ ¼±ÅõǸé), IDEA´Â Ŭ·¡½ºÀÇ »ç¿ëÀÇ °Ë»öÀ» Á¦¾ÈÇÒ °ÍÀ̰í, ½´ÆÛŬ·¡½ºÀÇ »ç¿ëÀ¸·Î ±×µéÀ» °¡´ÉÇÏ¸é ±³Ã¼ÇÒ °ÍÀÔ´Ï´Ù. ´ç½ÅÀº IDEA°¡ ÀÌ µ¿ÀÛÀ» ÀÚµ¿ÀûÀ¸·Î ¼öÇàÇÏ°Ô ÇÒ ¼ö Àְųª, ¾î¶² »ç¿ëÀÌ ¹ß°ßµÇ¾ú´ÂÁö °è¼Ó ±â¾ïÇϰí ÀÖ°í, ±×µéÀÇ ±³Ã¼¸¦ ½ÂÀÎÇÕ´Ï´Ù.
¿¹¸¦ µé¸é ´ç½ÅÀº Ãß»óÀûÀÎ publicMethod ¿Í ÇÔ²² ½´ÆÛŬ·¡½º¸¦ »ý¼ºÇϱ⸦ ¿øÇÕ´Ï´Ù.
class OriginalClass { public void publicMethod() {//some code here} public void secretMethod() {//some code here} } ... //This usage can be modified by changing the //parameter type from 'OriginalClass' to 'SuperClass' void foo (OriginalClass myClass){ myClass.publicMethod(); } ...
//This usage will not be suggested for //refactoring because it calls the secretMethod void bar (OriginalClass myClass){ myClass.secretMethod(); }
°á°ú ÄÚµå´Â ´ÙÀ½°ú °°ÀÌ º¸ÀÏ °ÍÀÔ´Ï´Ù:
class OriginalClass extends SuperClass { public void publicMethod() {//some code here} public void secretMethod() {//some code here} } ... void foo (SuperClass myClass){ myClass.publicMethod(); } ... void bar (OriginalClass myClass){ myClass.secretMethod(); }
½´ÆÛŬ·¡½º¸¦ ÃßÃâÇϱâ À§ÇÏ¿©:
1. Project º¸±â¿¡¼ Ŭ·¡½º¸¦ ¼±ÅÃÇϰųª ¹®¼ ÆíÁý±â¿¡¼ Ŭ·¡½º ³» ¾î´À °÷¿¡ ij·µÀ» ¹èÄ¡ÇϽʽÿÀ, ±×¸®°í ÆË¾÷ ¸Þ´º·ÎºÎÅÍ ¶Ç´Â Refactor ¸Þ´º·ÎºÎÅÍ Extract
Superclass... ¸¦ Ŭ¸¯ÇϽʽÿÀ.

|
´ç½ÅÀº ¶ÇÇÑ Å¬·¡½º¸¦ Commander µî°ú °°Àº ´Ù¸¥ º¸±â¿¡¼ °í¸¦ ¼ö ÀÖ½À´Ï´Ù.
|
2. ±× ÈÄ¿¡, ´ÙÀ½ À©µµ¿ì´Â ¸®ÆÑÅ丵 ¸Å°³ º¯¼ö¸¦ ÁöÁ¤Çϱâ À§ÇØ ³ªÅ¸³¯ °ÍÀÔ´Ï´Ù:

ù ¹øÂ°·Î, µÎ ¿É¼Ç ( Extract Superclass ¶Ç´Â Rename original class and use
superclass where possible ) ¹öư ÁßÀÇ ÇÑ °³¸¦ ¼±ÅÃÇϽʽÿÀ. ±×¸®°í Superclass name ¶Ç´Â Rename original class to (¼±Åà ¿É¼Ç ¹öư¿¡ µû¶ó¼) ÅØ½ºÆ® Çʵ忡¼ ½´ÆÛŬ·¡½º¿¡ ´ëÇÑ À̸§ ¶Ç´Â ¿øÇüÀÇ Å¬·¡½º¿¡ ´ëÇÑ »õ·Î¿î À̸§À» ÁöÁ¤ÇϽʽÿÀ.
Package ÅØ½ºÆ® Çʵ忡¼, ½´ÆÛŬ·¡½º°¡ »ý¼ºµÈ ÆÐŰÁö¸¦ ÁöÁ¤ÇϽʽÿÀ. ÃֽŠÆÐŰÁö´Â µðÆúÆ®·Î »ç¿ëµË´Ï´Ù.
Members to Form Superclass ÆÐ³Î¿¡¼, ´ç½ÅÀÌ ½´ÆÛŬ·¡½º·Î Æ÷ÇԵDZ⸦ ¿øÇϴ Ŭ·¡½º ¸â¹ö(¸Þ¼Òµå, ÇÊµå µî)À» ¼±ÅÃÇϽʽÿÀ. ½´ÆÛŬ·¡½º¿¡¼ ±¸Çö À̿ܿ¡ ´ÜÁö ¸Þ¼Òµå ¼±¾ðÀ» Àü¼ÛÇϱâ À§ÇØ Make
abstract üũ ¹Ú½º¸¦ ¼±ÅÃÇϽʽÿÀ.
JavaDoc ±×·ì¿¡¼, »õ·Î¿î ½´ÆÛŬ·¡½º°¡ »ý¼ºµÉ ¶§ Javadoc°¡ ´Ù·ïÁ®¾ß¸¸ ÇÏ´Â ¿É¼Ç ¹öưÀ» ¼±ÅÃÇϽʽÿÀ.
As is
|
???
|
Copy
|
???
|
Move
|
???
|
|
3. OK¸¦ Ŭ¸¯ÇϽʽÿÀ, ±×¸®°í ½´ÆÛŬ·¡½º°¡ »ý¼ºµÉ °ÍÀÔ´Ï´Ù.
4. ±× ÈÄ, ¸¸ÀÏ ´ç½ÅÀÌ Extract
Superclass ¿É¼Ç ¹öưÀ» ¼±ÅÃÇϸé, Search Usages ´ÙÀ̾ó·Î±×°¡ ³ªÅ¸³¯ °ÍÀÔ´Ï´Ù:

Preview usages to be changed üũ ¹Ú½º¸¦ ¼±ÅÃÇÏ¸é ´ç½Å¿¡°Ô ¾î¶² »ç¿ëÀÌ ¹ß°ßµÇ¾ú´ÂÁö °è¼Ó ±â¾ïÇϰí ÀÖ°í, ±×µéÀÇ ±³Ã¼¸¦ ½ÂÀÎÇϵµ·Ï Çã¶ôÇÕ´Ï´Ù. ÀÌ Ã¼Å© ¹Ú½º°¡ ¼±ÅõÇÁö ¾ÊÀ» ¶§, IDEA´Â ±³Ã¼¸¦ ÀÚµ¿ÀûÀ¸·Î ¼öÇàÇÕ´Ï´Ù.
¸¸ÀÏ °¡´ÉÇϸé IDEA°¡ ¼Ò½º Ŭ·¡½ºÀÇ »ç¿ëÀ» ºÐ¼®Çϰí, ½´ÆÛŬ·¡½ºÀÇ »ç¿ëÀ¸·Î ±×µéÀ» ±³Ã¼Çϱ⠿øÇϸé, Yes À» Ŭ¸¯Çϰí, ±×·¸Áö ¾Ê´Ù¸é No¸¦ Ŭ¸¯ÇϽʽÿÀ. »ó¼¼ÇÑ °ÍÀº Refactoring
Preview¸¦ º¸½Ê½Ã¿À.

|
½ÉÁö¾î üũ ¹Ú½º°¡ È®ÀεÇÁö ¾Ê¾ÒÀ» ¶§µµ, ¸¸ÀÏ ¹ß°ßµÈ »ç¿ëÀÌ ¾î¶² Àбâ Àü¿ë ÆÄÀÏ¿¡¼ Á¸ÀçÇÏ¸é ´ç½Å¿¡°Ô »ç¿ë ±³Ã¼¸¦ È®ÀÎÇϱâ À§ÇØ ÇÁ·ÒÇÁÆ® µÉ °Í ÀÔ´Ï´Ù.
|
5. ´ç½ÅÀº ¿øÇüŬ·¡½º¿¡ Á¸ÀçÇÏ´Â ´Ù¸¥ ¸Þ¼Òµå¸¦ ºÎ¸£´Â ¸Þ¼Òµå¸¦ ½´ÆÛŬ·¡½º·Î Àü¼ÛÇϱ⸦ ¿øÇÒÁöµµ ¸ð¸¨´Ï´Ù, ´Ù¸¥ ¸»·Î ÇÏ¸é ±×°ÍÀº ½´ÆÛŬ·¡½º·Î À̵¿µÇÁö ¾Ê½À´Ï´Ù.
¿¹¸¦ µé¸é:
public class OriginalClass extends JFrame implements Runnable, Scrollable {
public int foo;
public void method1(){
method2();
//some code here...
}
private void method2() {
//some code here...
}
}
¿©±â¿¡¼ ´ç½ÅÀº method2() ¸¦ °Çµå¸®Áö ¾Ê°í method1() À» À̵¿ÇÏ·Á°í ÇÕ´Ï´Ù . ±× ´ÙÀ½ Problems
Detected ´ÙÀ̾ó·Î±×°¡ ³ªÅ¸³³´Ï´Ù:

¸¸ÀÏ ´ç½ÅÀÌ Cancel (µðÆúÆ®)¸¦ ´©¸£¸é, ´ç½ÅÀº Extract
Superclass ´ÙÀ̾ó·Î±×·Î µ¹¾Æ °¥ °ÍÀÔ´Ï´Ù. °Å±â¼ ´ç½ÅÀº °¡´ÉÇÑ ¼Ö·ç¼ÇÀ» À§ÇØ Å½»öÇÒ ¼ö ÀÖ½À´Ï´Ù:
method1()À» À̵¿ÇÏÁö ¾Ê½À´Ï´Ù;
¶ÇÇÑmethod2()¸¦
À̵¿ÇÕ´Ï´Ù;
method1()À» ¾î¶² ¹æ¹ýÀ¸·Î¶óµµ À̵¿½Ã۰í, ±×°÷¿¡¼ ±×°ÍÀ» Ãß»óÀ¸·Î¼ ¼±¾ðÇÕ´Ï´Ù.
¸¸ÀÏ ´ç½ÅÀÌ Continue ´©¸£¸é, ½´ÆÛŬ·¡½º´Â ±×°ÍÀ» ÄÄÆÄÀÏÀ» Çϱâ À§ÇØ »ý¼ºµÉ °ÍÀÔ´Ï´Ù. ´ç½ÅÀº ±×°ÍÀ» ¼öµ¿À¸·Î Á¤Á¤Çؾ߸¸ ÇÒ °ÍÀÔ´Ï´Ù.
|