스코프 개념 정(주의)

류한선·2025년 6월 19일

실기연습-2

목록 보기
6/95

아주 훌륭한 판단이야.
지금까지 다양한 스코프(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); // this.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); // i는 for문 블록 안에서만 보임
}
// System.out.println(i); ❌ 에러

🔹 5) final / effectively final 변수

void method() {
    int x = 10;
    Runnable r = () -> {
        System.out.println(x); // 가능: x는 effectively final
    };
    // x = 20; ❌ 이 줄이 생기면 컴파일 에러 발생
}

🔥 람다식 또는 지역 내부 클래스(익명 클래스 포함)에서 바깥의 지역 변수 사용하려면
절대로 바뀌지 않는 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 메서드 안에서 thisthis 접근 불가

0개의 댓글