Java 리팩토링 및 소스 작업
Visual Studio Code는 소스 코드를 리팩토링하는 다양한 옵션과 코딩 중에 코드를 생성하고 문제를 수정하는 소스 작업을 제공합니다. 액세스하려면 전구 💡를 볼 때마다 클릭하십시오. 또는 편집기 보기를 마우스 오른쪽 버튼으로 클릭하고 소스 작업...을 선택하십시오.
지원되는 코드 작업 목록
- 리팩터링
- 변수에 할당
- 익명 클래스를 중첩 클래스로 변환
- 익명 클래스 생성으로 변환
- 향상된 for 루프로 변환
- 람다 식으로 변환
- 정적 가져오기로 변환
- 추출 리팩토링
- 인라인 리팩토링
- 부울 반전
- 이동
- 이름 변경
- 유형 변경
- 소스 작업
- 지원되는 기타 코드 작업
리팩터링
Java 프로그램 리팩토링의 목표는 프로그램의 동작에 영향을 주지 않고 시스템 전체의 코드 변경을 수행하는 것입니다. VS Code용 Java 언어 지원은 쉽게 액세스할 수 있는 다양한 리팩토링 옵션을 제공합니다.
리팩토링 호출
리팩토링 명령은 편집기의 컨텍스트 메뉴에서 사용할 수 있습니다. 리팩토링하려는 요소를 선택하고 마우스 오른쪽 버튼을 클릭하여 컨텍스트 메뉴를 열고 리팩토링...을 선택합니다.

그러면 사용 가능한 모든 리팩토링 옵션을 볼 수 있습니다.
변수에 할당
표현식을 로컬 변수 또는 필드에 할당합니다.
예
이전
Arrays.asList("apple", "lemon", "banana");
이후
List<String> fruits = Arrays.asList("apple", "lemon", "banana");
사용되지 않는 매개변수에 대해 새 필드에 매개변수를 할당하는 데 사용할 수도 있습니다.
익명 클래스를 중첩 클래스로 변환
익명 내부 클래스를 멤버 클래스로 변환합니다.
예
Interface(){...} 익명 클래스를 Clazz 클래스의 멤버로 변환해 봅시다.
이전
public class Clazz {
public Interface method() {
final boolean isValid = true;
return new Interface() {
public boolean isValid() {
return isValid;
}
};
}
}
이후
public class Clazz {
private final class MyInterface extends Interface {
private final boolean isValid;
private MyInterface(boolean isValid) {
this.isValid = isValid;
}
public boolean isValid() {
return isValid;
}
}
public Interface method() {
final boolean isValid = true;
return new MyInterface(isValid);
}
}
익명 클래스 생성으로 변환
람다 식을 익명 클래스 생성으로 변환합니다.
예
runnable 변수에 람다 식이 할당되었습니다. 익명 클래스 생성으로 변환해 봅시다.
이전
public void method() {
Runnable runnable = () -> {
// do something
};
}
이후
public void method() {
Runnable runnable = new Runnable() {
@Override
public void run() {
// do something
}
};
}
다음도 참조하세요: 람다 식으로 변환
향상된 for 루프로 변환
간단한 for 루프를 for-each 스타일로 변환합니다.
예
이전
public void order(String[] books) {
for (int i = 0; i < books.length; i++) {
// do something
}
}
이후
public void order(String[] books) {
for (String book : books) {
// do something
}
}
람다 식으로 변환
익명 클래스 생성을 람다 식으로 변환합니다.
예
Runnable(){...} 익명 클래스를 람다 식으로 변환해 봅시다.
이전
public void method() {
Runnable runnable = new Runnable(){
@Override
public void run() {
// do something
}
};
}
이후
public void method() {
Runnable runnable = () -> {
// do something
};
}
다음도 참조하세요: 익명 클래스 생성으로 변환
정적 가져오기로 변환
필드 또는 메서드를 정적 가져오기로 변환합니다.
예
Assert.assertEquals() 호출을 정적 가져오기로 변환해 봅시다.
이전
import org.junit.Assert;
...
public void test() {
Assert.assertEquals(expected, actual);
}
이후
import static org.junit.Assert.assertEquals;
...
public void test() {
assertEquals(expected, actual);
}
상수로 추출
선택한 표현식으로 정적 final 필드를 생성하고 필드 참조로 대체한 다음 동일한 표현식이 나타나는 다른 위치를 다시 작성합니다.
예시
π의 값인 3.14를 상수로 추출해 봅시다.
이전
public double getArea(double r) {
return 3.14 * r * r;
}
이후
private static final double PI = 3.14;
public double getArea(double r) {
return PI * r * r;
}
다음도 참조하세요: 상수 인라인
필드로 추출
새 필드를 선언하고 선택한 표현식으로 초기화합니다. 원본 표현식은 필드 사용으로 대체됩니다.
예시
area 변수를 Square 클래스의 필드로 추출해 봅시다.
이전
class Square {
public void calculateArea() {
int height = 1;
int width = 2;
int area = height * width;
}
}
이후
class Square {
private int area;
public void calculateArea() {
int height = 1;
int width = 2;
area = height * width;
}
}
변수 선언을 선택할 때 변수를 필드로 변환합니다.
메서드로 추출
현재 선택된 문 또는 표현식을 포함하는 새 메서드를 생성하고 선택한 부분을 새 메서드에 대한 참조로 대체합니다. 이 기능은 길거나, 지저분하거나, 너무 복잡한 메서드를 정리하는 데 유용합니다.
예시
height * width 표현식을 새 메서드로 추출해 봅시다.
이전
public void method() {
int height = 1;
int width = 2;
int area = height * width;
}
이후
public void method() {
int height = 1;
int width = 2;
int area = getArea(height, width);
}
private int getArea(int height, int width) {
return height * width;
}
다음도 참조하세요: 메서드 인라인
지역 변수로 추출
현재 선택된 표현식에 할당된 새 변수를 생성하고 선택한 부분을 새 변수에 대한 참조로 대체합니다.
예시
platform.equalsIgnoreCase("MAC") 표현식을 새 변수로 추출해 봅시다.
이전
public void method() {
if (platform.equalsIgnoreCase("MAC")) {
// do something
}
}
이후
public void method() {
boolean isMac = platform.equalsIgnoreCase("MAC");
if (isMac) {
// do something
}
}
추출 후 동일한 트랜잭션에서 이름 바꾸기를 수행할 수도 있습니다.
다음도 참조하세요: 지역 변수 인라인
상수 인라인
상수 참조를 정의된 값으로 바꿉니다.
예시
PI 상수를 정의된 값인 3.14로 바꿔 봅시다.
이전
private static final double PI = 3.14;
public double getArea(double r) {
return PI * r * r;
}
이후
private static final double PI = 3.14;
public double getArea(double r) {
return 3.14 * r * r;
}
다음도 참조하세요: 상수로 추출
지역 변수 인라인
불필요한 변수 사용을 초기화 프로그램으로 바꿉니다.
예시
isMac 변수를 직접 부울 표현식으로 바꿔 봅시다.
이전
public void method() {
boolean isMac = platform.equalsIgnoreCase("MAC");
if (isMac) {
// do something
}
}
이후
public void method() {
if (platform.equalsIgnoreCase("MAC")) {
// do something
}
}
다음도 참조하세요: 지역 변수로 추출
메서드 인라인
메서드 호출을 메서드의 본문으로 바꿉니다.
예
getArea(int height, int width) 메서드를 height * width 표현식으로 바꿔 봅시다.
이전
public void method() {
int height = 1;
int width = 2;
int area = getArea(height, width);
}
private int getArea(int height, int width) {
return height * width;
}
이후
public void method() {
int height = 1;
int width = 2;
int area = height * width;
}
다음도 참조하세요: 메서드로 추출
조건 반전
조건의 부울 표현식을 반전시킵니다.
예
if 문의 부울 표현식을 반전시켜 봅시다.
이전
public void method(int value) {
if (value > 5 && value < 15) {
// do something
}
}
이후
public void method(int value) {
if (value <= 5 || value >= 15) {
// do something
}
}
지역 변수 반전
로컬 부울 변수를 반전시킵니다.
예
valid 변수를 반전시켜 봅시다.
이전
public void method(int value) {
boolean valid = value > 5 && value < 15;
}
이후
public void method(int value) {
boolean notValid = value <= 5 || value >= 15;
}
이동
선택한 요소를 이동하고 해당 요소에 대한 모든 참조를 수정합니다(다른 파일에서도). 사용 가능한 작업은 다음과 같습니다.
- 클래스를 다른 패키지로 이동
- 정적 또는 인스턴스 메서드를 다른 클래스로 이동
- 내부 클래스를 새 파일로 이동
예
Office 클래스의 print() 정적 메서드를 Printer 클래스로 이동해 봅시다.
이전
public class Office {
public static void main(String[] args) {
print();
}
public static void print() {
System.out.println("This is printer");
}
static class Printer { }
}
이후
public class Office {
public static void main(String[] args) {
Printer.print();
}
static class Printer {
public static void print() {
System.out.println("This is printer");
}
}
}
자체 클래스보다 다른 클래스에서 더 많이 사용되는 정적 메서드에 대한 이동 리팩토링.
클래스를 다른 패키지로 이동합니다. 현재 파일 탐색기에서 이동 리팩토링은 지원되지 않습니다.
내부 클래스를 새 파일로 이동합니다.
이름 변경
기본 바로가기: F2
선택한 요소를 이름을 바꾸고 해당 요소에 대한 모든 참조를 수정합니다(다른 파일에서도).
예
Foo 클래스의 이름을 Bar로 바꿔 봅시다.
이전
public class Foo {
// ...
}
public void myMethod() {
Foo myClass = new Foo();
}
이후
public class Bar {
// ...
}
public void myMethod() {
Bar myClass = new Bar();
}
이름 바꾸기 리팩토링을 호출하는 바로가기는 F2입니다. 편집기에서 식별자에 바로가기를 호출하면 편집기 자체 내에 작은 상자가 표시되어 식별자 이름을 변경할 수 있습니다. Enter를 누르면 해당 식별자에 대한 모든 참조도 변경됩니다.
이름 바꾸기 리팩토링은 폴더 및 파일의 파일 탐색기에서도 지원됩니다. 변경 요청 후 영향을 받는 파일 미리 보기가 제공되며 변경 사항을 적용할지 여부를 결정할 수 있습니다.

해결된 유형을 var 유형으로 변경
로컬 변수를 선언하기 위해 var를 사용합니다.
예
이전
String s = "";
이후
var s = "";
다음도 참조하세요: var 유형을 해결된 유형으로 변경
var 유형을 해결된 유형으로 변경
해결된 유형을 사용하여 로컬 변수를 선언합니다.
예
이전
var s = "";
이후
String s = "";
다음도 참조하세요: 해결된 유형을 var 유형으로 변경
소스 작업
소스 작업은 일반적인 코드 구조와 반복 요소를 생성하는 데 사용할 수 있습니다. 일부는 코드를 즉시 수정하는 데 도움이 되는 빠른 수정입니다.
생성자 생성
클래스에 대한 생성자를 추가합니다.
위임 메서드 생성
위임 메서드 생성
메서드 재정의/구현
이 소스 작업을 사용하면 모든 후보가 체크리스트와 함께 표시됩니다. 그런 다음 재정의하거나 구현할 대상을 결정할 수 있습니다.
가져오기 정리
이 소스 작업을 사용하여 가져오기를 정리할 수 있습니다. 모호한 가져오기도 처리할 수 있으며, 이 경우 올바른 것을 선택할 수 있는 드롭다운 목록이 제공됩니다. 해결되지 않은 유형이 있는 코드 줄도 결정하는 데 도움이 되도록 표시됩니다.
getter 및 setter 생성
모든 새 멤버 변수에 대해 getter와 setter를 일괄 생성할 수 있습니다. 클래스에 필드가 여러 개 있는 경우 소스 작업은 액세서 메서드를 생성하는 데 사용할 대상 필드를 선택하기 위한 빠른 선택을 표시합니다.
hashCode() 및 equals() 생성
hashCode() 및 equals()는 기본 구현으로 생성할 수 있습니다. 모든 비정적 멤버 변수가 나열되며 체크리스트를 사용하여 생성된 코드를 사용자 지정할 수 있습니다.
생성된 코드를 사용자 지정하는 두 가지 옵션이 있습니다.
- Java 7 이상을 사용하는 경우
java.codeGeneration.hashCodeEquals.useJava7Objects를true로 설정하여Objects.hash및Objects.equals를 호출하는 더 짧은 코드를 생성할 수 있습니다. java.codeGeneration.hashCodeEquals.useInstanceof를true로 설정하여Object.getClass()를 호출하는 대신instanceOf연산자를 사용하여 객체 유형을 확인할 수도 있습니다.
toString() 생성
toString() 메서드를 생성하는 새로운 소스 작업이 있습니다. 모든 멤버 변수의 체크리스트를 사용하여 사용자 지정이 가능합니다.
가능한 경우 한정자를 final로 변경
현재 소스 파일의 모든 변수 및 매개변수에 final 한정자를 추가합니다.
예
이전
public class Clazz {
public void method(int value) {
boolean notValid = value > 5;
if (notValid) {
// do something
}
}
}
이후
public class Clazz {
public void method(final int value) {
final boolean notValid = value > 5;
if (notValid) {
// do something
}
}
}
액세스할 수 없는 참조 수정
이 빠른 수정은 액세스할 수 없는 참조를 수정하는 데 도움이 됩니다.
존재하지 않는 패키지 생성
패키지 이름이 폴더 이름과 일치하지 않는 경우 소스 코드의 패키지 이름을 변경하거나 파일 시스템에서 폴더를 이동하는 옵션이 있습니다(대상 폴더가 아직 존재하지 않는 경우에도).
지원되는 기타 코드 작업
VS Code에서 지원하는 코드 작업 목록은 계속 증가하고 있으며 위에 가장 인기 있는 것만 나열되어 있습니다. 기타 주목할 만한 지원 작업에는 다음이 포함됩니다(이에 국한되지 않음).
- 해결되지 않은 유형 생성
final한정자 제거- 불필요한 캐스트 제거
- 중복 인터페이스 제거
- switch 문에 누락된 case 레이블 추가
- break/continue에서 정의로 이동
- 정적 요소에 대한 액세스 수정