선생님을 위한 프로그래밍 수업

변수

토픽 선생님을 위한 프로그래밍 수업 > 웹 애플리케이션 만들기 > PHP

변수(變數, Variable)는 문자나 숫자 같은 값을 담는 컨테이너다. 여기에 담겨진 값은 다른 값으로 바꿀 수 있다. 변수는 마치 (사람이 쓰는 언어인) 자연어에서 대명사와 비슷한 역할을 한다.

변수의 선언

다음 예제는 변수에 값을 대입하는 방법을 보여주는 예제다.

/variable/variable1.php

https://github.com/egoing/phpeverybody/blob/master/variable/variable1.php

<html>
<body>
<?php
$a=1;
echo $a+1; #2
echo "<br />";
$a=2;
print $a+1; #3
?>
</body>
</html>

#은 주석(comment)으로 코드에 부가적인 설명을 쓰거나 사용하지 않는 코드를 비활성화시키기 위해서 사용한다. #뒤에 따라오는 내용은 해석되지 않는다. # 대신에 //를 사용할 수도 있다. 긴 구간을 주석으로 처리하고 싶다면 /* */를 사용한다.

위의 실습 결과는 각각 2와 3이 출력될 것이다. 변수 $a에 담겨 있는 값이 1일 때는 $a+1의 결과가 2가 된다. 두번째 결과가 3이 된 것은 $a의 값이 2로 바뀌었고, 2+1의 결과인 3이 출력된 것이다.

다음 예제는 변수의 값이 꼭  숫자만 올 수 있는 것은 아니라는 것을 보여주기 위해서 만든 예제다.

/variable/variable2.php

https://github.com/egoing/phpeverybody/blob/master/variable/variable2.php

<html>
<body>
<?php
$first = "coding";
echo $first." everybody";
?>
</body>
</html>

변수가 없다면

변수는 코드의 재활용성을 높여준다. 예를들어서 100에 10을 더하고, 10을 나눈 후에 다시 10을 빼고 거기에 10을 곱해야 한다고 치자. 그리고 각 단계마다 그 결과를 출력해야 한다면 코드는 아래와 같을 것이다.

/variable/variable3.php

https://github.com/egoing/phpeverybody/blob/master/variable/variable3.php

<html>
<body>
<?php
echo 100+10;
echo '<br />';
echo (100+10)/10;
echo '<br />';
echo ((100+10)/10)-10;
echo '<br />';
echo (((100+10)/10)-10)*10;
echo '<br />';
?>
</body>
</html>

그런데 계산해야 할 값을 100이 아니라 1000으로 바꿔야 한다면 위의 코드를 모두 수정해야 할 것이다. 변수를 적용해보자.

/variable/variable4.php

https://github.com/egoing/phpeverybody/blob/master/variable/variable4.php

<html>
<body>
<?php
$a = 100;
$a = $a + 10;
print $a.'<br />';
$a = $a / 10;
print $a.'<br />';
$a = $a - 10;
print $a.'<br />';
$a = $a * 10 ;    
print $a.'<br />';
?>
</body>
</html>

위의 코드에서 첫번째 줄의 100을 다른 숫자로 바꾸면 나머지 로직에 대입되는 변수의 값이 모두 바뀐다. 수정해야 할 코드가 적다는 것은 그만큼 해야 할 일이 줄어든다는 의미고, 그 과정에서 버그가 발생할 가능성을 낮출 수 있다. 변수의 효용은 뒤에서 배우게 될 반복문, 조건문, 함수와 결합되면 더욱 더 중요해진다.

상수

 

상수(常數, constant)는 변하지 않는 값이다. 예를들어 아래는 성립 될 수 없다.

1=2;

즉 정수 1은 2가 될 수 없기 때문에 상수이다. 필요에 따라서 사용자가 직접 상수를 정의 할 수도 있다. 아래 예제를 보자.

/variable/variable8.php

https://github.com/egoing/phpeverybody/blob/master/variable/variable8.php

<html>
<body>
<?php
define('TITLE', 'PHP Tutorial');
echo TITLE;
define('TITLE', 'JAVA Tutorial');
?>
</body>
</html>

결과는 아래와 같다.

PHP Tutorial
Notice: Constant TITLE already defined in C:\BitNami\wampstack-5.4.20-0\apache2\htdocs\variable\variable8.php on line 6

상수를 정의 할 때는 define를 사용한다. define의 첫번째 인자로 상수의 이름이 사용되고, 두번째 인자로 상수의 값이 사용된다. 상수에 저장된 값을 사용하기 위해서는 인용부호가 없이 상수의 이름을 적어주면 된다. 위의 예제는 PHP Tutorial를 출력 하지만 동시에 오류를 발생시킨다. 위의 코드는 한번 정의된 상수의 값은 불변이라는 원칙을 어기고 있기 때문에 PHP에서는 오류를 발생시킨 것이다. 상수는 한번 정의된 어떤 값이 변경되지 않음을 보증한다. 이러한 성질을 이용해서 설정 값과 같은 용도로 상수를 주로 사용한다.

학습의 편의를 위해서 앞으로 고급주제를 구분하겠다. 본 언어를 처음 학습한다면 고급주제는 나중에 보고, 복습 때 고급주제를 학습할 것을 권한다. 고급주제는 중요 하지만, 언어의 전체적인 모습을 보는데는 오히려 방해가 될 수 있기 때문이다. 고급주제는 본 수업의 모든 내용을 이수한 것을 전재하기 때문에 아직 배우지 않은 용어도 사용한다.
고급주제

 

변수에 담긴 데이터 형을 검사하고 변경하기

PHP에서 변수에 담긴 데이터 형을 검사할 때는 gettype과 settype을 사용한다. 아래는 이 명령들의 사용법이다.

/variable/variable5.php

https://github.com/egoing/phpeverybody/blob/master/variable/variable5.php

<html>
<body>
<?php
$a = 100;
echo gettype($a);
settype($a, 'double');
echo '<br />';
echo gettype($a);
?>
</body>
</html>

위의 코드를 실행해보면 integer(정수)와 double(실수)가 출력된다. $a에 어떤 데이터형이 담겨있는지 알아보기 위해서 gettype을 사용했다. gettype은 인자로 전달된 값의 데이터 형을 출력한다. var_dump와 비슷 하지만 var_dump는 데이터형에 대한 검사와 함께 출력까지 강제로 하기 때문에 활용도가 떨어진다. settype은 첫번째 인자로 주어진 값을 두번째 인자에 해당하는 데이터 형으로 변경해준다.

이와 비슷한 역할을 하는 API로는 아래와 같은 것이 있다.

변수의 데이터 타입

PHP는 다른 언어들과는 다르게 변수에 담길 값의 데이터 형식을 미리 지정할 필요가 없다. 아래의 예제를 보자.

/variable/variable6.php

https://github.com/egoing/phpeverybody/blob/master/variable/variable6.php

<html>
<body>
<?php
$a = 100;
$a = "test";
$a = array(1,2,3);
?>
</body>
</html>

위의 코드는 PHP에서는 아무런 문제가 없다. 이것은 PHP의 장점이면서 단점으로 이야기 되기도 한다. 즉 변수 $a를 선언할 때 변수에 어떤 값이 들어가야 하는지 미리 지정 할 필요가 없다. 필요에 따라서 다른 형식의 데이터를 넣으면 변수의 데이터 형식이 자동으로 변경된다. 이것은 매우 편리 하지만, 변수에 어떠한 형식의 데이터가 담겨있는지를 예측할 수 없기 때문에 오류가 발생할 가능성이 높아지기도 한다.

가변변수

variable variables. 가변변수는 변수의 이름을 변수로 변경 할 수 있는 기능이다. 이것은 코드로 이해하는 것이 더욱 빠르다.

/variable/variable7.php

https://github.com/egoing/phpeverybody/blob/master/variable/variable7.php

<html>
<body>
<?php
$title = 'subject';
$$title = 'PHP tutorial';
echo $subject;
?>
</body>
</html>

위의 코드를 보면 변수 $title의 값이 subject이다. 그런데 5행에 나타나는 '$$title'에는 '$'가 두번 표시되어 있다. 이것은 문자열 'PHP tutorial'이 변수 $title의 값이 아니라 변수 $subject의 값이라는 의미다. 변수의 이름을 동적으로 만들 수 있다는 점은 PHP가 가진 유연함을 보여준다. 

참고

댓글

댓글 본문
  1. DreamBoy
    2023.10.20. PHP - 변수 파트 수강했습니다.
  2. 코딩혁명
    감사합니다~
  3. dueto park
    2022.06.27. 변수 수강 완. (고급 빼고)
  4. 코드파괴자
    22.05.19 complete.
  5. 드림보이
    2022.01.13. 변수 파트 수강완료
  6. ggyuker
    21.12.29 고급빼고 수강완료
  7. kyusss
    2021.08.30 수강완료
  8. kyh0703
    2021.08.02 - OK
  9. jeisyoon
    2021.07.25 Variable, Constant - OK
  10. jinseok_bae
    감사합니다~!
  11. rosydarling
    23/04/2021 완료! 가변 변수 정말 신기하네요! 처음 들어봤어요 :)
  12. 조성호
    2021.01.01 완료
    너무 잘 배웠습니다. 감사합니다!
  13. 햄릿슈
    가변 변수 완전 신기하네요~ 실질적으로 많이 사용하는지 궁금합니다!
  14. 팬이에요
    숫자는 상수 변환이 안되나봐요
  15. 박은지
    감사합니다~!
  16. 박은지
    감사합니다.
  17. choon
    감사합니다.
  18. 호두
    고맙습니다.
  19. 민갱
    가변변수는 살짝 난이도가 있는 것 같내요. 뭐, 코딩 몇 번 해보면 알겠지만..
  20. 아사다마오리족
    가변변수라는 애는 특이하네요;
  21. dosamo
    완료
  22. jjung
    게시판 언능 만들어야지
  23. jjung
    끝까지!
  24. warn
    $가 두개 들어가는거는 뭔가 C에서 배우는 **포인터 같은 느낌이네요 ㅋ
  25. 다시시작
    완료.
  26. spiritord
    감사합니다
  27. kimjs9105
    감사합니다~ 고급주제 보러 다시 올게요~~~~>_<
  28. 심화평
    17-07-10 감사합니다~ 고급주제 복습.
  29. Jongho Kim
    고급주제 ㄷㅅㅂㄱ
  30. 강수경
    좋은 강의 감사합니다. ^^
  31. 김세창
    2017.03.28 완료. 복습할때 , 고급주제 보기!! ㅎㅎ
    일주일만에 완주하자!
  32. 민예은
    와 실무에서 변수를 임의로 for문으로 만들 수 없을까하고 고민많이했었는데
    가변변수란게 있었군요.
    너무 놀랫습니다.

    가변변수란 개념도 처음알았습니다.
  33. 폭스킴
    변수앞에 $를 사용, echo와 print 둘 다 사용 가능, 한줄 주석문에 #도 사용가능, 상수를 사용(설정값 등)할 때는 관습적으로 대문자를 사용, 변수의 이름을 바꾸는 가변변수를 사용가능
  34. 신입1
    가변변수가 신기하네요
  35. Sajuk
    언제나 잘 보고 있습니다.
    2016-08-25
  36. JustStudy
    고맙습니다
  37. openarms
    강의 감사합니다.
  38. Moon Hee Bae
    $$ 재미있군요.
  39. 김상진
    감사합니다!
  40. 고고1
    음~~~
  41. 2015-11-16 월
    자바스크립트를 공부했더니 쉽게 이해되네요
  42. 코딩!
    가변변수도 결국 중복을 제거하는 거네요?
  43. 모니~
    ㅋㅋ 모니(money) 귀여워요!
  44. 아리스토X
    gettype과 settype이 실제 웹을 구성하는 소스코드에서 어떤 부분에 사용되는지도 궁금해지네요. 좋은강좌 감사합니다.
  45. 헤클
    java 에서는 float형은 별도로 지정하지 않으면 기본값으로 가지게 되어있습니다
    php도 그래서 같은개념이 아닐까 생각됩니다만
    대화보기
    • 잉여잉여
      php documetation에서 gettype함수의 리턴값 중 double에 대한 부연설명을 보시면,
      (for historical reasons "double" is returned in case of a float, and not simply "float")
      이렇게 나와있는데요,
      gettype 함수는 입력된 변수값의 자료형이 float인 경우나 double인 경우 모두 리턴값을
      double로만 출력하기 때문에 위와 같은 결과가 나온게 아닐까요?

      아래 사이트를 참고하였습니다.
      http://kr1.php.net......php
      대화보기
      • 환글
        좋아요
      • 초보
        /variable/variable5.php의 소스코드를 보고 var_dump()와 비교 해보기 위해 아래처럼 코딩했습니다.
        $a = 100;
        echo gettype($a) ."<br>";
        var_dump($a);
        settype($a, 'double');
        echo '<br />';
        echo gettype($a) ."<br>";
        var_dump($a);

        결과
        integer
        int(100)
        double
        float(100)

        정수형은 맞게 출력이 되는데 실수형은 왜 같은 변수임에도 double과 float으로 나뉘어 지는지 모르겠습니다.
        어떤게 맞는건가요??
      • openkwang
        : ) 화이팅입니다.
        대화보기
        • 바위구름
          좀 더 공부를 하고 필요를 느낄 정도는 되어야 정확하게 이해가 될것 같네요 ㅠㅠ
          좋은 답변 감사드립니다
          대화보기