📌 지역 변수와 스코프
스코프(scope)는 프로그램상에서 변수들의 사용가능한 범위를 의미한다. 그 범위를 변수의 스코프라고 한다.
- 변수는 선언한 위치에 따라 지역 변수, 멤버 변수(클래스 변수, 인스턴스 변수)와 같이 분류된다. 우리가 지금까지 학습한 변수들은 모두 영어로
로컬 변수(Local Variable) 한글로 지역변수 라한다.
지역 변수는 이름 그대로 특정 지역에서만 사용할 수 있는 변수라는 뜻이다. 그 특정 지역을 벗어나면 사용할 수 없다. 여기서 말하는 지역이 바로 변수가 선언된 코드 블록{}이다. 지역 변수는 자신이 선언된 코드 블록{}안에서만 생존하고, 자신이 선언된 코드 블록을 벗어나면 제거된다. 따라서 이후에는 접근할 수 없다.
public static void main(String[] args) {
int m = 10;
if(true) {
int x = 20;
System.out.println(x);
}
System.out.println(m);
System.out.println(x);
}
int m은 main{}의 코드블록안에서 선언되었고, if{}블록 내부에서도 생존이 가능하다. 쉽게 애기하자면 생존범위만 맞다면 다 접근 가능하다.
int x는 if{}블록안에서 선언되었다. 따라서 변수를 선언한 시점부터 if{}문이 끝날때 까지 생존한다.
if{}문이 끝나고 x를 사용할려고 하면 cannot find symbol이라는 컴파일 오류가 발생하는데 if{}문에서만 생존 가능한 변수x를 사용할려고 하였기에 변수이름을 찾을수 없다는 오류가 발생한다.
📌 스코프의 존재 이유
- 변수를 선언한 시점부터 변수를 계속 사용하면 될텐데 왜 스코프가 필요한지 예제를 통해서 확인 하겠습니다.
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);
}
- 비효율적인 메모리 사용:
temp는 if 코드 블록에서만 필요하지만, main() 코드 블록이 종료될 때 까지 메모리에 유지된다. 따라서 불필요한 메모리가 낭비된다. if 코드 블록 안에 temp를 선언했다면 자바를 구현하는 곳에서 if코드 블록의 종료 시점에 이 변수를 메모리에서 제거해서 더 효율적으로 메모리를 사용할 수 있다.
- 코드의 복잡성 증가:
temp는 if 코드 블록에서만 필요하고, 여기서만 사용하면 된다. 만약 if코드 블록안에 temp를 선언하면 if가 끝나고 temp를 생각하지 않아도 된다. 그런데 지금 작성한 코드는 if 코드 블록이 끝나도 main() 어디서나 temp를 여전히 접근한다. 누군가 이 코드를 유지보수 할 때 m은 몰론, temp까지 신경써야 하기에 범위가 넓어서 코드가 복잡해진다.
⭐ 정리
- 변수는 꼭 필요한 범위로 한정해서 사용하는 것이 좋다. 변수의 스코프(범위)는 꼭 필요한 곳으로 한정해서 사용하자. 메모리를 효율적으로 사용하고 유지보수하기 좋은 코드를 만들 수 있다.
- 좋은 프로그램은 무한한 자유가 있는 프로그램이 아닌 적절한 제약이 있는 프로그램이다.