스코프와 변수 가시성
hong-ik에서 변수의 유효 범위(스코프)를 이해하면 코드를 더 명확하게 작성할 수 있습니다.
전역 스코프
파일의 최상위에서 선언된 변수는 전역 변수입니다. 파일 전체에서 접근할 수 있습니다:
hik
정수 전역변수 = 100
함수 출력하기():
출력(전역변수) // 접근 가능
출력하기() // 100지역 스코프
함수 내부에서 선언된 변수는 해당 함수 안에서만 유효합니다:
hik
함수 계산():
정수 지역변수 = 42
출력(지역변수) // 42
계산()
// 여기서 지역변수를 접근하면 오류 발생블록 스코프
만약, 반복 등의 블록 내부에서 선언된 변수는 해당 블록 안에서만 유효합니다:
hik
정수 x = 10
만약 x > 5 라면:
정수 블록변수 = 20
출력(블록변수) // 20
// 블록 바깥에서는 블록변수에 접근할 수 없음반복문도 동일합니다:
hik
반복 정수 i = 0 부터 3 까지:
정수 임시 = i * 10
출력(임시)
// 여기서 i나 임시에 접근할 수 없음함수 스코프
함수의 매개변수는 함수 내부에서만 유효합니다:
hik
함수 더하기(정수 a, 정수 b) -> 정수:
정수 결과 = a + b
리턴 결과
정수 답 = 더하기(3, 7)
출력(답) // 10
// a, b, 결과는 더하기 함수 바깥에서 접근 불가중첩 함수에서의 스코프:
hik
함수 외부():
정수 x = 10
함수 내부():
출력(x) // 외부 함수의 변수 접근 가능
내부()
외부() // 10클로저
함수가 자신이 선언된 환경의 변수를 기억합니다:
hik
함수 카운터생성() -> 함수:
정수 횟수 = 0
함수 증가() -> 정수:
횟수 += 1
리턴 횟수
리턴 증가
함수 세기 = 카운터생성()
출력(세기()) // 1
출력(세기()) // 2
출력(세기()) // 3클로저는 생성 시점의 환경을 캡처하므로, 횟수 변수가 함수 호출 사이에도 유지됩니다.
변수 섀도잉
내부 스코프에서 외부와 같은 이름의 변수를 선언하면 외부 변수가 가려집니다:
hik
정수 x = 10
함수 테스트():
정수 x = 20 // 전역 x를 가리는 새로운 x
출력(x) // 20
테스트()
출력(x) // 10 (전역 x는 영향받지 않음)블록 내부에서도 동일하게 작동합니다:
hik
정수 값 = 100
만약 true 라면:
정수 값 = 200 // 외부 '값'을 가림
출력(값) // 200
출력(값) // 100주의
변수 섀도잉은 코드를 혼란스럽게 만들 수 있습니다. 가능하면 서로 다른 이름을 사용하는 것이 좋습니다.
스코프 규칙 요약
| 스코프 | 선언 위치 | 접근 가능 범위 |
|---|---|---|
| 전역 | 파일 최상위 | 파일 전체 |
| 함수 | 함수 내부 | 해당 함수 내부 |
| 블록 | if/while/for 블록 내부 | 해당 블록 내부 |
| 클로저 | 외부 함수의 변수 | 내부 함수에서 접근 가능 |
모범 사례
- 변수는 가능한 좁은 스코프에서 선언하세요 - 필요한 곳에서만 접근 가능하도록
- 전역 변수 사용을 최소화하세요 - 전역 상태는 디버깅을 어렵게 합니다
- 섀도잉을 피하세요 - 같은 이름의 변수를 중첩 스코프에서 재선언하지 마세요
- 함수를 작게 유지하세요 - 스코프가 명확해집니다