개요
스코프는 변수·함수·별칭·PSDrive가 어디에서 보이고 바뀔 수 있는지를 결정하는 경계다. 41장에서 “변수는 자신이 만들어진 블록 안에서만 보인다"고 짧게 언급했던 원칙을, 이 장에서 전역·지역·스크립트라는 이름 붙은 스코프와 스코프 수정자(scope modifier)로 정식으로 정리한다. 53장의 스크립트 스코프, 57장의 함수 스코프가 실제로는 모두 이 규칙 위에서 동작한다.
정신 모델은 “스코프는 부모-자식 관계로 중첩된 상자이고, 자식 상자는 부모 상자 안의 물건을 읽을 수 있지만, 자식이 뭔가를 새로 만들거나 바꾸면 그 변화는 기본적으로 자식 상자 안에만 남는다"는 것이다.
사용법
| |
종류
| 스코프 이름 | 의미 |
|---|---|
| Global | PowerShell 시작 시 만들어지는 최상위 스코프, 프로필(06장)의 변수·함수도 여기 생성됨 |
| Local | “현재” 스코프 — 상황에 따라 전역이거나 그 안의 자식일 수 있음 |
| Script | 스크립트 파일이 실행되는 동안 그 파일 전용으로 만들어지는 스코프 |
| Private(옵션) | 스코프가 아니라 옵션 — 자식 스코프에서도 안 보이게 숨김 |
| 번호 스코프 | -Scope 0(현재)부터 -Scope 1(부모), -Scope 2(조부모)처럼 상대 위치로 참조 |
예시
| |
주의사항·함정
함수·스크립트 안에서의 대입은 기본적으로 “새 지역 변수 생성"이지 “부모 변수 수정"이 아니다: 부모 스코프에 같은 이름의 변수가 있어도, 자식 스코프에서 $x = 값을 실행하면 참조가 아니라 그 스코프에 새 변수를 만드는 것이다. 부모의 원본 값을 실제로 바꾸고 싶다면 $Global:x = 값이나 $Script:x = 값처럼 스코프를 명시해야 한다 — 이 규칙을 놓치면 “함수 안에서 분명히 값을 바꿨는데 밖에서는 그대로다"라는 흔한 혼란에 빠진다.
모듈은 스크립트나 함수와 달리 전역 스코프의 자식이 아니다: 74장에서 다룰 모듈은 임포트된 지점의 스코프에 연결된 독립된 병렬 스코프 컨테이너를 만든다. 모듈 안의 $a와 세션의 전역 $a는 완전히 다른 변수이며, 모듈 함수 안에서 $Global:a로 명시해야만 세션의 전역 변수에 접근한다 — 지금 당장은 “모듈은 스코프 규칙이 조금 다르다"는 점만 기억해 두고, 74장에서 자세히 다룬다.
Private 옵션은 스코프가 아니라 가시성 제한이라 혼동하기 쉽다: Private: 수정자로 만든 변수는 그것을 만든 스코프 안에서는 정상적으로 보이지만, 그 스코프의 자식 스코프에서는 Global:을 붙여도 보이지 않는다. “전역 스코프에 있으니 어디서든 보이겠지"라고 생각하면 이 예외적인 동작에 놀라기 쉽다.
이식성: Bash는 기본적으로 모든 변수가 전역이고, 함수 안에서만 지역으로 만들려면 명시적으로 local 키워드를 써야 한다 — PowerShell과 정반대 기본값이다. CMD는 setlocal/endlocal로 배치 파일 전체의 변수 변경을 되돌릴 수는 있지만, PowerShell처럼 함수 단위의 세밀한 스코프 계층 구조는 없다.
![Featured image of post [PowerShell] 62. 스코프(Scope) — 전역/지역/스크립트](/post/powershell/scope-global-local-script-powershell/wordcloud_hu_b921fe391529c776.webp)
![[PowerShell] 60. 매개변수 스플래팅(Splatting)](/post/powershell/splatting-parameter-powershell/wordcloud_hu_af62c7747984032.webp)
![[PowerShell] 61. 파이프라인 입력 매개변수(ValueFromPipeline 등)](/post/powershell/pipeline-input-parameter-powershell/wordcloud_hu_e21e024d6a200983.webp)
![[PowerShell] 62. 스코프(Scope) — 전역/지역/스크립트](/post/powershell/scope-global-local-script-powershell/wordcloud_hu_59e4df2abadaaec.webp)
![[PowerShell] 63. 스크립트 블록과 클로저](/post/powershell/script-block-closure-powershell/wordcloud_hu_dee8c4c3bb9b3775.webp)
![[PowerShell] 64. #Requires 지시문과 스크립트 메타데이터](/post/powershell/requires-directive-metadata-powershell/wordcloud_hu_9e51949b0b697e4.webp)
![[PowerShell] 41. 변수와 데이터 타입](/post/powershell/variables-data-types-powershell/wordcloud_hu_6051f7a36d4700ee.webp)
![[PowerShell] 53. 스크립트 작성과 실행(.ps1)](/post/powershell/script-execution-ps1-powershell/wordcloud_hu_10c8d6c3936ccc0f.webp)
![[PowerShell] 42. 배열과 컬렉션 기초](/post/powershell/arrays-collections-powershell/wordcloud_hu_c295cc73d4592ae5.webp)
![[PowerShell] 43. ArrayList와 Generic List(List<T>)](/post/powershell/arraylist-generic-list-powershell/wordcloud_hu_a34550a6370cee87.webp)
![[PowerShell] 44. 해시테이블(Hashtable) 다루기](/post/powershell/hash-tables-powershell/wordcloud_hu_d1fd29269ce3c32d.webp)