기본적인 개념이지만 리마인드 느낌으로 정리해본다.
자바에서 Scope(스코프)는 변수나 메소드, 클래스가 어디서부터 어디까지 접근 가능한지를 정의하는 범위를 의미한다.
스코프는 코드의 가독성을 높이고, 변수의 중복 선언을 방지하며, 메모리 관리를 효율적으로 수행할 수 있게 해준다.
자바에서는 크게 클래스 스코프, 메소드 스코프, 블록 스코프의 세 가지로 나눌 수 있다.
1. 클래스 스코프 (Class Scope)
클래스 스코프는 클래스 전체에서 접근할 수 있는 변수나 메소드의 범위를 의미한다.
클래스 변수(Static 변수)와 인스턴스 변수(Non-static 변수)가 클래스 스코프에 속한다.
클래스 스코프에 속한 변수들은 클래스 내의 모든 메소드에서 접근할 수 있다.
public class Car {
// 클래스 스코프
private String model; // 인스턴스 변수
private static int numberOfCars = 0; // 클래스 변수
public Car(String model) {
this.model = model;
numberOfCars++; // 클래스 변수에 접근 가능
}
public String getModel() {
return model; // 인스턴스 변수에 접근 가능
}
public static int getNumberOfCars() {
return numberOfCars; // 클래스 변수에 접근 가능
}
}
위 예시에서 model은 인스턴스 변수로, 각 Car 객체마다 별도로 존재하며, 클래스 내 모든 메소드에서 접근할 수 있다.
numberOfCars는 클래스 변수로, 모든 Car 객체가 공유하는 변수다.
2. 메소드 스코프 (Method Scope)
메소드 스코프는 메소드 내에서 선언된 변수들이 가지는 범위를 의미한다.
이 변수들은 메소드가 종료될 때 소멸된다. 즉, 메소드 내부에서만 접근 가능하며, 메소드가 호출될 때마다 새롭게 생성된다.
public class Calculator {
public int add(int a, int b) {
// 메소드 스코프
int sum = a + b;
return sum;
}
public void multiply(int a, int b) {
// 메소드 스코프
int product = a * b;
System.out.println(product);
}
}
위 예시에서 sum과 product는 각각 add와 multiply 메소드 내에서 선언된 로컬 변수로, 이 변수들은 해당 메소드 내에서만 접근 가능하고 메소드가 끝나면 사라진다.
즉, 결과를 print 및 return 후 다시 메소드를 호출하기 전까지 소멸된다.
3. 블록 스코프 (Block Scope)
블록 스코프는 중괄호 {}로 묶인 코드 블록 내에서 선언된 변수들이 가지는 범위를 의미한다.
이 변수들은 해당 블록 내에서만 유효하며, 블록을 벗어나면 소멸된다.
public class ScopeExample {
public void checkScope() {
// 메소드 스코프
int x = 10;
if (x > 5) {
// 블록 스코프
int y = x + 5;
System.out.println("y: " + y);
}
// y는 이 블록 바깥에서는 접근 불가
// System.out.println(y); // 오류 발생
}
}
위 예시에서 y 변수는 if 블록 내부에서 선언되었기 때문에, 해당 블록 내에서만 접근할 수 있다. if 블록을 벗어난 곳에서 y를 사용하려 하면 컴파일 오류가 발생한다.
결론
변수는 꼭 필요한 범위로 한정해서 사용하는 것이 좋다. 변수의 스코프는 꼭 필요한 곳으로 한정해 사용하여 가독성이 좋고 유지보수가 용이한 코드로 만들자.
좋은 프로그램은 무한한 자유가 있는 프로그램이 아니라 적절한 제약이 있는 프로그램이다.
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/011.gif)
'Dev > Spring&Java' 카테고리의 다른 글
[Java] Base64 인코딩/디코딩: JDK 1.7과 JDK 1.8에서의 차이점 (0) | 2024.10.04 |
---|---|
[Java] JSON 데이터 전송 및 응답 처리 (0) | 2024.10.03 |
The type className is already defined 에러 해결 방법 (0) | 2024.06.25 |
The selected JRE does not support the current compiler compliance level of 1.8 (0) | 2024.04.09 |
[Java] 이클립스 JDK 버전 설정/변경하기 (0) | 2024.04.09 |