🍐 개요
스코프 (Scope)란 프로그래밍에서 변수, 함수, 객체가 정의되고 접근 가능한 코드의 영역이나 범위를 말한다. 스코프는 다양한 부분에서 이름 충돌을 방지하고, 변수의 생명 주기를 관리하는데 중요한 역할을 한다. 이는 메모리의 구조와 밀접한 관련이 있으므로, 관련 블로그 글도 한 번 읽어보길 추천한다.
Stack/Heap/Static 메모리 구조
🍒 스코프의 유형
스코프의 유형으로는 크게 세 부분으로 분류된다.
- 전역 스코프 (Global Scope)
변수나 함수가 프로그램 전체에서 접근 가능한 범위이다. 즉, 일반적으로 클래스 레벨의 변수를 의미한다. 이러한 변수들은 해당 클래스 내의 모든 메소드, 블록, 생성자 등에 접근이 가능하다. 접근 제어자에 따라 다르긴하지만 (public), 일반적으로는 클래스의 외부, 즉 다른 클래스에서는 직접 접근 할 수 없다.
- 지역 스코프 (Local Scope)
이는 메소드차원의 스코프라고 생각하면 좋은 데, 호출 될 때마다 해당 메소드를 위한 새로운 스택 프레임이 스택 메모리에 생성이 된다. 시각적으로는 호출된 메소드의 블록이 그 제한 범위이다. 이 범위 안에서 사용 가능한 지역 변수, 매개 변수가 스택 메모리에 생성이 된다. 해당 메소드의 작업이 끝나면 이 메소드 스택프레임은 스택에서 pop되어 제거가 되며, 지역변수도 더이상 참조 할 수 없게 된다.
- 블록 스코프 (Block Scope)
블록 스코프라는 용어는 메소드 내에서 생성된 모든 종류의 중괄호
{ }
로 둘러싸인 블록 내에서만 존재하고 접근 가능한 변수의 영향 범위를 말한다. 해당 예시로는 조건문 if, switch
반복문 for, while
안에서 선언된 변수들의 영향 범위를 말한다.🥥 코드 비교 예시
아래 코드 예시는 전역 스코프, 지역 스코프, 블록 스코프를 한번에 비교해 보기 위한 코드이다.
- 사진 내부에 보이는
globalVar
는 클래스 자체 속성값으로 객체가 생성이 되면, 클래스 전역에서 사용가능한 ‘전역 스코프’ 를 가진 변수가 된다. 이렇게 인스턴스화가 되어야 스코프를 가지는 변수를 인스턴스 변수라고 하는데, 이는 속성 값이 기초 자료 타입형이라 할지라도 힙 메모리에 저장이 되게 된다. - 이러한 변수를 호출하기 위해서는
[참조변수.해당속성]의 형태
로 호출이 가능하며 제시된 예시로 설명을 하자면,example.globalVar
로 해당 값을 사용할 수 있다. - 이와 다르게
[클래스명.속성]
의 형태로 호출하는 코드를 볼 수 있을텐데, 이런 형태는 인스턴스 변수가 아니라static
으로 선언된 전역 변수인 경우다.
- 메소드 안에서 사용되는
localVar
변수는 지역변수로testLocalScope( )
메소드가 호출이 될 때 활성화 되는 변수이다. 해당 메소드는 호출이 될때 자신의 메소드 스택프레임을 가지고 스택메모리에 저장이 되며, 해당 변수도 해당 메소드 스택 프레임 안에서 스택 메모리에 저장이 된다. 이 변수는 메소드의 작업이 끝나고 pop이 될때 같이 사라지게 된다.
if
문 안에서 사용되는blockVar
변수는 if문의 블록 안에서만 사용 가능한 지역 변수 이다. 사실 메소드 역시 블록 스코프라고 칭할 수 있겠으나, 해당 단어를 사용할 때는 메소드 내부에서의 더 작은 범위의 중괄호 { } 범위를 지칭하는 개념이라고 보면 된다. 그러므로blockVar
는 if문 내부에서만 사용이 되고 중괄호가 닫히게 되면 더 이상 참조할 수 없다.
- 아래는 블록을 벗어난 지역스코프를 가진 지역변수
localVar
가 참조되지 못하는 모습과 전역스코프를 가진 클래스의 속성값globalVa
r가 클래스 내부에서 어디서든 어떻게 접근이 가능한지 보여주는 예시이다.
Share article