1. 스코프
- 변수는 선언한 위치에 따라 지역변수, 멤버변수(클래스변수, 인스턴스변수)와 같이 분류됨.
- 지금까지 학습한 변수들은 지역변수(Local Variable)를 사용함.
- 지역변수는 이름 그대로 특정 지역에서만 사용할 수 있는 변수로, 그 특정 지역 벗어나면 사용할 수 없음.
package scope;
public class Scope1 {
public static void main(String[] args) {
int m = 10; // m 생존 시작
if(true) {
int x = 20; // x 생존 시작
System.out.println("if m = " + m);
System.out.println("if x = " + x);
} // x 생존 종료
// System.out.println("main x = " + x); // x는 if 내에서만 사용할 수 있으므로 접근 불가능.
System.out.println("main m = " + m);
} // m 생존 종료
}
[Scope1]
int m
- int m은 main{ }의 코드 블록 안에서 선언. 따라서 변수를 선언한 시점부터 main{ }의 코드 블록이 종료될 때까지 생존.
- if{ } 블록 내부에서도 외부 블록에서 선언된 m에 접근 가능.
int x
- int x는 if{ } 블록안에서 선언. 따라서 변수를 선언한 시점부터 if{ }의 코드 블록이 종료될 때까지 생존.
- if{ } 내부에서는 자신의 범위에서 선언한 x에 당연히 접근 가능.
- if{ } 코드 블록이 끝나버리면 x는 제거. 따라서 더는 x에 접근 불가능.
이후 접근하면 cannot find symbol이라는 변수 이름 찾을 수 없다는 컴파일 오류 발생.
지역 변수는 본인의 코드 블록 안에서만 생존. 그리고 자신의 코드 블록 안에서는 얼마든지 접근 가능.하지만 자신의 코드 블록을 벗어나면 제거되기 때문에 접근 불가능.
이렇게 변수의 접근 가능한 범위를 스코프(scope)라고 하고, scope는 번역하면 범위라는 뜻.
package scope;
public class Scope2 {
public static void main(String[] args) {
int m = 10;
for (int i = 0; i < 2; i++) { // 블록 내부, for문 내
System.out.println("for m = " + m); // 블록 내부에서 외부는 접근 가능
System.out.println("for i = " + i);
} // i 생존 종료
// System.out.println("main i = " + i); // 오류. i에 접근 불가
System.out.println("main m = " + m);
}
}
[Scope2]
if{ } 대신에 for { }를 사용한 코드.
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);
}
}
[Scope3_1]
조건이 맞으면 변수 m의 값을 2배 증가해서 출력하는 코드.
여기서 2배 증가한 값을 저장해 두기 위해 임시 변수 temp를 사용.
하지만 이 코드는 좋은 코드라고 보기 어려움.
1. 비효율적인 메모리 사용.
- temp는 if 코드 블록에서만 필요하지만, main() 코드 블록이 종료될 때까지 메모리에 유지되므로 불필요한 메모리가 낭비됨.
2. 코드 복잡성 증가.
- 좋은 코드는 군더더기 없는 단순한 코드임. temp는 if 코드 블록에서만 필요하고, 여기서만 사용하면 됨.
- if 함수가 끝나도 변수 temp를 계속 신경써야 함. scope가 불필요하게 넓은 것.
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("temp = " + temp); // 오류.
System.out.println("m = " + m);
}
}
[Scope3_2]
temp를 if 코드 블록 안에서 선언함.
이제 temp는 if 코드 블록 안으로 스코프가 줄어듦.
덕분에 temp 메모리를 빨리 제거해서 메모리를 효율적으로 사용할 수 있고, temp 변수를 생각해야 하는 범위를 줄여서 더 유지보수 하기 좋은 코드가 됨.
2. 정리
- 변수는 꼭 필요한 범위로 한정해서 사용하는 것이 좋음. 변수의 스코프는 꼭 필요한 곳으로 한정해서 사용하자.
- 메모리를 효율적으로 사용하고 더 유지보수하기 좋은 코드를 만들 수 있음.
- 좋은 프로그램은 무한한 자유가 있는 프로그램이 아닌, 적절한 제약이 있는 프로그램임.
'Studying > JAVA' 카테고리의 다른 글
[JAVA]_Scanner(스캐너) (1) | 2024.12.05 |
---|---|
[JAVA]_Casting(형변환) (0) | 2024.12.03 |
[JAVA]_Loop Statement(반복문) (0) | 2024.12.03 |
[JAVA]_Conditional Statement(조건문) (2) | 2024.11.29 |
[JAVA]_Operator(연산자) (1) | 2024.11.26 |