✅ 스코프(Scope)란?
Scope(범위)는 프로그래밍에서 변수, 함수 및 식별자의 유효 범위를 말합니다. 스코프는 해당 식별자가 어디에서 접근 가능한지를 결정하며, 변수 이름 충돌을 방지하고 코드의 가독성과 유지 보수성을 향상시킵니다.
➡️일반적으로 사용되는 스코프 유형은 다음과 같습니다.
- 전역 스코프(Global Scope)
프로그램 전체에서 접근 가능한 범위를 말합니다. 전역 스코프에 선언된 변수와 함수는 어떤 위치에서든 사용할 수 있습니다. 전역 변수는 프로그램이 시작될 때 생성되며, 프로그램이 종료될 때까지 유지됩니다.
(자바는 전역변수를 지원하지 않습니다)
- 지역 스코프(Local Scope)
특정 블록 내에서 변수나 함수의 유효 범위를 제한합니다. 일반적으로 중괄호({})로 둘러싸인 코드 블록(예: 함수 내부, 제어문 블록)이 지역 스코프를 형성합니다. 지역 스코프에 선언된 변수와 함수는 해당 블록 내에서만 접근 가능하며, 블록을 벗어나면 소멸됩니다. 다른 지역 스코프에서 동일한 이름의 변수를 사용할 수 있습니다.
- 매개변수 범위(Parameter Scope)
함수나 메서드의 매개변수가 유효한 범위를 말합니다. 매개변수는 해당 함수 내에서 사용할 수 있으며, 함수 호출 시 전달된 인수 값에 의해 초기화됩니다. 매개변수는 지역 변수의 한 형태로 간주될 수 있습니다.
- 블록 스코프(Block Scope)
중괄호로 둘러싸인 코드 블록 내에서 변수의 유효 범위를 제한합니다. 일반적으로 조건문(if), 반복문(for, while), try-catch 문 등의 블록에서 변수를 선언할 때 블록 스코프가 형성됩니다. 블록 스코프 내에서 선언된 변수는 해당 블록 내에서만 접근 가능하며, 블록을 벗어나면 소멸됩니다. 블록 스코프를 사용하여 변수의 생명 주기를 제어하고, 변수 이름 충돌을 방지할 수 있습니다.
스코프는 프로그래밍 언어에 따라 다를 수 있으며, 해당 언어의 규칙과 범위 지정자를 따라 변수와 식별자의 유효 범위가 결정됩니다. 스코프를 올바르게 이해하고 활용하면 변수 이름 충돌을 방지하고 코드를 더 구조적으로 관리할 수 있습니다.
✅ Java에서의 Scope
Java에서 Scope는 변수, 메서드 및 클래스의 유효 범위를 나타내는 개념입니다. Scope는 해당 식별자(변수, 메서드 또는 클래스 이름)가 접근 가능한 코드 영역을 결정합니다. 즉, 어디에서 해당 식별자를 사용할 수 있는지를 정의합니다.
➡️Java에는 다음과 같은 네 가지 주요 Scope 유형이 있습니다.
- 클래스 스코프(Class Scope)
클래스 스코프(Class Scope)는 클래스 내에 선언된 멤버(변수 또는 메서드)의 유효 범위를 말합니다. 이들은 클래스 레벨에서 선언되며, 해당 클래스의 인스턴스가 생성될 때 함께 생성됩니다.
클래스 스코프 내에 선언된 변수를 필드(field) 또는 멤버 변수라고 부르며, 이들 변수는 해당 클래스 내의 모든 메소드에서 접근할 수 있습니다. 클래스 스코프는 접근 제어자
private
,public
,protected
,default
에 따라 이들 변수와 메소드가 어디에서 접근 가능한지가 결정됩니다.public class Car { // 클래스 스코프 내에서 선언된 멤버 변수 private String brand; private int year; // 클래스 스코프 내에서 선언된 멤버 메서드 public void setBrand(String brand) { this.brand = brand; } public void setYear(int year) { this.year = year; } public void printDetails() { System.out.println("Brand: " + brand); System.out.println("Year: " + year); } } public class MainClass { // 메인 메서드 public static void main(String[] args) { // Car 인스턴스 생성 Car myCar = new Car(); // 인스턴스 메서드 호출 myCar.setBrand("Toyota"); myCar.setYear(2022); // 인스턴스 메서드 호출 myCar.printDetails(); } }
위의 코드에서
Car
클래스는 클래스 스코프를 가지고 있습니다.brand
와year
은 클래스 스코프 내에서 선언된 멤버 변수로,setBrand()
와setYear()
은 클래스 스코프 내에서 선언된 멤버 메서드입니다. 멤버 변수는 private을 사용하여 클래스 내에서만 접근이 가능하고, 멤버 메소드는 public으로 선언되어 어디서든 접근할 수 있습니다.setBrand()
와setYear()
는 인스턴스 메소드로, 해당 클래스의 인스턴스를 생성한 후에 호출할 수 있습니다. 클래스 스코프 내에서 선언된 멤버 변수인brand
와year
에 접근하여 값을 설정하기 위해 setter 메소드를 사용합니다.getter와 setter 메소드를 사용하면, 클래스 외부에서 클래스 필드에 안전하게 접근할 수 있게 해주는 동시에 필드에 대한 유효성 검사 등의 추가적인 로직을 적용할 수 있는 장점이 있습니다.
printDetails()
메서드도 인스턴스 메서드로, 클래스 스코프 내에서 선언되었습니다. 이 메서드는 클래스 스코프 내의 멤버 변수인brand
와year
에 접근하여 값을 출력합니다.main()
메서드에서는Car
클래스의 인스턴스인myCar
를 생성한 후, 인스턴스 메서드인setBrand()
과setYear()
을 호출하여brand
와year
값을 설정합니다. 마지막으로printDetails()
를 호출하여 설정된 값을 출력합니다.위의 코드를 실행하면 다음과 같은 결과가 출력될 것입니다
Brand: Toyota Year: 2022
👉 클래스 스코프 내에서 멤버 변수와 멤버 메서드에 접근하고 값을 설정하는 방법을 확인할 수 있습니다. 클래스의 인스턴스를 생성하여 클래스 스코프 내의 멤버에 접근하고 조작할 수 있습니다. 클래스 스코프 내의 멤버에 접근할 수 있는 범위는 접근 제어자에 의해 결정됩니다.
- 메서드 스코프(Method Scope)
메서드 스코프(Method Scope)는 메서드 내에서 선언된 변수의 유효 범위를 말합니다. 메서드 스코프 내에서 선언된 변수는 해당 메서드 내에서만 접근할 수 있으며, 메서드가 실행되는 동안에만 유효합니다. 메서드가 실행되면 메서드 스코프의 변수가 생성되며, 메서드가 종료되면 변수가 소멸됩니다.
메소드 스코프에 선언된 변수는 메소드 내의 모든 코드 블록에서 액세스할 수 있지만, 메소드를 벗어나면 그 변수를 참조하거나 사용할 수 없습니다. 또한, 같은 메소드 내에서 같은 이름의 변수를 두 번 선언할 수 없습니다.
메소드 스코프를 사용하면 변수의 수명을 제한하고, 변수의 가시성을 제어할 수 있습니다. 이렇게 하면 코드가 더욱 명확하고 이해하기 쉬워지며, 실수를 줄일 수 있습니다.
public class Example { // 클래스 스코프 내에서 선언된 변수 private String classScope; public void myMethod() { // 메서드 스코프 내에서 선언된 변수 int myVariable = 10; System.out.println("My Variable: " + myVariable); // 메서드 스코프 내에서 선언된 블록 if (myVariable > 5) { String message = "Variable is greater than 5"; System.out.println(message); } // System.out.println(message); // 에러: message 변수는 블록 스코프 내에서만 유효합니다. } public static void main(String[] args) { Example example = new Example(); example.myMethod(); } }
위의 코드에서
myMethod()
는 메서드 스코프를 가지고 있습니다. 메서드 스코프 내에서myVariable
이라는 변수가 선언되었습니다.myVariable
은 메서드 스코프 내에서만 접근할 수 있으며, 해당 메서드가 실행되는 동안에만 유효합니다.myVariable
의 값을 출력하기 위해System.out.println("My Variable: " + myVariable)
을 사용할 수 있습니다.또한, 메서드 스코프 내에서 조건문을 사용하여 블록을 생성할 수 있습니다. 위의 코드에서는
if
문을 사용하여myVariable
의 값이 5보다 큰 경우에만 실행되는 블록을 생성했습니다. 이 블록 내에서message
라는 변수를 선언하고 값을 할당한 후, 출력할 수 있습니다.하지만 주석 처리된
System.out.println(message)
부분은 에러가 발생합니다. 이는message
변수가 블록 스코프 내에서만 유효하기 때문입니다. 블록 스코프 밖에서는message
변수에 접근할 수 없습니다.반면에 classScope 변수는 클래스 스코프를 가지는 필드이며, 모든 메소드에서 접근이 가능합니다.
따라서 위의 코드를 실행하면 다음과 같은 결과가 출력될 것입니다.
My Variable: 10 Variable is greater than 5
👉 메서드 스코프 내에서 선언된 변수는 해당 메서드 내에서만 접근 가능하며, 메서드가 실행되는 동안에만 유효하다는 것을 알 수 있습니다.
- 블록 스코프(Block Scope = Local Scope)
블록 스코프는 중괄호(
{}
)로 둘러싸인 코드 블록 내에서 선언된 변수의 유효 범위를 말합니다. 일반적으로if
,for
,while
등의 제어문 블록 또는 메서드나 클래스 내의 중괄호 블록에서 변수를 선언할 때 블록 스코프가 형성됩니다. 블록 스코프의 변수는 해당 블록 내에서만 접근할 수 있습니다.public class Example { public static void main(String[] args) { int number = 10; if (number > 5) { // if 문 내에서 선언된 변수는 블록 스코프를 가집니다. String message = "Number is greater than 5"; System.out.println(message); } else { // else 문 내에서 선언된 변수도 블록 스코프를 가집니다. String message = "Number is less than or equal to 5"; System.out.println(message); } // 블록 스코프 밖에서는 message 변수에 접근할 수 없습니다. // System.out.println(message); // 에러: message 변수에 접근할 수 없음 } }
위의 코드에서
number
변수에 10이 할당되었습니다. 그리고 if 문을 사용하여number
가 5보다 큰지 확인합니다. if 문 내부에는 중괄호로 둘러싸인 블록이 생성됩니다. 이 블록 내에서는 조건식이 참일 때 실행되는 코드가 작성됩니다.블록 스코프 내에서
message
라는 변수가 if 문과 else 문 각각에서 선언되고 초기값이 할당됩니다. 각 블록 내에서만message
변수에 접근할 수 있습니다.주석 처리된 System.out.println(
message
) 부분은 에러가 발생합니다. 이는message
변수가 블록 스코프 내에서만 유효하기 때문입니다.따라서 위의 코드를 실행하면 다음과 같은 결과가 출력될 것입니다.
Number is greater than 5
👉 블록 스코프 내에서 선언된 변수는 해당 블록 내에서만 접근 가능하며, 블록이 실행되는 동안에만 유효하다는 것을 알 수 있습니다. 블록 스코프는 if 문 뿐만 아니라 다른 제어문이나 중괄호로 생성된 블록에서도 사용될 수 있습니다.
Uploaded by N2T