변수의 범위
변수의 사용 범위
변수에는 지역변수라느니 전역변수라느니 하는 것들이 있습니다.
말 그대로 지역변수는 어떠한 일부분 영역에서만 적용되는 변수이고,
전역변수는 전국 방방곡곡, 어느 영역이는 사용가능한 변수입니다.
지역구와 전국구에 비교할 수 있죠.
목포의 회칼이 지역구라면 종로의 쌍칼은 전국구입니다.
회칼이 서울로 상경해서 "나 회칼이야~"라고 한들 누가 알아줄까요?
하지만 전국구인 쌍칼은 목포가서 "나 쌍칼이다"라고 하면 다들 벌벌 떨겠죠.^^
global 키워드
그런데 전국구 쌍칼이 부산에 가서 "나 쌍칼이다" 라고 했는데
거짓말 하지 말라며 되려 화를 냅니다.
왜 그런가 했더니 부산에도 쌍칼이 있었던 거죠.
부산의 쌍칼 얼굴을 아는데 자기가 쌍칼이라 그러니까 거짓말을 한다고 생각한 것입니다.
또 어느날은 대구로 가서 "나 쌍칼이다"라고 했는데, "쌍칼이 누군데?" 하며 자신을 몰라줍니다.
황당한 경험을 한 쌍칼은 전국구 연합에 전국구만의 표식을 만들자고 건의합니다.
지방 순례를 할 때엔 그 표식을 가지고 가서 자신이 전국구임을 확인 시키기 위해서요.
이때의 표식이 바로 global입니다.
<?php
$a = 1; //전국구 쌍칼
function Test()
{
echo $a; //지역구 쌍칼
}
Test();
?>
결과는 아무것도 출력되지 않습니다.
우리는 아직 함수라는 것을 배우지 않았기 때문에 소스가 다소 생소할 수 있을 것입니다.
함수를 간단히 살펴보면
function 함수이름( 파라미터 ) {
}
와 같은 형식으로 함수를 정의하며 정의된 함수는 함수이름(파라미터);
식으로 실행합니다.
그런데 함수는 자신만의 세계를 만들어 영역을 형성합니다.
그래서 부산같은 지역구가 되는 것이죠.
함수 내부의 변수들은 모두 지역구 변수들입니다.
전국구 $a 가 Test 함수 영역으로 들어오면 지역구에서는 누군지 모르니까 무시합니다.
그래서 뭘 만들었죠? 전국구만의 표식!!!
<?php
$a = 1; //전국구 쌍칼
function Test()
{
global $a; //나 전국구 쌍칼이야~
echo $a;
}
Test();
?>
결과는 1이 출력됩니다.
전국구 표식인 global을 보여주니 다들 형님~ 형님~ 그러는 군요.
static 정적변수
함수는 영역을 만드는 것 뿐만아니라 다른 특성도 있습니다.
함수를 호출할 때 영역을 만들고 함수의 처리가 완료되면 영역을 없애고 사라집니다.
마치 해결사처럼 필요할 때 등장했다가 일처리 다하고 나면 흔적도 없이 사라지는거죠.
그래서 함수 내부에 새로이 선언한 지역 변수는 모두 흔적도 없이 사라집니다.
다시 함수를 호출하면 새로이 지역 변수가 생겨서 기존에 가지고 있던 값은 모두 사라지고 맙니다.
그런데 어떤 경우에는 함수가 다시 호출될 때 지역변수의 값이 그대로 유지되어야 할 때가 있습니다.
이럴 때 사용하는 것이 static 키워드입니다.
<?php
function Test()
{
echo $a;
$a = "제발 출력해줘~";
}
?>
이 함수는 몇 번을 호출하더라도 아무것도 출력되지 않습니다.
분명히 $a에다가 문자열을 저장했는데도 다음번, 그다음번에도 묵묵부답일 뿐입니다.
그 이유는 위에서 말씀드렸듯이 함수가 소멸함과 동시에 내부의 지역변수는
모두 사라져 버리기 때문에 $a는 이전값을 모두 잃어 버리고 맙니다.
```php
<?php
function Test()
{
static $a = 0;
echo $a;
$a = $a + 1;
}
?>
static을 써서 사용하면 처음 호출하면 0 두 번째는 1 세 번째는 2 ...
이렇게 $a 변수는 소멸하지 않고 계속 그 값을 유지하게 됩니다.
그러나 이 변수가 전역으로 사용될 수는 없습니다.
이 정적변수는 단지 그 지역에서만 유효한 값입니다.