아주 훌륭한 판단이야.
지금까지 다양한 스코프(scope) 관련 문제를 풀어봤는데, 그 개념이 정리되지 않으면 왜 에러가 나고, 어떤 조건에서 변수에 접근이 되는지 계속 헷갈릴 수밖에 없어.
이제 완전히 제대로 잡고 가자!
✅ 자바(Java)의 스코프(scope) 개념 완전 정리
📌 1. 스코프(Scope)란?
변수가 선언되고, 유효하게 접근할 수 있는 코드의 범위
즉, **이 변수가 어디에서 "보이고 쓸 수 있느냐?"**를 말함.
✅ 2. 자바의 대표적인 스코프 종류
| 스코프 종류 | 설명 | 예제 위치 |
|---|
| 클래스 스코프 | 클래스 전체에서 보임 | static 변수, 인스턴스 변수 |
| 인스턴스 스코프 | 객체가 만들어져야 접근 가능 | 멤버 변수, non-static |
| 메서드(지역) 스코프 | 메서드 내에서만 보임 | int x = 5; 등 |
| 블록 스코프 | {} 중괄호 내부에서만 보임 | for문, if문 안 |
| 람다식/익명클래스 스코프 | 자신만의 제한된 접근 허용 | Runnable r = () -> {...} |
✅ 3. 변수의 종류와 스코프
🔹 1) 클래스 변수 (static 변수)
public class A {
static int staticVar = 10;
}
- 모든 인스턴스가 공유함
- 어디서든
A.staticVar로 접근 가능
🔹 2) 인스턴스 변수 (non-static 변수)
public class A {
int instanceVar = 20;
public void method() {
System.out.println(instanceVar);
}
}
- 객체를 생성해야 접근 가능
new A().instanceVar처럼 접근
🔹 3) 지역 변수 (Local Variable)
void method() {
int local = 5;
System.out.println(local);
}
- 선언된 메서드나 블록 안에서만 존재
- 벗어나면 사라짐
🔹 4) 블록 변수
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
🔹 5) final / effectively final 변수
void method() {
int x = 10;
Runnable r = () -> {
System.out.println(x);
};
}
🔥 람다식 또는 지역 내부 클래스(익명 클래스 포함)에서 바깥의 지역 변수 사용하려면
절대로 바뀌지 않는 final 또는 effectively final이어야 함!
✅ 4. this 스코프 정리
| 문맥 | this가 가리키는 대상 |
|---|
| 일반 메서드 | 현재 객체 (ThisTrap) |
| 람다 내부 | 바깥 객체 (람다가 만들어진 클래스) |
| 익명 클래스 | 익명 클래스 자신 |
✅ 5. 헷갈리는 스코프 상황 요약
| 상황 | 사용 가능 여부 | 이유 |
|---|
| 람다에서 지역 변수 접근 | ✅ 가능 (final 또는 effectively final일 경우) | |
| 익명 클래스에서 지역 변수 접근 | ✅ 가능 (final 또는 effectively final일 경우) | |
| 람다 내부에서 지역 변수 재선언 | ❌ 불가능 (같은 스코프) | |
| 익명 클래스에서 지역 변수 재선언 | ✅ 가능 (다른 스코프) | |
| static 메서드 안에서 this 사용 | ❌ 에러 (객체가 없으므로) | |
🧠 핵심 요약 마인드맵 (글자만)
스코프
├── 클래스 스코프 (static)
│ └── 전역처럼 공유됨
├── 인스턴스 스코프 (non-static)
│ └── 객체 필요
├── 메서드 스코프 (지역 변수)
│ ├── 메서드 안에서만 보임
│ └── 람다/익명 클래스 접근 제한 있음
├── 블록 스코프 (for/if 내부)
│ └── 중괄호 내부 한정
└── 특수
├── final / effectively final
│ └── 람다/익명 클래스 접근 허용 조건
├── this
│ ├── 람다: 바깥 클래스
│ └── 익명 클래스: 자기 자신
💬 마무리 요약
| 기억할 포인트 | 내용 |
|---|
| 람다/익명 클래스에서 지역 변수 접근 | → 반드시 final or effectively final |
| 람다에서 변수 재선언 불가 | → 같은 스코프이기 때문 |
| 익명 클래스에서는 변수 재선언 가능 | → 독립된 스코프를 가지기 때문 |
| this의 의미가 다름 | → 람다는 바깥 객체, 익명 클래스는 자기 자신 |
📘 추천: 이 개념을 확인할 수 있는 대표 문제들
| 문제 유형 | 확인 개념 |
|---|
| 람다 내부에서 지역 변수 접근 | effectively final |
| 익명 클래스에서 this는 누구? | this 스코프 |
| Runnable/Thread 섞은 람다 문제 | 변수 캡처 |
| static 메서드 안에서 this | this 접근 불가 |