리팩터링

ReSharper의 리팩터링 기능은 개수, 유용성, 적용 범위 측면에서 Visual Studio의 성능을 능가합니다. 각각의 리팩터링은 교차 언어 코드를 비롯해 리팩터링이 적용되는 전체 코드 선택 범위(전체 솔루션만큼 광범위한 수준 포함)를 분석하고 이 분석 정보를 활용해 가장 지능적인 방식으로 코드를 업데이트합니다.

ReSharper의 모든 리팩터링은 C#에서 작동하고 대부분 VB.NET에서도 사용할 수 있으며 일부는 ASP.NET, XAML 및 지원되는 기타 언어에서 사용할 수 있습니다.

또한 Martin Fowler의 정의에 따른 진짜 리팩터링이 아니지만 덜 정교하고 일반적으로 지역 코드 변환을 구현하는 ReSharper의 컨텍스트 액션도 확인해 보세요.

C#에 제공되는 '다음을 리팩터링' 메뉴

코드 리팩터링 사용

리팩터링을 사용하기 위해 캐럿을 다음 위치에 배치할 수 있습니다.

  • 텍스트 에디터에서 심볼 위
  • 텍스트 에디터에서 코드 선택 범위 위
  • 1개의 파일 위 또는 Solution Explorer(솔루션 탐색기) 도구 창에서 선택한 여러 개의 파일 위
  • 1개의 유형 멤버 위 또는 File Structure(파일 구조)나 다른 ReSharper 도구 창에서 선택한 여러 개의 유형 멤버 위

캐럿을 배치한 다음, ReSharper의 Refactor(리팩터링) 메뉴에서 또는 리팩터링별 키보드 단축키를 사용해서 필요한 리팩터링을 실행하세요. 또는 Refactor This(다음을 리팩터링) 명령어(Ctrl+Shift+R)를 사용해 현재 캐럿 위치 또는 현재 선택 범위에 적용할 수 있는 리팩터링을 확인할 수도 있습니다.

ReSharper의 시그너처 변경 리팩터링

시그너처 변경

이 리팩터링을 이용하면 메서드 시그너처를 다음과 같이 수정할 수 있습니다.

  • 매개변수 추가, 제거, 이름 변경 및 재배열
  • 반환 유형 변경
  • 매개변수 유형 변경
  • 메서드 이름 변경

시그너처 변경이 실행되면 ReSharper에서 해당 메서드의 모든 사용 위치를 검색해 메서드의 모든 호출, 구현 및 재정의를 수정하여 변경 내용을 반영합니다. 새로 추가된 매개변수의 경우, 사용자가 제공한 기본값이 모든 메서드 호출에서 대체됩니다. 재정의에서는 메서드로 전달된 원래 매개변수가 기본 호출로 전달됩니다.

ReSharper의 확장 메서드를 정적으로 변환 리팩터링

확장 메서드를 일반 정적으로 변환

이 대화상자 없는 리팩터링은 확장 메서드를 동일한 클래스의 정적 메서드로 변환합니다. 반대로 실행하는 기능은 Convert Static to Extension Method(정적 메서드를 확장으로 변환)에서 제공됩니다.

정적 메서드를 확장으로 변환

이 리팩터링은 정적 메서드를 확장 메서드로 변환합니다. 변환을 성공적으로 수행하려면 정적 메서드가 (1) 최소 하나의 인수를 포함하고, (2) 정적 클래스 내에 있어야 합니다. 반대로 실행하는 기능은 Convert Extension Method to Plain Static(확장 메서드를 일반 정적으로 변환)에서 제공됩니다.

ReSharper의 리팩터링을 사용해 인터페이스를 추상 클래스로 변환

인터페이스를 추상 클래스로 변환

일부 논리를 인터페이스에 추가하려 하거나 인터페이스를 클래스로 만드는 것이 낫다고 판단되는 경우에 이 리팩터링을 사용해야 합니다. 이 리팩터링에서는 모든 충돌을 검사하여, 기본 유형을 이미 포함하고 있는 인터페이스를 유형이 구현하는지 확인합니다(C#은 여러 개의 상속을 가지지 않으므로 오류에 해당).

추상 클래스를 인터페이스로 변환

추상 클래스를 인터페이스로 변환하기 위해 이 리팩터링을 적용할 수 있습니다. 특히 2개 이상의 추상 클래스로부터 클래스를 상속받기 위해 해당 클래스 중 하나를 인터페이스로 변환해야 하는 경우 유용합니다.

ReSharper의 상위 클래스 추출 리팩터링

상위 클래스 추출

이 리팩터링을 사용하면 클래스의 기본 클래스를 생성하고 일부 멤버를 해당 클래스로 이동할 수 있습니다. 간단히 캐럿을 클래스 선언에 배치하고 추출할 멤버를 선택한 후, 리팩터링을 실행하면 됩니다. 이 기능은 논리를 나중에 공유할 수 있도록 상속 계층 구조에서 상위로 이동할 때 매우 유용합니다.

ReSharper의 매개변수 삽입 리팩터링

매개변수 삽입

메서드에서 표현식 또는 지역 변수를 선택한 후 이 리팩터링을 사용해 새로운 매개변수를 생성할 수 있습니다. 논리와 의미는 유지하면서 변경된 시그너처를 반영해 모든 호출 사이트가 업데이트됩니다.

표현식이 호출 사이트에서 액세스할 수 없는 지역 변수를 사용하는 경우, 이 리팩터링을 통해 변수를 위임으로 전달할 수 있습니다.

메서드를 정적/공유로 변환

이 리팩터링은 this를 메서드의 매개변수로 설정해서 비정적 메서드를 정적 메서드(VB.NET의 Shared)로 변환합니다. 리팩터링 후, 대상 메서드는 정적(VB.NET의 Shared)으로 선언되고 필요한 매개변수가 호출 사이트에 추가됩니다. 또한 이 리팩터링은 비정적 메서드(VB.NET의 non-Shared)를 이동하려고 할 때에도 유용합니다. 이 경우, Make Method Static(메서드를 정적으로 변환)을 Make Method Non-static(메서드를 비정적으로 변환)의 예비 단계로 사용하세요.

메서드를 비정적/비공유로 변환

이 리팩터링은 정적 메서드(VB.NET의 Shared)를, 선택한 매개변수 유형의 인스턴스 메서드로 변환하고(즉, 메서드를 매개변수 유형으로 이동하고 해당 매개변수를 this로 변환), 그에 따라 메서드 호출도 변환합니다.

인스턴스 메서드 이동

이 리팩터링을 사용하면 현재 유형에서 메서드 매개변수에 있는 유형 중 하나로 인스턴스 메서드를 빠르게 이동할 수 있습니다.

정적 멤버 이동

이 리팩터링은 정적 필드 및 메서드를 다른 유형으로 이동합니다. 비정적 메서드를 이동하려면 인스턴스 메서드 이동을 대신 사용하십시오.

문자열을 리소스로 이동

ReSharper의 국제화 기능 팩의 일부인 이 리팩터링을 이용하면 로컬라이제이션 가능한 문자열을 리소스 파일로 추출할 수 있습니다. 리팩터링이 진행되는 동안 명시적 문자열의 사용 위치는 리소스 래퍼에 대한 참조로 교체됩니다.

이 리팩터링을 실행하려면 전용 단축키 또는 Refactor This(다음을 리팩터링) 명령어를 사용하면 됩니다. 혹은, ReSharper가 리소스 파일로 추출되지 않은 문자열을 코드 검사로 강조 표시하고, Move String to Resource(문자열을 리소스로 이동) 리팩터링을 빠른 수정으로 제안할 수도 있습니다. ReSharper가 이 작업을 수행하도록 구성하는 방법에 대해서는 ReSharper 도움말을 참조하세요.

멤버를 위로 이동

이 리팩터링은 유형 멤버를 상위 클래스 또는 인터페이스로 이동하도록 도와줍니다. 이 작업은 동작을 일반화하는 데 유용합니다. ReSharper는 현재 클래스의 모든 멤버를 분석하고 위로 이동할 수 있는 멤버 목록을 만듭니다. 또, 리팩터링을 완료하기 전에 잠재적인 충돌 문제를 검사합니다. 예를 들어, 상위 클래스로 이동하려는 멤버가 대상 유형에서 액세스 가능한지 여부를 검사합니다. 반대로 실행하는 기능은 Push Members Down(멤버를 아래로 이동)에서 제공됩니다.

멤버를 아래로 이동

이 리팩터링은 유형 멤버를 하위 유형으로 이동해서 유형 계층 구조의 정리를 돕습니다. 이 작업은 동작을 특수화하는 데 유용합니다. ReSharper는 현재 유형의 모든 멤버를 분석하고 아래로 이동할 수 있는 멤버 목록을 만듭니다. 또, 리팩터링을 완료하기 전에 잠재적인 충돌 문제를 검사합니다. 예를 들어, 아래로 이동하려는 멤버가 대상 유형에서 액세스 가능한지 여부를 검사합니다. 반대로 실행하는 기능은 Pull Members Up(멤버를 위로 이동)에서 제공됩니다.

ReSharper의 매개변수 끌어오기 리팩터링

매개변수 끌어오기

빠른 수정을 사용하든, Change Signature(시그너처 변경) 리팩터링을 사용하든 상관없이 새로운 매개변수를 메서드에 추가할 때 ReSharper에서 해당 시그너처와 메서드의 모든 사용 위치를 업데이트할 뿐 아니라 메서드가 속해 있는 호출 체인을 분석하여 체인 내 어느 위치로든 새로운 매개변수를 끌어올 수 있도록 도와줍니다.

XAML의 이름 변경 리팩터링

이름 변경

Rename(이름 변경) 리팩터링을 통해 네임스페이스, 유형, 메서드, 매개변수, 지역 변수, 속성, 필드, 이벤트 등을 포함한 모든 심볼의 이름을 변경할 수 있습니다. 이 리팩터링은 심볼에 대한 모든 참조를 자동으로 찾아 수정합니다. 에디터에서 바로 실행할 수 있고 다른 뷰(클래스 뷰, 객체 브라우저)에서 호출할 수도 있습니다.

Rename은 C#, VB.NET, ASP.NET, XML, XAML, 빌드 스크립트 등, 지원되는 모든 언어와 기술에서 작동합니다.

Rename 리팩터링을 사용할 경우, XAML 마크업에서 자동 참조 수정 기능이 완벽하게 확장 지원됩니다. 또한 네임스페이스 별칭 및 리소스와 같은 특정 XAML 심볼의 이름을 쉽게 바꿀 수 있습니다.

빌드 스크립트의 경우, ReSharper를 사용해 속성 또는 대상의 이름을 변경할 때 변경 내용을 반영하여 모든 참조와 주석 및 문자열의 사용 위치까지 자동으로 업데이트됩니다.

ReSharper의 변형 매개변수 리팩터링

매개변수 변환

이 리팩터링은 새로운 클래스 또는 구조체를 생성하여, 선택한 메서드의 매개변수를 새로 생성된 유형의 캡슐화된 필드로 변환합니다. 매개변수의 사용 위치가 생성된 유형의 속성 사용 위치로 변환됩니다.

또한 out 매개변수를 제거할 수 있습니다. void 메서드의 경우, 하나 또는 여러 개의 out 매개변수가 필요에 따라 튜플 객체를 사용하는 반환으로 변환됩니다. 비 void 메서드의 경우, 튜플 객체를 사용하는 기존의 반환 유형과 결합될 수 있습니다.

Transform Parameters(매개변수 변환) 리팩터링은 Transform Out Parameters(out 매개변수 변환)Extract Class from Parameters(매개변수에서 클래스 추출)라는 2가지 다른 리팩터링을 결합한 것으로, 그 기능을 대신합니다.

생성자를 factory 메서드로 교체

이 리팩터링은 클래스의 새로운 인스턴스를 반환하는 정적 메서드로 생성자를 캡슐화합니다.

factory 메서드 패턴은 생성할 객체의 정확한 클래스를 지정하지 않고 객체를 생성하는 방법입니다. ReSharper는 객체를 만들기 위한 별도의 메서드를 생성합니다. 하위 클래스는 해당 메서드를 재정의하여 생성할 객체의 파생 유형을 지정할 수 있습니다.

가능한 경우 기본 유형 사용

이 리팩터링을 사용하면 가능한 경우, 즉 파생 유형의 어떤 멤버도 사용되지 않는 경우, 특정 유형의 사용 위치가 기본 유형 또는 인터페이스에 대한 참조로 교체되어 코드가 일반화됩니다. 이 리팩터링은 특히 Pull Members Up(멤버를 위로 이동) 리팩터링을 실행한 후에 사용하면 유용합니다.

유형 복사

유형 사본을 수초 만에 다른 이름으로 생성하거나 다른 네임스페이스 내에 만들 수 있습니다. ReSharper는 사본용으로 별도 파일을 생성하는 작업을 담당합니다. 부분적 유형의 경우, 별도 파일에 있는 경우라도 모든 부분이 복사됩니다.

익명 유형을 이름 지정된 유형으로 변환

이 리팩터링은 익명 유형을 현재 메서드(지역) 또는 전체 솔루션(전역) 범위에서 이름 지정된 유형으로 변환합니다. 이 리팩터링이 제공하는 대화상자에서 ReSharper가 자동 속성 또는 지원 필드가 있는 속성을 생성할지 여부를 지정하고, 상등 및 서식 지정 메서드 오버로드를 생성하도록 선택할 수 있습니다.

인덱서를 메서드로 변환

이 리팩터링은 Convert Property to Method(프로퍼티를 메서드로 변환)와 매우 유사하게 작동하지만, 인덱서(VB.NET의 디폴트 프로퍼티)를 대상으로 합니다. 게터만, 세터만 또는 둘 다 메서드로 변환할 수 있습니다. 반대로 실행하는 기능은 Convert Method to Indexer(메서드를 인덱서로 변환)에서 제공됩니다.

메서드를 인덱서로 변환

Convert Indexer to Method(인덱서를 메서드로 변환)와 반대되는 리팩터링입니다. 대화상자 없는 모드에서 작동하지만, 인덱서에서 게터와 세터 모두를 생성하려면 2개의 메서드에 리팩터링을 적용해야 할 수도 있습니다.

메서드를 프로퍼티로 변환

이 리팩터링을 이용하면, 매개변수가 없는 비 void 메서드를 읽기 액세스 권한을 가진 속성으로 변환하고, 정확히 하나의 매개변수가 있는 void 메서드를 쓰기 액세스 권한을 가진 속성으로 변환할 수 있습니다. 페어링된 메서드는 단일 읽기/쓰기 속성으로 변환할 수 있습니다.

프로퍼티를 자동 프로퍼티로 변환

이 리팩터링은 비공개 지원 필드를 가진 속성을 자동 구현 속성(자동 속성이라고도 함)으로 변환하도록 도와줍니다. 이 리팩터링은 지원 필드를 제거하고 모든 사용 위치를 새로 생성된 자동 속성으로 교체합니다.

ReSharper의 프로퍼티를 메서드로 변환 리팩터링

프로퍼티를 메서드로 변환

이 리팩터링을 사용하면 읽기 액세스 가능한 속성을 게터 유형 메서드(매개변수가 없는 비 void 메서드)로, 쓰기 액세스 가능한 속성을 세터 유형 메서드(정확히 1개의 매개변수를 가진 void 메서드)로 변환할 수 있습니다. 읽기/쓰기 액세스를 모두 허용하는 속성의 경우, 게터 및 세터 유형 메서드 쌍으로 변환이 가능합니다.

ReSharper의 클래스 추출 리팩터링

클래스 추출

서로 다른 2개의 클래스가 반드시 있어야 실행되는 클래스가 있나요? 이 리팩터링을 이용하면 복잡한 1개의 클래스를 2개의 단일한 역할을 가진 클래스로 분해할 수 있습니다. 클래스 추출은 이전 클래스에서 새 클래스로 이동할 메서드와 필드를 선택할 수 있도록 도와줍니다. 또한 손상된 종속성 및 접근성 문제를 경고하고 충돌 해결 옵션을 제안합니다.

인터페이스 추출

이 리팩터링을 이용하면 클래스에서 인터페이스를 생성하고 해당 클래스가 생성된 인터페이스를 구현하도록 설정할 수 있습니다. 인터페이스로 추출할 멤버를 선택하고, 인터페이스의 이름을 지정할 수도 있습니다.

메서드 추출

코드 블록을 선택하고 메서드 추출 리팩터링을 실행하여 메서드(VB.NET의 Sub 또는 Function)로 변환하세요. ReSharper가 자동으로 코드를 분석하여 반환값 및/또는 out/ref 매개변수를 탐지합니다.

필드 삽입

표현식 또는 지역 변수를 선택한 후 이 리팩터링을 적용해 보세요. 리팩터링에서 새로운 필드 또는 상수를 생성하고 표현식 또는 지역 변수 이니셜라이저를 사용해 초기화합니다. 필드는 해당 이니셜라이저, 유형 생성자 또는 현재 멤버에 할당할 수 있습니다.

필드 인라인화

이 리팩터링은 필드에 쓰기 사용 위치가 하나밖에 없는 경우, 필드의 쓰기 사용 위치를 해당 필드의 초기화 표현식으로 바꾸고 필드 선언 및 쓰기 사용 위치를 삭제합니다.

필드 캡슐화

필드 캡슐화 리팩터링을 이용하면 기존 필드에서 접근자 속성을 신속하게 생성할 수 있습니다. 리팩터링이 실행되면 필드 사용 위치가 속성 사용 위치로 자동 교체됩니다. 이 리팩터링의 명확한 이점은 필드에 대한 직접 액세스를 속성을 사용하여 차단할 수 있다는 점입니다.

메서드 인라인화

이 리팩터링은 메서드의 본문을 호출자의 본문으로 전달하는 동시에 메서드를 제거할 수 있습니다. 반대로 실행하는 기능은 Extract Method(메서드 추출)에서 제공됩니다.

ReSharper의 리팩터링을 사용해 변수 삽입

변수 삽입

멤버 코드 내에서 임의 표현식을 선택하고 변수 삽입 리팩터링을 실행해 보세요. 새로운 묵시적 또는 명시적 유형의 지역 변수가 선언되고 선택한 표현식으로 초기화되며 원래 표현식은 변수의 이름으로 교체됩니다. 코드에 원래 표현식이 여러 곳에서 사용되는 경우, 모든 사용 위치를 새로 생성된 변수로 교체할 수 있는 옵션이 제공됩니다. 동일한 방식으로 상수식에 상수를 삽입할 수도 있습니다.

매개변수 인라인화

이 리팩터링은 메서드의 매개변수를 본문으로 이동할 수 있도록 도와줍니다. 예를 들어 동일한 상수값이 모든 호출 내의 메서드로 전달된 경우, 매개변수를 제거하고 해당 지역 변수를 메서드 본문에 추가할 수 있습니다.

변수 인라인화

임의 변수 또는 지역 상수를 선택하고 'Inline Variable'(변수 인라인화) 리팩터링을 실행해 보세요. 코드에서 선택한 변수의 모든 사용 위치가 해당 이니셜라이저로 교체됩니다. 반대로 실행하는 기능은 Introduce Variable(변수 삽입)에서 제공됩니다.

하위 문자열 변수 삽입 리팩터링

하위 문자열 변수 삽입

이 리팩터링은 문자열의 일부를 별도의 변수로 빠르게 이동할 수 있게 도와줍니다. 대상 C# 버전에 따라 이 리팩터링은 문자열 보간을 사용하거나 문자열을 String.Format()으로 래핑합니다.

ReSharper의 일치하는 파일로 유형 이동 리팩터링

일치하는 파일로 유형 이동

이 리팩터링은 하나의 파일 또는 각각 다양한 유형을 가진 여러 개의 파일에 적용할 수 있습니다. ReSharper는 유형별 전용 파일을 생성한 후 유형을 해당 파일로 이동시킵니다.

먼저 유형을 사용한 다음 ReSharper의 Create from Usage(사용 위치에서 생성) 기능을 사용해 선언하려는 경우, 'Move Types into Matching Files'(일치하는 파일로 유형 이동)는 반드시 필요한 리팩터링입니다.

파일 이름과 일치하지 않는 클래스 이름에서 Alt+Enter를 누르면 이 리팩터링을 바로 실행할 수 있습니다.

폴더로 이동

이 리팩터링은 하나 또는 여러 개의 클래스 및 파일을 솔루션 내의 다른 프로젝트 또는 폴더로 이동할 수 있도록 지원합니다. 이동을 실행하면 ReSharper에서 필요에 따라 using 지시문을 업데이트하고 선택적으로 새 위치에 따라 네임스페이스 이름을 변경하고 별도 파일로 이동할 클래스를 배포하기도 합니다.

형식을 외부 범위로 이동

이 리팩터링은 내부 유형을 상위 수준으로 이동합니다. 내부 유형이 인클로징 유형의 멤버를 사용할 경우, 인클로징 유형에 대한 참조가 이동된 유형의 생성자에게 인수로 전달됩니다. 이 리팩터링은 Move(이동) 리팩터링 명령어를 통해 액세스할 수 있습니다.

유형을 다른 파일 또는 네임스페이스로 이동

네임스페이스 사이에서 유형을 간편하게 이동할 수 있으며 참조가 ReSharper에서 자동으로 업데이트됩니다. 또한 유형을 외부 또는 중첩된 범위나 다른 파일로 이동할 수도 있습니다.
이 리팩터링을 사용하면 주어진 유형을 구현하는 코드를 별도 파일로 빠르게 이동할 수 있습니다. 이 리팩터링은 Move(이동) 리팩터링 명령어를 통해 액세스할 수 있습니다.

XAML을 사용하고 .NET 클래스를 다른 네임스페이스로 이동할 경우, 클래스에 대한 XAML 마크업 참조가 업데이트되고 XAML import 지시문이 그에 따라 삽입/변경됩니다. 이 리팩터링은 어떤 유형 참조에서든 XAML 마크업에서 바로 실행할 수 있습니다.

안전하게 삭제

C# 또는 VB.NET 코드 파일, ASP.NET 코드 및 마크업, 빌드 스크립트 또는 XAML에서 유형, 유형 멤버, 그 밖의 모든 심볼 삭제하려는 경우, 이 리팩터링을 사용하여 삭제 작업을 안전하게 수행할 수 있습니다. 심볼이 사용된 위치가 발견되지 않거나 사용 위치를 안전하게 접을 수 있는 경우, 심볼이 삭제됩니다. 그렇지 않으면 해당 코드를 편집할 수 있도록 ReSharper가 안전하게 삭제할 수 없는 모든 사용 위치를 보여줍니다.

이 리팩터링은 선택한 파일 또는 파일 멤버에 적용되므로 전체 하위 시스템을 안전하게 삭제할 수 있습니다.

빌드 파일의 대상 또는 속성에서 Safe Delete(속성에서 안전하게 삭제)를 실행할 경우, ReSharper가 선택된 심볼을 제거하기 위해 필요한 모든 유효성 검사와 작업을 수행합니다. 충돌하는 참조도 제거해줍니다.

멤버를 부분으로 추출 리팩터링

멤버를 부분으로 추출

이 리팩터링을 사용하면 서로 다른 유형을 가진 부분적 클래스 사이에서 유형 멤버를 빠르게 이동할 수 있습니다. 리팩터링에서는 입력된 내용에 따라 기존 또는 새로운 유형 부분을 사용합니다.

#region에서 리팩터링을 실행하면 해당 리전 이름에서 추론된 이름을 가진 새 파일로 모든 리전 멤버를 이동할 수도 있습니다.

단축키 참고사항

이 페이지에 나온 모든 키보드 단축키는 ReSharper의 기본 'Visual Studio' 단축키에서 제공됩니다. ReSharper의 2가지 단축키에 관한 자세한 내용은 ReSharper 문서를 참조하세요.