IDE & Apps/IntelliJ Idea

깃털보다 가벼운 인텔리J 아이디어(IntelliJ Idea) 팁 8

Figo Kim 2016. 5. 19. 17:15
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

오늘도 가볍게  Extract Interface라는 리펙토링 관련 기능에 대해서 알아보도록 하겠습니다.


우선 아래와 같이 두개의 클래스(Class A, Class B)가 있고 ClassB에는 상수와 두개의 메소드가 있습니다.


해당 클래스 내에서 마우스 오른쪽 클릭을 통해서 

Refactor --> Extract --> Interface를 선택합니다.


선택시 아래와 같은 설정창이 나타납니다.


  • Extract interface from : 인터페이스를 추출할 대상 클래스
  • Extract Interface / Rename original class and use interface where possible
    • Extract Interface : 인터페이스를 추출하지만 소스코드에 바로 적용하지는 않습니다.
    • Rename original class and use interface where possible :추출대상이 되는 클래스의 이름을 변경 후 인터페이스 추출, 그리고 소스코드에 바로 적용합니다.'
  • Target destination directory : 생성된 인터페이스가 위치할 패키지 경로
  • Members to form interface : 인터페이스로 추출할 대상을 선택
  • Java Doc : 주석 추출과 관련된 옵션
    • As is : 주석을 원래 클래스에 유지
    • Copy : 주석을 추출되는 인터페이스에 동일하게 생성
    • Move : 주석을 추출되는 인터페이스로 이동


일단 위 옵션에서 CONST라는 상수와 myMethod1라는 함수를 선택하기 위해서 Members to form interface에서 구성원을 선택 후 refactor를 누르면 아래와 같이 추가적인 팝업이 나타납니다.


Extract Interface : 인터페이스를 추출하지만 소스코드에 바로 적용하지는 않습니다.


위 설명에서와 같이 extract interface만 선택하게 되면 생성된 인터페이스가 실제적으로 소스코드에 적용되지는 않습니다. 하지만 친절한 IntelliJ에서는 이를 찾아서 적용할지를 물어봅니다. 

Yes를 누르면 추가적일 refactoring을 위한 옵션창이 나타납니다.

옵션창에서 확인하실 수 있듯이, ClassA에서 ClassB를 참조하고 있는것을 확인하실 수 있습니다. 


Renames variables with the following names to에서 소스코드에 인터페이스를 적용하면서 참조변수의 이름을 변경할 지 여부를 체크하실 수 있습니다.


따로 체크를 안 해도 무방합니다.

OK 버튼을 누르면 아래와 같이 인텔리J 하단부에 Reference Tree를 보여주면 최종적으로 refactoring을 할 것인지에 대해서 물어봅니다.


Do Refactor 버튼을 누르게 되면 Refactoring이 완료됩니다.



일단 인터페이스가 추출되고 나면 아래와 같이 클래스가 변경된 것을 확인하실 수 있습니다.


ClassB의 경우 상수는 인터페이스로 이동됬으며, 인터페이스로 추출된 클래스에 대해서는 @Override annotation이 추가되었습니다.


ClassA에서는 ClassBInterface가 적용된 것을 확인하실 수 있습니다.


물론 ClassBInterface도 아래와 같이 생성이 됩니다.


인터페이스 추출 시 두번째 옵션인 "Rename original class and use interface where possible"를 선택하게 되면 옵션창은 아래와 같이 약간 변경이 됩니다.


추출대상이 되는 클래스의 이름을 변경하고 추출 대상이 되는 클래스명이 그대로 인터페이스명으로 사용이 됩니다.

refactoring 대상이 되는 ClassB의 이름을 ClassBImpl로 변경하였고, 추출대상은 myMethod1 함수와 상수로 지정하였습니다. 추가적으로 JavaDoc의 경우 Copy 옵션을 선택했습니다.


Rename original class and use interface where possible는 앞서 refactoring후 변경사항이 소스코드에 바로 적용된다 언급했었습니다. 따라서 중간에 reference tree라던지 추가 팝업이 발생하지 않습니다.


아래와 같이 ClassB 인터페이스가 생성이되고, ClassB는 ClassBImpl로 이름이 변경됩니다.


물론 ClassB를 호출하는 부분도 ClassB 인터페이스 타입에 ClassBImpl 객체로 생성하도록 변경되었습니다.

JavaDoc옵션에서 Copy를 선택했으므로 주석도 같이 복사된 것을 확인하실 수 있습니다.

참고로 Move를 선택시 주석은 인터페이스로 이동되고 기존 Source 클래스에서는 주석이 삭제 됩니다.