기술지원 문의는 로그인 후에 가능합니다.

확인

소식

JetBrains 관련 소식

공지사항

IntelliJ IDEA에서 일상적인 리팩토링을 즐기기_1편

2020-09-25

안녕하세요 JetBrains 한국 총판 단군소프트입니다.
버그 수정, 가독성 향상, 새로운 기능 추가와 같은 여러 가지 이유로 작업 중인 코드를 변경하는 경우가 종종 있으실 겁니다.
IntelliJ IDEA는 코드를 개선하기 위해 매일 안전하게 사용할 수 있는 강력한 리팩토링 기능을 제공합니다.
오늘은 IntelliJ IDEA가 제공하는 일상적인 리팩토링에 대해서 알려드리겠습니다.

​-요소 이름 바꾸기
-시그니처 변경
-메소드 추출
-메소드 인라인화


요소 이름 바꾸기

클래스 파일에서 직접 이름을 변경하여 수동으로 이름을 바꾸는 것은 안전하지 않습니다.
예를 들어, 에디터에서 Bug 클래스의 이름을 ABug로 변경하면 이 클래스를 사용하는 다른 모든 코드를 업데이트하지 못하고 IntelliJ IDEA 2020.2부터는 에디터에 “관련 문제" 오류 메시지가 표시됩니다.


제자리에서 적용 가능한 새로운 이름 변경 리팩토링(in-place rename refactoring)이 여백에서 강조 표시됩니다.
여백에서 R 아이콘을 클릭하면 Bug의 모든 사용 위치 이름이 ABug로변경되는 것을 미리 볼 수 있습니다.


​또한 IntelliJ IDEA는 유사한 이름을 가진 변수를 찾아서 사용자에게 업데이트할 변수를 선택할 수 있게 하고 에디터에서 클래스 이름을 변경할 때 단축키 ⌥⏎ 또는 ​Alt+Enter를 사용하여 이 단계를 반복할 수 있습니다.

그리고 macOS에서 ⇧F6 또는 Windows/Linux에서 Shift+F6을 사용하여 이름 변경 리팩토링을 호출할 수 있으며 IntelliJ IDEA는 클래스, 메소드 및 변수에 대한 대체 이름을 제안합니다. 사용자가 새 이름을 선택하면 IntelliJ IDEA가 안전하게 리팩토링을 완료합니다.


예를 들어, 필드 description의 이름을 desc로 변경하면 IntelliJ IDEA는 이 필드가 getter 및 setter 메소드에서 사용되는지 여부를 감지하고 사용자에게 업데이트할 것인지 묻습니다. 또한 메소드 매개변수 이름의 사용 위치도 업데이트합니다.



getItems 메소드를 정의하는 View라는 인터페이스로 하는 작업은 macOS에서 ⌘B를 사용하거나 Windows/Linux에서 Ctrl+B를 사용하여 사용 위치를 탐색할 수 있습니다. 이 인터페이스는 ViewImpl 클래스에 의해 구현됩니다.

View라는 인터페이스에서 macOS의 경우 ⇧F6, Windows/Linux의 경우 Shift+F6을 사용하면 getItems 메소드의 이름이 getItemsList로 변경됩니다. Enter 키를 누르면 ViewImpl 클래스에서 구현이 업데이트됩니다.



또한 macOS의 경우 ⇧F6 또는 Windows/Linux의 경우 Shift+F6를 사용하면, 프로젝트 창에 액세스하고, 클래스, 패키지, 파일 또는 디렉토리의 이름을 변경할 수도 있습니다.

시그니처 변경

클래스 또는 메소드의 시그니처를 안전하게 변경하는 방법을 살펴보겠습니다.



[BugReport의 binaryStrings 메소드는 하나의 문자열 인수를 허용 예시]
하나: int 유형의 카운터와 같이 binaryStrings 메소드에 매개변수를 추가할 수 있습니다.
다시 말하지만 이것은 제자리에서 적용 가능한 리팩토링이며 여백 영역에서 R 아이콘으로 강조 표시됩니다. 여백에 있는 아이콘을 클릭하고 메소드 시그니처를 업데이트하여 메소드 호출자가 디폴트값을 사용하도록 매개변수에 기본값을 추가할 수 있습니다.



: macOS에서 ⌥⏎, 또는 Windows/Linux에서 Alt+Enter를 사용하여 메소드 시그니처를 업데이트하고 디폴트 매개변수 값을 추가    할 수 있습니다.

셋: macOS에서 ⌘F6, 또는 Windows/Linux에서 Ctrl+F6을 사용하여 시그니처 변경 대화 상자를 호출해서 메소드 시그니처를 변경    할 수 있습니다. 디폴트 값이 “true”인 부울 매개변수 상태를 추가해 보겠습니다. 이 대화 상자를 사용하여 매개변수의 순서를     변경할 수도 있습니다.

: 오버로드를 통해 위임을 선택할 수 있는 옵션도 있습니다. 리팩토링하면 메소드가 오버 로드됩니다.



MyMap 클래스를 사용하여 클래스 시그니처 변경이 어떤 영향을 미치는지 확인할 수 있습니다.
macOS에서 ⌘F6, 또는 Windows/Linux에서 Ctrl+F6을 사용하여 클래스 시그니처를 수정할 수 있습니다.

여기에 하나는 디폴트 값이 Integer인 K인 것과 디폴트 값이 StringV인 두 개의 제네릭 매개변수를 추가해 클래스를 리팩토링하면 MyMap의 사용 위치가 변경됩니다.




메소드 추출

메소드 추출 리팩토링은 메소드를 더 짧고 읽기 쉽게 만들 수 있습니다.


그룹화할 수 있는 binaryStrings 메소드에서 코드를 선택하면 macOS에서는 ⌥⌘M, Windows/Linux에서는 Ctrl+Alt+M 단축키를 사용하여 이 코드를 다른 메소드로 추출할 수 있습니다.

이 블록에서 사용하는 지역 변수 또는 메소드 매개변수가 여기에 매개변수로 전달됩니다. 메소드 이름(예: manipulateStack)을 입력하면 추출한 코드 블록이 메소드 호출로 대체됩니다.



또한 코드를 선택한 다음, macOS에서는 ⌥⏎, Windows/Linux에서는 Alt+Enter를 사용하여 메소드 추출을 선택하면 메소드를 추출할 수도 있습니다.


메소드 인라인화

메소드 인라인화 리팩토링은 메소드 추출 리팩토링의 반대입니다. macOS에서는 단축키 ⌥⌘N, Windows/Linux에서는 Ctrl+Alt+N을 사용하여 방금 생성한 manipulateStack 메소드를 인라인화할 수 있습니다. 메소드 내용을 인라인화하고 메소드를 삭제하거나 유지할 수 있습니다.



메소드를 삭제하는 예제입니다.

그렇다면 메소드를 인라인화해야 하는 이유는 무엇일까요? 그 이유는 불필요한 리디렉션을 제거하는 데 사용하거나 잘못 리팩토링된 메소드를 인라인화하고 다시 추출해야 할 수도 있기 때문입니다.


포스팅에 사용된 코드는 여기서 확인할 수 있습니다.
IntelliJ IDEA에서의 일상적 리팩토링에 대한 영상을 모시려면 아래를 클릭해 주세요.


나머지 내용은 다음 게시글에서 계속됩니다.
감사합니다.

​ ​ ​

목록