묻고답하기
page_full_width" class="col-xs-12" |cond="$__Context->page_full_width">
변수의 특성에 대한 질문인데요...
2003.01.23 15:34
아~ 미치겠네요...제가 너무 미련한 탓인지..아직도 이해가 안가네요 ㅡㅡ;;
너무 죄송스러워요,
많은 답변을 받았음에도 불구하고, 이해를 못하고 있는 제가 한심하기 까지
하네요~ 에휴~
질문1)
이번에는 다른 방향으로 질문을 드려볼께요~
예를 들어
1행 <?
2행 function sum(){
3행 $a=10;
4행 $a++;
5행 echo $a."<br>";
6행 }
7행 sum();
8행 sum();
9행 sum();
10행 ?>
이렇게 코딩을 했을 때 결과는
11
11
11
이렇게 나오잖아요, 즉, 7행에서 sum() 을 실행하였을 때 4행에서 $a++을
하여 3행 $a에11이 저장되지만, 함수가 종료되고 나면 3행 $a의 11이라는
값은 사라지게 되어 다시 8행에서 sum()을 실행하더라도 다시 11이라는
값이 출력되는거라고 생각이 되거든요,
만약 3행 $a에 static을 붙일 경우 4행 $a++ 를 한 11이라는 값이 3행 $a에
저장되고 함수가 종료되더라고 3행 $a에는 11이라는 값이 그대로 저장되어
있기 때문에 8행에서 다시 sum()을 실행하였을 때 12라는 값이 출력되는
거라고 생각되거든요...
그렇다면, 아래의 소스의 경우
1행 <?
2행 $a=1;
3행 while($a<=80){
4행 $a=70;
5행 if($a<=80){
6행 $a++;
7행 echo $a."<br>";
8행 }
9행 else{
10행 break;
11행 }
12행 ?>
4행 $a의 변수는 while구문이 반복되는 중에 변수값이 사라지지 않는다는
답변을 받았는데요...
그렇다면 6행 $a++ 한 값이 4행 $a에 저장되어 매번 반복할 때마다 4행
$a의 값은 70, 71,72,73,74....이런식으로 값이 증가되어야 하는거 아닌가요??
그렇게 되면, 무한루프가 걸리지 않을거라는 생각이 드는데...(물론 결과는
무한루프지만요...ㅡㅡ;;)
질문2)
1행 <?
2행 function sum(){
3행 static $a=10;
4행 $a++;
5행 echo $a."<br>";
6행 }
7행 sum();
8행 sum();
9행 sum();
10행 ?>
위의 소스가 처리되는 과정을 아래와 같이 풀어서 코딩해 봤는데, 맞는지
한 번 봐주세요...
1행 <?
2행 $a=10;
3행 $a++;
4행 echo $a."<br>";
5행 $a=11
6행 $a++;
7행 echo $a."<br>";
8행 $a=12
9행 $a++;
10행 echo $a."<br>";
맞나요??
질문3) 이번이 마지막 질문...^^;;;;
제가 보고 있는 책의 내용중...
1행 <?
2행 $a=100;
3행 $b=200;
4행
5행 function sum(){
6행 global $a,b;
7행 $b=$a+$b;
8행 }
9행 sum();
10행 echo "변수 b의 값은 ".$b."입니다.";
11행 ?>
위의 예제에서 6행의 전역변수 설정이 있을 때와 없을 때의 결과는 어떻게 될까?
만일 6행이 없을 경우에는 함수 내의 변수 $a와 $b는 함수 밖으로 벗어나질 못
하므로 10행에서 출력되는 $b는 동일 영역인 3행에서 정의된 변수 $b의 값 200
으로 출력된다.
그러나 6행처럼 변수 $a와 $b를 global 선언자를 이용하여 전역변수로 설정하면
함수내의 변수 $a와 $b는 각각 100과 200이라는 값을 가지게 되므로 7행에서는
100과 200을 더한 값이 변수 $b에 재할당되어 10행에서 $b의 값으로 300이 출력
된다.
여기까지가 제가 보고 있는 책에 나온 내용을 적은 것이구요,
해설 내용중에
"100과 200을 더한 값이 변수 $b에 재할당되어 10행에서 $b의 값으로 300이 출력
된다"
라고 나와 있는데, 여기서 변수 $b에 재할당 되는 것은 3행의 $b변수에 재할당된
다는 것을 뜻하는 것인가요? 아니면 7행의 $b에 재할당된다는 것인가요??
아~ 정말로 죄송해요...그러나 이런질문을 드리는 저는 오죽하겠어요..ㅠㅠ
몇 일 째 이것들 때문에 고생하네요, 이럴때는 멍청한 제가 한심하게 생각되네요,
아마 위의 3가지 질문을 모두 같은 종류의 질문이라고 생각하실 거예요,
물론 여러개 질문을 드리는 것이 도리가 아닌것으로 알지만...3가지의 질문에
대한 답변을 종합해서 다시 한 번 제가 정리를 해보기 위해 질문을 드린 것이니,
이해해주세요..ㅡㅡ;;
그리고, 항상 좋은 답변을 주셨던 분들께 감사드리구요...(__)
너무 죄송스러워요,
많은 답변을 받았음에도 불구하고, 이해를 못하고 있는 제가 한심하기 까지
하네요~ 에휴~
질문1)
이번에는 다른 방향으로 질문을 드려볼께요~
예를 들어
1행 <?
2행 function sum(){
3행 $a=10;
4행 $a++;
5행 echo $a."<br>";
6행 }
7행 sum();
8행 sum();
9행 sum();
10행 ?>
이렇게 코딩을 했을 때 결과는
11
11
11
이렇게 나오잖아요, 즉, 7행에서 sum() 을 실행하였을 때 4행에서 $a++을
하여 3행 $a에11이 저장되지만, 함수가 종료되고 나면 3행 $a의 11이라는
값은 사라지게 되어 다시 8행에서 sum()을 실행하더라도 다시 11이라는
값이 출력되는거라고 생각이 되거든요,
만약 3행 $a에 static을 붙일 경우 4행 $a++ 를 한 11이라는 값이 3행 $a에
저장되고 함수가 종료되더라고 3행 $a에는 11이라는 값이 그대로 저장되어
있기 때문에 8행에서 다시 sum()을 실행하였을 때 12라는 값이 출력되는
거라고 생각되거든요...
그렇다면, 아래의 소스의 경우
1행 <?
2행 $a=1;
3행 while($a<=80){
4행 $a=70;
5행 if($a<=80){
6행 $a++;
7행 echo $a."<br>";
8행 }
9행 else{
10행 break;
11행 }
12행 ?>
4행 $a의 변수는 while구문이 반복되는 중에 변수값이 사라지지 않는다는
답변을 받았는데요...
그렇다면 6행 $a++ 한 값이 4행 $a에 저장되어 매번 반복할 때마다 4행
$a의 값은 70, 71,72,73,74....이런식으로 값이 증가되어야 하는거 아닌가요??
그렇게 되면, 무한루프가 걸리지 않을거라는 생각이 드는데...(물론 결과는
무한루프지만요...ㅡㅡ;;)
질문2)
1행 <?
2행 function sum(){
3행 static $a=10;
4행 $a++;
5행 echo $a."<br>";
6행 }
7행 sum();
8행 sum();
9행 sum();
10행 ?>
위의 소스가 처리되는 과정을 아래와 같이 풀어서 코딩해 봤는데, 맞는지
한 번 봐주세요...
1행 <?
2행 $a=10;
3행 $a++;
4행 echo $a."<br>";
5행 $a=11
6행 $a++;
7행 echo $a."<br>";
8행 $a=12
9행 $a++;
10행 echo $a."<br>";
맞나요??
질문3) 이번이 마지막 질문...^^;;;;
제가 보고 있는 책의 내용중...
1행 <?
2행 $a=100;
3행 $b=200;
4행
5행 function sum(){
6행 global $a,b;
7행 $b=$a+$b;
8행 }
9행 sum();
10행 echo "변수 b의 값은 ".$b."입니다.";
11행 ?>
위의 예제에서 6행의 전역변수 설정이 있을 때와 없을 때의 결과는 어떻게 될까?
만일 6행이 없을 경우에는 함수 내의 변수 $a와 $b는 함수 밖으로 벗어나질 못
하므로 10행에서 출력되는 $b는 동일 영역인 3행에서 정의된 변수 $b의 값 200
으로 출력된다.
그러나 6행처럼 변수 $a와 $b를 global 선언자를 이용하여 전역변수로 설정하면
함수내의 변수 $a와 $b는 각각 100과 200이라는 값을 가지게 되므로 7행에서는
100과 200을 더한 값이 변수 $b에 재할당되어 10행에서 $b의 값으로 300이 출력
된다.
여기까지가 제가 보고 있는 책에 나온 내용을 적은 것이구요,
해설 내용중에
"100과 200을 더한 값이 변수 $b에 재할당되어 10행에서 $b의 값으로 300이 출력
된다"
라고 나와 있는데, 여기서 변수 $b에 재할당 되는 것은 3행의 $b변수에 재할당된
다는 것을 뜻하는 것인가요? 아니면 7행의 $b에 재할당된다는 것인가요??
아~ 정말로 죄송해요...그러나 이런질문을 드리는 저는 오죽하겠어요..ㅠㅠ
몇 일 째 이것들 때문에 고생하네요, 이럴때는 멍청한 제가 한심하게 생각되네요,
아마 위의 3가지 질문을 모두 같은 종류의 질문이라고 생각하실 거예요,
물론 여러개 질문을 드리는 것이 도리가 아닌것으로 알지만...3가지의 질문에
대한 답변을 종합해서 다시 한 번 제가 정리를 해보기 위해 질문을 드린 것이니,
이해해주세요..ㅡㅡ;;
그리고, 항상 좋은 답변을 주셨던 분들께 감사드리구요...(__)
댓글 4
-
세상
2003.01.23 15:51
-
소프트맨
2003.01.23 16:15
그냥 훝어 봤는데요.. 머 요지는.. static 때문인거 같은데요..
책의 한계를 못 벗어 나셨군요.. 책의 저자뿐께서도.. 자세히 설명하려 노력했겠지만..
변수가 머 사라지네.. 존재하네.. 이런 단어가 같은 한국말이라고 똑같이 취급하시면 안되죠..
프로그래밍은 이해 입니다.
$a = 10; // initialize
위 작업은 말 그대로.. 초기화 작업니다. 위 명령문을 만날 때마다.. 항상 변수 $a의 값은 10 이 되는 거죠..
1행 <?
2행 function sum(){
3행 $a=10;
4행 $a++;
5행 echo $a."<br>";
6행 }
7행 sum();
8행 sum();
9행 sum();
10행 ?>
님 말대로.. 7행 ~ 9행까지 걸쳐서 sum() 함수를 호출하는데 결과값은..
11
11
11
나오죠.. 이건 변수가 사라지고 존재하고의 문제가 아닙니다..
3행 $a=10;
initialize 과정을 거치기 때문에 $a 값은 10으로 할당되고.. 여기서 1이 증가된 값이 출력되는 것 뿐입니다.
자 static 을 붙여 보죠...
1행 <?
2행 function sum(){
3행 static $a=10;
4행 $a++;
5행 echo $a."<br>";
6행 }
7행 sum();
8행 sum();
9행 sum();
10행 ?>
11
12
13
위와 같은 결과가 나오는건 님이 아시듯이 함수가 끝나도 $a 변수가 메모리상에 존재하기 때문입니다.. 그럼 함수를 호출 할때마다 3행이 계속 실행되는데 그럼 저 10으로 초기화 하라는 명령은 어케 되는 겁니까??
static 이 붙어 있으면 처음 한번만 초기화를 하고 다음에는 그 명령이 무시되기 때문입니다..
님이 비교하신 예처럼 메모리상에 존재하고 안하고의 차이가 아닙니다..
1행 <?
2행 function sum(){
3행 static $a;
4행 $a = 10;
5행 $a++;
6행 echo $a."<br>";
7행 }
8행 sum();
9행 sum();
10행 sum();
11행 ?>
그럼 위의 예제 한번 실행해 보세요... static 으로 선언된 변수 $a 가 존재합니다. 물론 함수가 끝나도 $a 는 메모리 상에 존재 합니다.
자 결과가
11
12
13
이라고 나오나요?? 직접 한번 실행해 보세요... 11 11 11 이라고 나옵니다.
그리구.. 질문3... 먼가 크게 잘못생각하시네요.. 7행의 $b하고.. 3행의 $b라...
그런식으로 이해하는게 아닙니다..
변수가 선언되고.. 메모리에 그 공간이 할당되고.. 그 메모리 공간에 대해 주소를 가지고 있는 어떤 이름($b) 에 대해 연산작업을 하는 것이라고 이해해야합니다. 참고적으로 님께서 올리신 예제에서 $b 는 단 하나만 메모리상에 존재합니다. global 이 붙어 있으니 다 똑같은 $b 변수입니다.
책을 뛰어 넘으십시오.. -
김민규
2003.01.23 21:31
소프트맨님,~
저의 오랜 방황을 탈출하게 해주셨네요 ^^
너무 감사드려요(__)
이제 다음 진도 나갈 수 있겠네요~
자주 답변 달아주세요~
정말로 이해하기 쉽게, 저의 답답한 점을 정확게 파악해서 답변을
달아주셔서 다시 한 번 감사드려요
그리고, 세상님도 답글 달아주셔서 너무 감사드려요(__) -
세상
2003.01.24 10:06
오~ static을 붙이면 초기화가 한번만 일어나는군요~ @_@
2행 function sum(){
3행 $a=10;
4행 $a++;
5행 echo $a."<br>";
6행 }
7행 sum();
8행 sum();
9행 sum();
10행 ?>
이렇게 코딩을 했을 때 결과는
11
11
11
이렇게 나오는 이유는..
$a=10; <- 이 부분이 함수 내에 포함 되어있기 때문입니다..
sum()을 호출할 때 마다 $a에 '10'이라는 값이 할당되는 것이지요
즉 함수 안에서 $a의 초기값을 넣어주시면(민규님이 하신 방식대로)
$a가 static이라도, 계속 같은 결과가 나올 것 같네요
다른 것들도 똑같은 방식입니다.. 변수에 값을 할당하는 부분이..함수나, while 문 안에 포함되어있어서 민규님이 생각하는 바와 다르게 나타나는 것이지요..
질문 3)
1행 <?
2행 $a=100;
3행 $b=200;
4행
5행 function sum(){
6행 global $a,b;
7행 $b=$a+$b;
8행 }
9행 sum();
10행 echo "변수 b의 값은 ".$b."입니다.";
11행 ?>
6행이 없다면..
2행,3행의 $a와 $b는 7행의 $a와 $b와 다른 변수입니다..
전역변수로 설정하지 않는다면 기본적으로 지역변수가 되어서..
함수 내에서만 존재하는 변수가 되는 것이지요..이름만 같을뿐이지요
6행이 있을 땐,즉 전역변수로 사용한다면..
같은 변수가 되는 겁니다..
헉..설명이..이상한가..ㅠ_ㅡ;;