쌩로그

Java - Scope 본문

Language/JAVA

Java - Scope

.쌩수. 2023. 12. 11. 16:16
반응형

목록

  1. 포스팅 개요
  2. 본론
  3. 요약

1. 포스팅 개요

해당 포스팅은 영한님의 자바 강의 입문 중 스코프의 존재 이유에 대한 강의를 듣고, 그동안 내가 코딩했던 부분의 문제점을 생각해보고 정리해보는 포스팅이다.

2. 본론

Scope는 말 그대로 범위이다.

코드를 작성할 때 Scope를 사용하면서 범위 안에 선언한 변수는 지역 변수로 그 범위 내에서만 사용가능한 건 당연히 알고 있었다.

다음과 같은 코드가 있다고 생각해보자.
(참고로 모든 코드는 main 메서드 안에 있다고 가정한다.)

int x = 0;

int temp = 0;

if(x == 0) {
  temp = 1;
  sout(temp) // System.out.println()을 줄인 것
}
sout(x)

(그냥 아무 의미 없는 코드이다.)
x가 0이면 temp에 1을 할당하고, 출력하는 코드다.

코드를 보면 temp는 if문 내에서만 사용되고있다.
심지어 출력도 if문 내에서 출력하고 있는데,
굳이 if문 스코프 외부에 선언해야 할 일일까...?

Scope내에 선언한 지역변수는 그 Scope 내에서만 사용가능하다.
그리고 변수 temp는 Scope외부에 있는데, 왠지 if문 밖에서도 변수 temp를 계속 신경써야할 것 같은 찝찝하고 불편한 느낌이 든다.

위의 코드를 다음처럼 바꿔보자.

int x = 0;

if(x == 0) {
  int temp = 1;
  sout(temp) // System.out.println()을 줄인 것
} // temp 끝
sout(x)

temp는 if문 내에서 선언하고, 값을 할당하고, 출력하고 끝났다.
그리고 if문을 빠져나가면, 더 이상 temp를 생각하지 않아도 된다.

그리고 똑같은 결과를 출력하는 for문과 while문을 살펴보자.

// for문
for(int i=0; i<5; i++) {
  sout(i);
}


// while 문

int i = 0;
while(i < 5) {
  sout(i);
  i++;
}

for문에서는 i가 for문 내에서 선언되고 사용되어 for문을 벗어나면, i에 대해 신경쓰지 않아도 된다.
반면에 while문은 whlie문 Scope 외부에서 i를 선언하고, while 문 내에서 i의 값을 증가시켜줘야한다. 그리고 while문을 벗어났을 때 i를 신경써줘야 한다.

이로 볼때 for문이 while문보다 조금 더 효율적이다.

이처럼
스코프 내부에서만 사용해도 충분한 변수를 외부에서도 생존하게 하면 불필요한 메모리 낭비가 발생한다.
또한, 스코프 외부에서 생존되는 변수는 프로그램 코드가 끝날 때까지 신경써줘야 한다.

이전에 나는 이러한 생각을 못했다.

그래서 알고리즘 문제를 풀 때 반복문이나 조건문 내에서 하나의 변수를 쓸 때, 선언은 스코프 외부에서 해놓고, 돌려쓰는 건 스코프 내부에서 쓰도록 했다.

당시 내 생각은 이러했다. 다음 코드를 보자.

String str = "abcdefg";

String temp;

for(int i=0; i<str.length(); i++) {
  temp = str.charAt(i);
  sout(temp);
}

대충 위와 같은 코드가 있을 때,
"temp는 String을 계속 할당해줄 것인데, for문 내에 선언을 계속 해주면 불필요한 메모리가 낭비되겠지..?" 라고 생각하여, 외부에서 한번만 선언하게 해놓고, for문 내에서 돌려가며 사용했다.

그런데, 이 Scope의 개념을 생각이 많이 바꼈다.
"아~ 내가 temp를 계속 신경써야하구나..."
"Scope를 벗어나면 어차피 못 사용할테니 GC가 알아서 처리하겠구나...?!"

라는 생각으로 바뀌었다. 따라서 위의 코드를 다음과 같이 수정하면 된다.

String str = "abcdefg";

for(int i=0; i<str.length(); i++) {
  String temp = str.charAt(i);
  sout(temp);
}

흠.. 조금 더 코드가 깔끔해진 거 같다.

앞으로 문제 풀때나 코딩할 때 Scope를 적극 활용해야겠다.

3. 요약

Scope 내에서 사용할 수 있는 범위는 되도록 Scope 내에서 선언해서 사용하고,
외부에서 생존하게 하여 불필요한 메모리를 낭비하거나, 코드가 끝날 때까지 신경쓰는 일을 하지않도록 하자

728x90
Comments