자바에서 변수의 스코프는 어떻게 결정되나요?
자바에서 변수의 스코프(scope)는 변수가 유효하고 접근 가능한 범위를 의미합니다.
변수의 스코프는 변수 선언 위치에 따라 결정되며, 이를 이해하면 코드의 가독성과 유지보수성을 높일 수 있습니다.
자바에서 변수 스코프를 결정하는 주요 기준은 다음과 같습니다.
1. 지역 변수 (Local Variable) 스코프 - 메서드, 생성자, 혹은 초기화 블록 내에서 선언된 변수입니다.
- 선언된 블록(중괄호 `{}`) 내에서만 접근할 수 있습니다.
블록을 벗어나면 변수를 사용할 수 없습니다.
- 예: ```java void example() { int x = 10; // x는 example() 메서드 내에서만 유효 if (x > 0) { int y = 20; // y는 if 블록 내부에서만 유효 System.out.println(y); // 접근 가능 } // System.out.println(y); // 오류 발생: y는 if 블록 밖에서 접근 불가 } ``` 2. 인스턴스 변수 (Instance Variable) 스코프 - 클래스 내에서 메서드 바깥에 선언된 변수로, 객체 하나하나마다 별도로 존재합니다.
- 선언된 클래스의 모든 인스턴스 메서드에서 접근 가능합니다.
- 접근 제어자(public, private 등)에 따라 외부 접근 가능 여부가 결정됩니다.
- 예: ```java public class MyClass { private int instanceVar; // 인스턴스 변수 void method() { instanceVar = 5; // 클래스 내 어디서나 접근 가능 } } ``` 3. 클래스 변수 (Static Variable) 스코프 - `static` 키워드로 선언된 변수로, 클래스 당 하나만 존재합니다.
- 동일한 클래스의 모든 인스턴스에서 공유하며, 클래스명으로도 접근 가능합니다.
- 스코프는 해당 클래스 내 전체이며, 접근 제어자에 따라 외부 접근이 제한됩니다.
- 예: ```java public class MyClass { static int staticVar; // 클래스 변수 static void staticMethod() { staticVar = 10; // 클래스 내 어디서나 접근 가능 } } ``` 4. 매개 변수 (Parameter)의 스코프 - 메서드 선언부에서 선언된 매개 변수는 해당 메서드 전체 블록 내에서만 유효합니다.
- 매개 변수 역시 지역 변수와 같이 블록 외부에서는 접근 불가합니다.
- 예: ```java void greet(String name) { System.out.println("Hello, " + name); // name은 greet() 내에서만 사용 가능 } ``` 5. 중첩 블록 (Nested Block) 스코프 - 블록 내부에 또 다른 블록이 있을 때, 내부 블록에서 외부 블록의 변수에 접근할 수 있지만 그 반대는 불가능합니다.
- 즉, 더 좁은 블록 스코프는 더 넓은 블록의 변수를 볼 수 있으나, 외부 블록은 내부 블록 변수를 볼 수 없습니다.
--- 요약 | 변수 종류 | 선언 위치 | 유효 범위 (스코프) | |----------------|---------------------------|---------------------------------------------| | 지역 변수 | 메서드/블록 내부 | 선언된 블록(중괄호) 내부만 유효 | | 매개 변수 | 메서드 선언부 | 메서드 전체 블록 내 | | 인스턴스 변수 | 클래스 내, 메서드 외 | 해당 인스턴스 내 모든 메서드 및 블록 | | 클래스 변수(Static) | 클래스 내, 메서드 외, static | 해당 클래스 전체(static 메서드 포함) | --- 자바에서 변수의 스코프를 정확히 이해하고 활용하면, 변수 충돌을 방지하고 코드의 의도와 구조를 명확하게 표현할 수 있습니다.
특히 중첩된 블록, 클래스 멤버와 지역 변수의 이름이 같을 때 어떤 변수가 참조되는지 명확히 알기 위해 스코프 개념은 매우 중요합니다.