IDE & Apps/IntelliJ Idea

깃털보다 가벼운 인텔리J(IntelliJ) IDEA 팁 7

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

오늘은 Refactoring기능 중 Class 분리(Delegate)에 대해서 알아보고자 합니다.


이 기능은 특정 Class의 길이가 너무 비대해지거나 해당 Class의 기능이 너무 방대해질 때, 이를 세분화시키고자 할 때 유용할 듯 싶어 보입니다.


클래스 추출하기 

우선 위와 같이 두개의 Class가 있다고 가정해봅시다. 

FirstClass에는 변수1개와 메소드 1개가 존재합니다. 이를 따로 클래스를 만들어서 사용하도록 해야 합니다.

Refactoring대상이 되는 Class에 커서를 둔 후, Refactor --> Extract --> Delegate을 선택하거나 동일한 메뉴를 마우스오른쪽 버튼으로 클릭하실 수 있습니다.

아래와 같은 창이 나타납니다.


Name for new Class : 새로이 생성될 클래스명을 지정합니다.

Package name : 해당 클래스가 위치할 패키지를 지정합니다. 입력하지 않으면 Refactoring되는 클래스와 동일 패키지내에서 생성이 됩니다.


Member to Extract : 새로운 클래스로 추출한 멤버 변수 또는 메소드를 지정합니다.

Visibility : 새로운 클래스로 추출되면서 생성되는 멤버 변수 또는 메소드의 접근제한자를 지정합니다.


위 팝업윈도우에서 구성요소를 모두 선택 후, Refactor 버튼을 누릅니다.

Refactoring 실행 후, 아래와 같이 ValueClass가 새로 생성된것을 확인할 수 있습니다.

FirstClass의 경우, 새로 생성된 ValueClass에 대한 Instance를 새로 생성 후 추출된 메소를 호출하고 있습니다.


새로 생성된 ValueClass를 보면 FirstClass에서 선택된 구성요소들이 따로 분리되어 있는 것을 확인하실 수 있습니다.

원래 FirstClass와 다른 점이라면 FirstClass에서 선택된 변수의 접근 제한자가 생략되었다는 점입니다.

이는 옵션창에서 접근 제한자 설정을 escalation으로 선택을 했고, 이는 접근 범위를 확대한다는 개념으로 보입니다.

따라서 private이 public으로 변경된 것으로 보시면 됩니다.


만약에 refactoring되기 전의 접근제한자를 유지하고자 한다면 설정창에서 Visibility에서 AS-IS를 선택하시면 됩니다.

아래는 AS-IS 선택시 결과입니다.


아래는 private으로 선택시 결과입니다.


아래는 protected로 선택시 그 결과 입니다.