[Java] 스코프 2 - 스코프 존재 이유

코드 속의 "진돌"·2023년 12월 30일
0
post-thumbnail

✅ 스코프 존재 이유


변수를 선언한 시점부터 변수를 계속 사용할 수 있게 해도 되지 않을까? 왜 복잡하게 접근 범위(스코프)라는 개념을 만들었을까?

✏️ Scope3_1

package scope;

public class Scope3_1 {

  public static void main(String[] args) {
    int m = 10;
    int temp = 0;

    if (m > 0) {
      temp = m * 2;
      System.out.println("temp = " + temp);
    }
    System.out.println("m = " + m);
  }
}

조건이 맞으면 변수 m의 값을 2배 증가해서 출력하는 코드이다. 여기서 2배 증가한 값을 저장해두기 위해 임시 변수 temp를 사용했다.

그런데 이 코드는 좋은 코드라고 보기는 어렵다. 왜냐하면 임시 변수 tempif 조건이 만족할 때 임시로 잠깐 사용하는 변수이다. 그런데 임시 변수 tempmain() 코드 블록에 선언되어 있다. 이렇게 되면 다음과 같은 문제가 발생한다.

  • 비효율적인 메모리 사용 : tempif 코드 블록에서만 필요하지만, main() 코드 블록이 종료될 때까지 메모리에 유지된다. 따라서 불필요한 메모리가 낭비된다.
    만약 if 코드 블록 안에 temp를 선언했다면 자바를 구현하는 곳에서 if 코드 블록의 종료 시점에 이 변수를 메모리에서 제거해서 더 효율적으로 메모리를 사용할 수 있다.
  • 코드 복잡성 증가 : 좋은 코드는 군더더기 없는 단순한 코드이다. tempif 코드 블록에서만 필요하고, 여기서만 사용하면 된다. 만약 if 코드 블록 안에 temp를 선언했다면 if가 끝나고 나면 temp를 전혀 생각하지 않아도 된다. 머리속에서 생각할 변수를 하나 줄일 수 있다.
    그런데 지금 작성한 코드는 if 코드 블록이 끝나도 main() 어디서나 temp를 여전히 접근할 수 있다. 누군가 이 코드를 유지보수 할 때 m은 물론이고 temp까지 계속 신경써야 한다. 스코프가 불필요하게 넓은 것이다.
    지금은 코드가 매우 단순해서 이해하는데 어려움이 없겠지만 실무에서는 코드가 매우 복잡한 경우가 많다. temp의 스코프를 꼭 필요한 곳으로 한정해보자.

✏️ Scope3_2

package scope;

public class Scope3_2 {

  public static void main(String[] args) {
    int m = 10;

    if (m > 0) {
      int temp = m * 2;
      System.out.println("temp = " + temp);
    }
    System.out.println("m = " + m);
  }
}

tempif 코드 블록 안에서 선언했다. 이제 tempif 코드 블록 안으로 스코프가 줄어든다. 덕분에 temp 메모리를 빨리 제거해서 메모리를 효율적으로 사용하고, temp 변수를 생각해야 하는 범위를 줄여서 더 유지보수 하기 좋은 코드를 만들었다.

✅ while문 🆚 for문 - 스코프 관점


이제 스코프 관점에서 while문과 for문을 비교해보자.
다음 코드들은 기존에 반복문에서 학습했던 코드들이다.

✏️ While

package loop;

public class While2_3 {

  public static void main(String[] args) {
    int sum = 0;
    int i = 1;
    int endNum = 3;

    while (i <= endNum) {
      sum = sum + i;
      System.out.println("i = "  + i + " sum = " + sum);
      i++;
    }
  }
}

✏️ For

package loop;

public class For2 {

  public static void main(String[] args) {
    int sum = 0;
    int endNum = 3;

    // sum = 1 + 2 + 3
    for (int i = 1; i <= endNum; i++) {
      sum = sum + i;
      System.out.println("i = " + i + " sum = " + sum);
    }
  }
}

변수의 스코프 관점에서 카운터 변수 i를 비교해보자.

  • while문의 경우 변수 i의 스코프가 main() 메서드 전체가 된다. 반면에 for문의 경우 변수 i의 스코프가 for문 안으로 한정된다.
  • 따라서 변수 i와 같이 for문 안에서만 사용되는 카운터 변수가 있다면 while문 보다는 for문을 사용해서 스코프의 범위를 제한하는 것이 메모리 사용과 유지보수 관점에서 더 좋다.

정리


  • 변수는 꼭 필요한 범위로 한정해서 사용하는 것이 좋다. 변수의 스코프는 꼭 필요한 곳으로 한정해서 사용하자. 메모리를 효율적으로 사용하고 더 유지보수하기 좋은 코드를 만들 수 있다.
  • 좋은 프로그램은 무한한 자유가 있는 프로그램이 아니라 적절한 제약이 있는 프로그램이다.

💡 단축키


Navigate → Go to Class : command + O
Recent Files : command + E

profile
매일 성장하는 주니어 개발자의 기록📝

0개의 댓글