묻고답하기
page_full_width" class="col-xs-12" |cond="$__Context->page_full_width">
static선언자에 대한 질문여.
2003.01.23 23:15
<1번소스>
1행 <?
2행 function sum(){
3행 $a=10;
4행 static $a=20;
5행 $a++;
6행 echo $a."<br>";
7행 }
8행 sum();
9행 sum();
10행 sum();
11행 ?>
<1번소스 결과>
21
22
23
1번 소스의 경우에는 3행에 $a값이 할당된 후에 다시 4행에서 static선언자를 사용하여 $a에
20이라는 값을 재할당하였어요, static이라는 선언자는 처음에 한 번만 변수에 할당된 값을
사용하고, 그 이후 부터는 메모리에 저장되어 있는 변수 값을 사용하는 것이라는 답변을 받았거든요...
그래서 8행에서 sum()함수를 호출했을 때 $a의 값은 21이 나오는구나...
그리고 9행에서 sum()함수를 다시 호출했을 때 3행의 $a=10이라는 값을 재할당 받지 않고,
메모리에 저장되어 있는 21이라는 값을 사용하여 $a의 값이 22가 나오는 구나...
마찬가지로 10행에서 sum()함수를 또 다시 호출하였을 때도 마찬가지 경우로 23이 나오는
구나...이렇게 생각들더라구요...
그래서 static이 while구문에서 사용됐을 때도 마찬가지의 결론이 나올까? 하고 다음과 같이
코딩을 했어요..
<2번소스>
1행 <?
2행 $b=20;
3행 while($b<=23){
4행 $b=10;
5행 static $b=20;
6행 $b++;
7행 echo $b."<br>";
8행 }
9행 ?>
<2번소스 결과>
21
11
11
11
.
.
.
(11값만이 무한루프됨)
이번에는 1번소스와는 달리 이런결과가 나오네요..ㅡㅡ;;
1번 소스에서 처럼 4행에 $b에 10이 할당한 후에 다시 5행에서 static 선언자를 사용하여
$b 에 20이 재할당되었으므로 1번째 실행에서는 21이라는 값이 출력된 것이고...
그 다음에 static의 특성에 의해 4행에서 $b에 10이 할당되더라도 이 값을 사용하지 않고,
메모리에 저장되어 있는 21이라는 값을 사용하여 2번째 실행되었을 때 22이라는 값이 출
력되고 3번째 실행되었을 때는 23이라는 값이 출력되어야 하는 것이 아닌가요??
아~ 많은 분들께서 좋은 답변으로 도와주시는데도, 이렇게 이해를 못하는 제가 이제는
부끄럽습니다. ...ㅡㅡ;
그래도 답변 해주시면 더할나위 없이 감사하구요...(__);;
1행 <?
2행 function sum(){
3행 $a=10;
4행 static $a=20;
5행 $a++;
6행 echo $a."<br>";
7행 }
8행 sum();
9행 sum();
10행 sum();
11행 ?>
<1번소스 결과>
21
22
23
1번 소스의 경우에는 3행에 $a값이 할당된 후에 다시 4행에서 static선언자를 사용하여 $a에
20이라는 값을 재할당하였어요, static이라는 선언자는 처음에 한 번만 변수에 할당된 값을
사용하고, 그 이후 부터는 메모리에 저장되어 있는 변수 값을 사용하는 것이라는 답변을 받았거든요...
그래서 8행에서 sum()함수를 호출했을 때 $a의 값은 21이 나오는구나...
그리고 9행에서 sum()함수를 다시 호출했을 때 3행의 $a=10이라는 값을 재할당 받지 않고,
메모리에 저장되어 있는 21이라는 값을 사용하여 $a의 값이 22가 나오는 구나...
마찬가지로 10행에서 sum()함수를 또 다시 호출하였을 때도 마찬가지 경우로 23이 나오는
구나...이렇게 생각들더라구요...
그래서 static이 while구문에서 사용됐을 때도 마찬가지의 결론이 나올까? 하고 다음과 같이
코딩을 했어요..
<2번소스>
1행 <?
2행 $b=20;
3행 while($b<=23){
4행 $b=10;
5행 static $b=20;
6행 $b++;
7행 echo $b."<br>";
8행 }
9행 ?>
<2번소스 결과>
21
11
11
11
.
.
.
(11값만이 무한루프됨)
이번에는 1번소스와는 달리 이런결과가 나오네요..ㅡㅡ;;
1번 소스에서 처럼 4행에 $b에 10이 할당한 후에 다시 5행에서 static 선언자를 사용하여
$b 에 20이 재할당되었으므로 1번째 실행에서는 21이라는 값이 출력된 것이고...
그 다음에 static의 특성에 의해 4행에서 $b에 10이 할당되더라도 이 값을 사용하지 않고,
메모리에 저장되어 있는 21이라는 값을 사용하여 2번째 실행되었을 때 22이라는 값이 출
력되고 3번째 실행되었을 때는 23이라는 값이 출력되어야 하는 것이 아닌가요??
아~ 많은 분들께서 좋은 답변으로 도와주시는데도, 이렇게 이해를 못하는 제가 이제는
부끄럽습니다. ...ㅡㅡ;
그래도 답변 해주시면 더할나위 없이 감사하구요...(__);;
댓글 2
-
행복한고니
2003.01.23 23:25
-
이호한
2003.01.24 00:23
우선 static variable은 local function내에서만 유효합니다.
즉, 원칙적으로 2번째 소스의 형태로는 사용되어서는 안됩니다.
그리고 하나 더 알아두셔야할게 static을 이용한 선언에서 초기화는 처음 한번만 적용됩니다.
이제 두번째 소스를 따라가보면...
첫번째 loop에서
- 4행에서 $b에는 10 이 대입되었습니다.
- 5행에서 $b를 static으로 선언하고 값을 20으로 변경합니다.
- 7행에서 출력은 21... 맞죠?
두번째 loop에서
- 4행에서j $b에 10이 대입되었습니다. 여기서도 $b는 static이고 값을 대입했으므로 값이 변경됩니다.
- static선언은 초기 실행시에만 초기화되므로 5행의 초기화 선언은 무시됩니다. 즉, 값은 10으로 들어간 상태 그대로입니다. (20으로 변경되지 않습니다.)
- 7행에서 출력은 11...
잘못 알고계신게 두번째 이후의 실행에서 4행에서 할당한 값이 사용안된다고 생각하시는거네요.
변수선언이 static이던 아니던 대입연산자에 의해 값은 대입이 됩니다.
함수로 보지 마시고 제어문으로 보셔야 합니다.
함수와 같은 룰을 적용하는 것은 에러 혹은 오류의 원인이 됩니다. ^^;;