기능별로 역할을 분리하여 함수(메서드)로 나누는 것이 가독성과 유지보수성을 높이는 중요한 방법이다. 각 함수가 하나의 역할만 수행하도록 분리하면 코드가 훨씬 더 이해하기 쉬워진다.
먼저 각 단계별 작업을 함수로 분리해, 주요 처리를 processItems 메서드에서 수행하고, 초기화와 결과 반환을 별도의 메서드로 분리한다.
import java.util.ArrayList;
import java.util.List;
public class Example {
public static void main(String[] args) {
Example example = new Example();
List<String> items = List.of("item1", "item2", "item3");
List<String> results = example.processItems(items);
System.out.println("Processed Items: " + results);
}
public List<String> processItems(List<String> items) {
// 초기화 단계 (함수 분리)
List<String> data = initializeData();
// 주요 로직 처리 단계
for (String item : items) {
if (validate(item)) {
data.add(process(item));
}
}
// 최종 결과 반환
return finalizeData(data);
}
private List<String> initializeData() {
return new ArrayList<>();
}
private boolean validate(String item) {
return item != null && !item.isEmpty();
}
private String process(String item) {
return "Processed " + item;
}
private List<String> finalizeData(List<String> data) {
// 여기에서 데이터가 가공된 후 반환할 수도 있다.
return data;
}
}
유효성 검사와 데이터 처리도 각각 독립된 함수로 분리하여, processItems 메서드에서 한 번에 이해할 수 있도록 한다.
public List<String> processItems(List<String> items) {
List<String> results = new ArrayList<>();
for (String item : items) {
// 유효성 검사
if (isValid(item)) {
// 데이터 처리
results.add(processItem(item));
}
}
return results;
}
private boolean isValid(String item) {
return item != null && !item.isEmpty();
}
private String processItem(String item) {
return "Processed " + item;
}
중첩된 반복문이나 조건문이 복잡해질 경우, 이를 함수로 분리하여 코드의 깊이를 줄인다. 예를 들어, 중첩된 루프에서 내부 루프를 별도의 함수로 만들어 가독성을 높일 수 있다.
public void nestedLoops() {
for (int i = 0; i < 5; i++) {
processInnerLoop(i);
}
}
private void processInnerLoop(int i) {
for (int j = 0; j < 5; j++) {
System.out.println("i: " + i + ", j: " + j);
}
}
각 구간에 의미 있는 이름을 부여하여 함수로 분리하면 주석이 없어도 역할이 명확하게 드러난다.
public void collectAndProcessData(List<String> source) {
List<String> data = collectData(source);
processData(data);
}
private List<String> collectData(List<String> source) {
List<String> data = new ArrayList<>();
for (String item : source) {
data.add(item);
}
return data;
}
private void processData(List<String> data) {
for (String item : data) {
System.out.println("Processing: " + item);
}
}
함수 분리를 통해 불필요한 공백을 줄이고 코드를 간결하게 유지할 수 있다.
public void calculateAndPrintTotal() {
int total = calculateTotal();
printTotal(total);
}
private int calculateTotal() {
int value = 0;
for (int i = 0; i < 10; i++) {
value += i;
}
return value;
}
private void printTotal(int total) {
System.out.println("Total: " + total);
}
팀의 컨벤션에 맞춰 함수 정의와 본문에 일관성을 유지하고, 필요할 때마다 함수를 독립적으로 분리하여 코드 가독성을 높인다.
public int add(int a, int b) {
return a + b;
}
public void printSum() {
int result = add(3, 5);
System.out.println("Sum: " + result);
}