57. 지역변수의 범위를 최소화하라

지역 변수는 선언된 지점부터 사용되는 곳까지의 범위를 최소로 줄여야 코드의 가독성과 유지보수성이 좋아진다.

📌 1. 발표 전 알아야 할 개념

지역 변수(Local Variable)

  • 메서드, 생성자, 또는 블록 내부에 선언된 변수

  • 해당 블록이 실행되는 동안에만 메모리에 존재하고 사용할 수 있는 변수

public void greet() {
    String message = "Hello, world!"; // 지역 변수
    System.out.println(message);
}

📕 2. 지역 변수의 범위를 최소화하자

2-1. 왜 최소화 해야 할까?

  • 변수의 용도와 사용 범위가 명확해지면서, 가독성 향상

  • 변수의 상태를 추적하기가 쉬워 버그 예방

  • 변수 이름 재사용 가능

  • 코드 리팩토링 용이

2-2. 어떻게 최소화할까?

🔗 테스트 코드 : https://github.com/s0ooo0k/STUDY-CODE/tree/main/src/item42

☝🏼 1. 변수를 사용하는 가장 가까운 지점에 선언하자

  • 변수를 너무 앞에 선언하면, 변수가 어디서 쓰이는지 추적이 어렵다

  • 조건문, 반복문 안에서만 쓰이는 변수라면 블록 안에서 선언하는 것이 명확하다

  • 변수의 범위(scope, 스코프)를 최소화할 수 있고, 불필요한 사용을 방지한다.

public void cook(Food food){
    // 1. 사용하는 가장 가까운 지점에서 선언하자

    // String name = food.getName(); // 선언이 너무 빠름
    if(food.isFinished()){
        String name = food.getName();
        System.out.println("조리 완료 : " + name);
    }
}

☝🏼 2. 선언과 동시에 초기화하라

  • 변수 선언 시 초기화하는 습관을 들이자

  • 만약, 초기화에 필요한 정보가 충분하지 않다면, 충분해질 때까지 선언을 미뤄야 한다.

  • try-catch는 예외


```java
public void cook(Food food){
    if(food.isFinished()){
        String name = food.getName();
        // 2. 선언과 동시에 초기화하자.
        int price = food.getPrice();
        System.out.println("조리 완료 : " + name);
    }
}

☝🏼 3. 루프 변수는 루프 내부에 선언하자

  • 반복문 안에서만 사용하는 변수는 반복문 안에서만 선언하자

  • 반복문 내부에 선언할 경우 해당 반복문 내에서만 유효, 코드 안정성이 높아진다다

  • 바깥에서 선언할 경우 스코프가 넓어지고 추후 재사용에서 오류가 발생할 가능성이 높다

  • while문 보다는 for문을 활용하자


```java
public void cook(Food food){
    for(String ingredient : food.getIngredients()){
        System.out.println(ingredient); // loop 안에서만 ingredient 존재
    }
}

☝🏼 4. try-finally에서 변수 범위에 주의하자

  • 변수를 초기화하는 표현식이 예외를 던질 가능성이 있다면, 변수 초기화는 try 블록 안에서 초기화

  • 변수의 스코프를 좁히는 것이 좋지만, 예외적으로 리소스(I/O Stream 등)를 다룰 땐 범위를 넓게 선언해야 한다

  • BufferWriter, InputStream 등은 fianlly 블록에서 반드시 close() 해야 하기 때문에, try 바깥에서 미리 선언하는 것이 정석이다. 그렇지 않으면 fianlly에서 닫을 수 없거나 컴파일 오류 발생.

// finally에서 사용해야 하므로 try 바깥에 선언언
BufferedWriter writer = null;
try {
    // writer 초기화는 try 안에서서
    writer = new BufferedWriter(new FileWriter("output.txt"));
    writer.write("Hello, Food!");
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (writer != null) {
        try {
            // close 필수수
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

💨 향후 확장 포인트

멀티 스레드 환경에서의 변수 범위

  • 멀티 스레드 환경에서는 변수 범위가 넓어지면 여러 스레드에서 해당 변수에 동시에 접근할 가능성이 높아진다

  • 멀티스레드 환경에서는 공유 상태를 줄이고, 지역 변수 스코프를 최소화하는 것이 중요하다

  • 스레드 안정성 측면에서 스코프 최소화는 필수


🤖 최종 결론

지역 변수는 꼭 필요한 지점에 선언하고, 선언 동시에 초기화하라 반복문, 조건문, try-finally 등 컨텍스트에 맞게 스코프를 설계하라.


😶‍🌫️ 느낀점

  • 변수 선언이나 초기화는 의식하지 않고 습관적으로 해왔던 경험이 많은 거 같은데, 앞으로 스코프를 신경쓰면서 작성해야겠다.

Last updated