변수를 선언한 시점부터 변수를 계속 사용할 수 있게 해도 되지 않을까? 왜 복잡하게 접근 범위(스코프)라는 개념을 만들었을까?
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
를 사용했다.
그런데 이 코드는 좋은 코드라고 보기는 어렵다. 왜냐하면 임시 변수 temp
는 if
조건이 만족할 때 임시로 잠깐 사용하는 변수이다. 그런데 임시 변수 temp
는 main()
코드 블록에 선언되어 있다. 이렇게 되면 다음과 같은 문제가 발생한다.
temp
는 if
코드 블록에서만 필요하지만, main()
코드 블록이 종료될 때까지 메모리에 유지된다. 따라서 불필요한 메모리가 낭비된다.if
코드 블록 안에 temp
를 선언했다면 자바를 구현하는 곳에서 if
코드 블록의 종료 시점에 이 변수를 메모리에서 제거해서 더 효율적으로 메모리를 사용할 수 있다.temp
는 if
코드 블록에서만 필요하고, 여기서만 사용하면 된다. 만약 if
코드 블록 안에 temp
를 선언했다면 if
가 끝나고 나면 temp
를 전혀 생각하지 않아도 된다. 머리속에서 생각할 변수를 하나 줄일 수 있다.if
코드 블록이 끝나도 main()
어디서나 temp
를 여전히 접근할 수 있다. 누군가 이 코드를 유지보수 할 때 m
은 물론이고 temp
까지 계속 신경써야 한다. 스코프가 불필요하게 넓은 것이다.temp
의 스코프를 꼭 필요한 곳으로 한정해보자.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);
}
}
temp
를 if
코드 블록 안에서 선언했다. 이제 temp
는 if
코드 블록 안으로 스코프가 줄어든다. 덕분에 temp
메모리를 빨리 제거해서 메모리를 효율적으로 사용하고, temp
변수를 생각해야 하는 범위를 줄여서 더 유지보수 하기 좋은 코드를 만들었다.
이제 스코프 관점에서 while
문과 for
문을 비교해보자.
다음 코드들은 기존에 반복문에서 학습했던 코드들이다.
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++;
}
}
}
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