로컬 변수
Local variable컴퓨터 과학에서 로컬 변수는 로컬 범위가 주어지는 변수입니다.선언된 함수 또는 블록의 로컬 변수 참조는 더 큰 범위에서 동일한 변수 이름을 재정의합니다.가시성 수준이 두 개뿐인 프로그래밍 언어에서는 로컬 변수가 전역 변수와 대조됩니다.한편, 많은 ALGOL에서 파생된 언어에서는 네스트된 블록 또는 네스트된 함수에 의해 숨겨진 개인 변수, 함수, 상수 및 유형이 포함된 임의의 수준의 가시성을 허용합니다.로컬 변수는 절차적 프로그래밍의 기본이며, 보다 일반적으로 모듈러형 프로그래밍: 로컬 범위의 변수는 글로벌 변수와 함께 발생할 수 있는 부작용 문제를 피하기 위해 사용됩니다.
범위
로컬 변수에는 어휘적 또는 동적 범위가 있을 수 있지만 어휘적(정적) 범위 지정이 훨씬 일반적입니다.어휘 범위(또는 어휘 범위, 정적 범위 또는 정적 범위라고도 함)에서 변수 이름의 범위가 특정 블록인 경우, 해당 블록의 범위는 블록 정의의 프로그램 텍스트가 됩니다. 즉, 해당 블록의 텍스트 내에 변수 이름이 존재하고 변수 값에 바인딩되지만 해당 블록의 텍스트 외부에 변수 이름이 없습니다.반면 동적 범위 지정(또는 동적 범위)에서는 변수 이름의 범위가 특정 블록일 경우 해당 블록과 해당 블록에 의해 (다른 선언에 의해 다시 재정의되는 경우를 제외하고) 해당 블록이 해당 블록과 모든 함수가 순차적으로 호출됩니다. 블록이 종료된 후에는 변수 이름이 존재하지 않습니다.Perl이나 Common Lisp와 같은 일부 언어에서는 프로그래머가 변수를 정의하거나 재정의할 때 정적 또는 동적 범위를 선택할 수 있습니다.동적 범위 지정을 사용하는 언어로는 Logo, Emacs lisp, 셸 언어 bash, 대시, MirBSD Korn 쉘(mksh)의 "로컬" 선언 등이 있습니다.대부분의 다른 언어에서는 어휘 범위 로컬 변수를 제공합니다.
대부분의 언어에서 로컬 변수는 콜스택에 직접 저장되는 자동 변수입니다.즉, 재귀 함수가 자신을 호출할 때 함수의 각 인스턴스의 로컬 변수에는 고유한 주소가 지정됩니다.따라서 이 범위의 변수는 선언된 블록 밖의 함수에 대한 부작용 위험 없이 선언, 쓰기 및 읽을 수 있다.
Call by value semantics를 사용하는 프로그래밍 언어에서는 콜된 서브루틴에 전달된 인수의 자체 로컬 복사를 제공합니다.대부분의 언어에서 이러한 로컬 파라미터는 서브루틴 내의 다른 로컬 변수와 동일하게 취급됩니다.반대로 참조에 의한 콜과 이름의 콜에 의한 시멘틱스에서는 파라미터가 인수로 전달되는 값의 에일리어스로서 동작할 수 있기 때문에 서브루틴은 자신의 범위 밖에 있는 변수를 변경할 수 있습니다.
정적 로컬 변수
정적 로컬이라고 하는 특수한 유형의 로컬 변수는 많은 메인스트림 언어(C/C++, Visual Basic, VB 등)에서 사용할 수 있습니다.NET)를 사용하면 함수의 콜 간에 값을 유지할 수 있습니다.이것은 로컬 스코프를 가진 스태틱 변수입니다.이 경우 함수에 대한 재귀 콜은 (단일, 스태틱하게 할당된) 변수에도 액세스 할 수 있습니다.위의 모든 언어에서 정적 변수는 특별한 스토리지 클래스 키워드(예:static
).
글로벌 함수의 스태틱로컬은 스태틱글로벌 변수와 같은 라이프 타임을 가집니다.[1]이는 프로그램의 라이프 타임이 메모리에 남아 있지만 자동 로컬 변수와 마찬가지로 함수 범위(글로벌 스코프가 아님)가 있기 때문입니다.
이는 다양한 언어로 여러 가지 다른 의미를 갖는 키워드의 다른 사용법과는 다릅니다.
Perl 로컬 변수
Perl은 동적 및 어휘 범위 로컬 변수를 모두 지원합니다.키워드local
로컬 다이내믹 스코프 변수를 정의하기 위해 사용됩니다.my
는 로컬 어휘 범위 변수에 사용됩니다.현재는 다이내믹 스코핑이 거의 보급되어 있지 않기 때문에 Perl 문서에서는 다음과 같이 경고하고 있습니다.local
대부분의 사람들이 생각하는 '로컬'[2]이 아닙니다.대신,local
키워드를 지정하면 글로벌(표준) 변수에 일시적으로 다이내믹 스코프의 값이 지정됩니다.이 값은 둘러싸인 블록의 마지막까지 지속됩니다.그러나 변수는 [3]블록 내에서 호출된 함수에서 볼 수 있습니다.어휘 범위 로컬 변수를 작성하려면my
를 [4]누릅니다.
동작의 구조를 이해하려면 , 다음의 코드를 고려해 주세요.
$a = 1; 후보선수 f() { 현지의 $a; $a = 2; g(); } 후보선수 g() { 인쇄물 "$a\n"; } g(); f(); g();
다음과 같이 출력됩니다.
1 2 1
이 문제는 글로벌 변수 $a가 inside를 의미하는 새로운 임시(로컬)로 변경되었기 때문에 발생합니다.f()
단, 글로벌 값은 의 범위를 벗어나면 복원됩니다.f()
.
사용.my
이 경우 대신local
1을 3회 인쇄했을 것입니다.$a
변수는 함수의 정적 범위로 제한됩니다.f()
눈에 띄지 않는다g()
.
랜달 L.Schwartz와 Tom Phoenix는 운영자가local
같은 다른 이름을 가지고 있어야 한다save
를 클릭합니다.[5]
루비의 로컬 변수
언어로서의 루비도 Perl에서 영감을 받았지만, 이 경우 표기법은 더 단순해졌다: 글로벌 변수 이름 앞에 $ 기호가 있어야 한다.$variable_name
로컬 변수의 이름 앞에는 $ 기호가 없습니다.variable_name
(perl에서는 모든 스칼라 값의 선두에 $가 붙어 있습니다).Ruby는 Perl과 같은 정적 범위의 로컬 변수에만 내장된 지원을 제공합니다.my
, Perl과 같은 다이내믹 스코프의 로컬 변수가 아닌local
동적 범위 변수를 제공하는 Ruby용 라이브러리가 하나 이상 있습니다.[6]
「 」를 참조해 주세요.
레퍼런스
- ^ "Current C standard" (PDF).(3.61 MB) (2009년 기준[update])특히 32페이지의 섹션 6.2.4 "물체의 저장 기간"을 참조하십시오.
- ^ perldoc.perl.org: 로컬
- ^ perldoc.perl.org: perlsub:경유하는 임시값
local()
- ^ perldoc.perl.org: perlsub: private 변수 via
my()
- ^ Randal L. Schwartz and Tom Phoenix (2001-07-01). Learning Perl 3rd edition. O'REILLY. paragraph 4.7. ISBN 0-596-00132-0.
- ^ 콘래드 어윈입니다"LSpace: 루비의 다이내믹 스코프"2012년 12월 http://cirw.in/blog/lspace 2013-10-16을 취득했습니다.