이클립스 리팩토링 DarkKaiser, 2007년 7월 7일2023년 9월 5일 겉으로 보이는 동작의 변화없이 소프트웨어의 내부 구조(디자인)를 바꾸는 작업 Rename 패키지, 클래스, 메서드, 필드, 변수, 파라미터의 이름을 바꾸는 데 사용할 수 있으며, 코드의 내용과 관계가 없는 프로젝트 이름이나 소스 폴더의 이름도 이 기능으로 바꿀 수 있다. Move 메서드나 필드가 잘못된 클래스에 속해 있어 이를 적절한 다른 클래스로 옮기고 싶을 수 있다. 또는 어떤 패키지에 속해 있는 클래스를 다른 클래스로 옮기고 싶은 경우도 있다. 이런 경우에 Move 리팩터링을 사용할 수 있다.클래스를 다른 패키지로 이동 클래스를 다른 클래스로 옮기고 싶을 때는 에디터나 패키지 탐색기에서 클래스를 선탟한 다음 Refactor>Move를 선택하여 나타나는 대화상자에서 현재 선택한 클래스가 위치할 패키지를 선택한 다음 확인 버튼을 누르면 된다.새로운 패키지를 만들고 그 패키지로 클래스를 옮기고 싶을 때는 중간에 있는 New 버튼을 사용하면 된다. 클래스를 다른 패키지로 옮기는 작업은 패키지 탐색기에서 드래그/드랍을 이용할 수도 있다. 메서드/필드를 다른 클래스로 어떤 클래스에 포함되어 있는 메서드나 필드를 다른 클래스로 옮기고 싶을 때도 Move 리팩터링을 할 수 있다. 에디터나 패키지 탐색기, 또는 Outline 뷰에서 옮기고자 하는 메서드나 필드를 선택한 다음 메뉴바나 컨텍스트 메뉴의 Refactor>Move를 이용한다. 패키지를 다른 프로젝트로 패키지 탐색기에서 옮기고자 하는 패키지를 선택한 다음 컨텍스트 메뉴에서 Refactor>Move를 선택하거나 단축키를 이용한다. 다이얼로그에서 이동 목표가 되는 프로젝트에 있는 소스 폴더를 선택하면 된다. 프로젝트를 다른 위치로 패키지 탐색기에서 프로젝트를 선택한 다음 Refactor>Move를 선택하면 된다. 그리고 다이얼로그의 Use Default location 체크박스에서 선택을 해제하면 새로운 위치를 지정할 수 있다.프로젝트를 옮길 때 다이얼로그에서 지정한 디렉터리로 현재 프로젝트 내의 모든 리소스가 이동하므로, 다른 파일과 섞이지 않도록 디렉터리를 잘 선택해야 한다. Change Method Signature 메서드의 시그너처가 마음에 들지 않는 경우에는 Change Method Signature 리팩터링을 이용할 수 있다. 이 리팩터링에서는 메서드 이름, 접근 지정자, 리턴 타입, 파라미터 이름, 파라미터 순서를 변경할 수 있고, 새로운 파라미터를 추가하거나 불필요한 파라미터를 제거할 수 있다. Convert Anonymous to Nested 익명 클래스는 편리하게 사용할 수 있지만, 크 클래스에서 복잡한 작업을 처리한다거나, 이 클래스의 인스턴스를 다른 곳에서도 사용할 필요가 있는 경우에는 이 클래스에 이름을 부여하여 사용하는 편이 좋을 것이다. 이럴 때 Convert Anynymous to Nested를 사용하여 익명 클래스를 내부 클래스로 변환할 수 있다. Move Member Type to New File 처음에는 어떤 클래스 컨텍스트 안에서만 의미 있는 작업을 처리하기 위해 내부 클래스를 정의했는데, 시간이 지나면서 그 내부 클래스가 처리하는 작업이 많아지고, 그 클래스 컨텍스트 밖에서도 충분히 유효한 의미를 지니게 되었다면, 그 클래스를 독립시키는 편이 좋을 것이다. 이럴 때 Move Member Type to New File 리팩터링을 사용할 수 있다. Push Down 수퍼클래스에 정의된 메서드나 필드가 서브클래스의 일부에서만 사용된다면 그 메서드나 필드는 실제 사용된느 서브클래스로 옮겨져야 한다. 이럴 때 사용할 수 있는 것이 Push Down 리팩터링이다. Push Up 같은 수퍼클래스를 가지는 서브클래스에 동일한 필드를 가지고 있거나, 동일한 작업을 하는 메서드가 정의되어 있다면 이는 중복이다. 따라서 이런 필드나 메서드를 수퍼클래스로 옮기는 것이 좋다. 이 때는 Pull Up을 이용해 작업할 수 있다. Extract Interface 어떤 클래스 인터페이스의 동일한 부분집합을 여러 클라이언트에서 사용하고 있거나, 두 개 이상의 클래스가 공통된 인터페이스를 가지는 부분이 있다면, 그 부분집합을 인터페이스로 뽑아낼 수 있다.인터페이스를 추출하는 방법은 매우 간단하다. 클래스 이름을 선택한 다음에 메뉴바나 컨텍스트 메뉴에서 Refactor>Extract Interface를 선택하고, 다이얼로그에서 새로 만들 인터페이스의 이름을 정한 후 메서드 리스트에서 새로운 인터페이스에 포함될 메서드를 선택하면 된다. Generalize Type 변수 선언부, 파라미터, 메서드 리턴 타입 등에서 타입을 일반화한다. Use Supertype Where Possible 어떻게 보면 Generalize Type 리팩터링과 비슷한 것 같기도 하다. 그러나 Generalize Type과 Use Supertype Where Possible은 리팩터링이 적용되는 범위가 다르다. Generalize Type 리팩터링은 선택한 변수나 파라미터으 레퍼런스를 사용하는 곳을 조사해 리팩터링을 적용하므로 적용 범위는 해당 변수나 파라미터를 참조하는 곳으로 제한된다. 그러나 Use Supertype Where Possible 리팩터링은 선택한 클래스를 사용하는 모든 곳에 대해 지정한 수퍼타입을 사용할 수 있는지 조사하고 그에 대해 리팩터링을 적용하므로 영향을 받는 범위가 훨씬 넓다. Infer Generic Type Arguments ?J2SE 5.0 부터는 가독성과 정적 타입 안정성 개선을 위해 제너릭을 사용할 수 있다. Infer Generic Type Arguments는 Java Collection Framework를 사용하는 코드를 제너릭을 사용하도록 변환해 주는 리팩터링이다.Infer Generic Type Arguments 리팩터링은 리팩터링할 코드를 에디터에 열어 놓은 다음 메뉴바의 Refactor>Infer Generic Type Arguments를 선택해 실행하면 된다. Inline 어떤 메서드는 너무 단순하고 내용도 명확하여 굳이 메서드로 되어 있을 필요가 없는 경우도 있다. 이런 경우는 해당 메서드를 제거하고 메서드 호출부에 메서드의 코드를 직접 넣는 것이 더 명확할 수 있다. Inline은 바로 이런 경우에 사용하는 리팩터링이다. Extract Method 메서드 내의 일정 코드 블럭을 다른 메서드로 뽑아낼 때 사용 Extract Local Variable 수식이 복잡한 경우 수식 일부를 임시 변수로 뽑아낼 때 사용 Extract Constant 특별한 의미가 있는 숫자 리터럴이나 문자열이 있으면, 코드에 이를 직접 쓰는것 보다는 상수를 정의하고 이를 사용하는 것이 좋다. 상수로 정의해 두면 의미와 목적이 명확해질 뿐 아니라 나중에 상수 값을 바꿔야 하는 경우 실수할 확률을 줄일 수 있다. 이 때 사용하는 리팩터링이 extract Constant 리팩터링이다. Introduct Parameter 메서드 내에서 사용하는 특정 값이나 어떤 값을 리턴하는 수식을 메서드의 파라미터로 받도록 바꾸고 싶을 때 사용할 수 있다. Introduce Factory 클래스의 생성자를 private 또는 protected로 만들고 static 팩터리 메서드를 추가하고, 생성자를 호출하는 부분은 모두 팩터리 메서드를 호출하도록 바꾼다. Convert Local Variable to Field 지역 변수로 쓰이던 것을 필드로 바꾸고 싶을 때 사용할 수 있다. Encapsulate Field public으로 선언되어 있는 필드를 private으로 바꾸고 get/set 메서드를 통해 접근하도록 하는 리팩터링이다. eclipse 리팩토링