PHP의 자료형(Data Type)과 자동형변환(Type Juggling) 알아보기
This tutorial is good!
PHP Basics like Introduction, Installation Guide, Data Types, Variables, and Operators.
It also introduces Control structures, Functions, Strings, Regular expression, Error Handling, Cookies & Sessions.
This site also touch on advanced topics like PHP mail, MySQL Functions, Security, XML Parser, and Create PHP Application.
PHP Data Types, Variables, Constant, Operators Tutorial
https://www.guru99.com/data-types-variables-and-operators.html
프로그래밍 언어의 조건
컴퓨터공학전공 4학년 교과과정 중에 Programming Language 라는 수업이 있다.
이 수업에서는 그동안 무심코 배워왔던 프로그래밍 언어의 역사와, 언어의 발명일, 영향을 받은 언어, 영향을 끼친 언어, 기본 정신, 주 응용분야 등을 배운다.
프로그래밍 언어의 조건과 Language Designer 의 역할에 대해서 배우고
직접 자신만의 언어 규칙을 정하고 어휘분석기(Lexer)와 구문분석기(Parser) 자료형검사기(Type Checker)를 만들어본다.
코드가 실행되기 까지 꽤나 다양한 단계가 있는데 각 단계에 대해서 배운다.
프로그래밍 언어는 반드시 다음의 4가지 속성을 가지고 있어야 한다.
– Syntax(구문구조) : 문법적으로 올바른 프로그램에 대해 정확하게 설명.
– Names(이름) : 프로그램에서의 다양한 개체에 대해 이름을 명명함. (변수명, 타입명, 함수명, 클래스명 등등)
– Types(타입) : 타입이란 값의 그룹과 값이 할 수 있는 연산에 대해서 정의합니다. 이로인해서 올바른 연산을 파악하고 타입에러를 검출할 수 있습니다.
– Semantics(의미) : 프로그램의 의미를 나타냅니다. 각 줄의 의미를 알 수 있으며 프로그램이 실행되면 변수의 변화등을 정의합니다.
언어 디자이너(Language designer)는 이 속성을 반드시 정의하여야 하며 프로그래머(Programmer)는 반드시 정해진 규칙을 따라야 한다.
따라서 오랫동안 사용되어진, 잘 정의된 PHP 언어도 구문구조 규칙, 이름 규칙, 타입 규칙, 의미 규칙을 가지고 있다.
1. PHP의 자료형 (PHP DataType)
PHP는 현재 버전 기준(PHP 5.6)으로 다음의 자료형(Data Type)을 가지고 있다.
참조 : http://www.w3schools.com/php/php_datatypes.asp
- String
- Integer
- Float (floating point numbers - also called double)
- Boolean
- Array
- Object
- NULL
- Resource
<자료형 테스트코드>
<?php // Lael's World // https://blog.lael.be/post/1993 Class BlogExample { function BlogExample () { // echo "HELLO WORLD!\n"; } function show () { echo "HI WORLD!\n"; } } $a = "apple juice"; var_dump($a); $b = 10; var_dump($b); $c = 3.141592; var_dump($c); $d = true; var_dump($d); $e = array(); var_dump($e); $f = new BlogExample(); var_dump($f); $g = NULL; var_dump($g); $h1 = mysql_connect('localhost', 'test', 'test'); var_dump($h1); $h2 = mysql_query('show databases'); var_dump($h2);
<자료형 테스트코드 실행결과>
2. PHP 자동 자료형변환 (Type Juggling)
PHP 를 배우면서, 잘 모르면 쉽고, 알면 정말 어려운 것이 Type Juggling 이다.
<이게 바로 Juggling 입니다>
Type Juggling = 자동 자료형변환 = Auto Typecasting = Implicit Typecasting
다양한 단어로 쓰인다.
변수 정의(memory allocation), 변수에 값 할당(assign), 변수 연산(operation)을 하기 위해서는 DataType 정의가 필수적이다.
PHP 는 안될 것 같은 연산들도 Type Juggling을 해서 되게 만드는 것이 꽤나 있다.
이러한 동작은 2015년 가장 인기있는 언어인 Javascript 에서도 동일하게 동작한다.
이 어려운 동작을 다른 언어에서도 채용하는 추세라서 알아두는 것이 좋을 것이다.
이것저것 해보고 경험을 통해 Type Juggling 을 체득(?)하여야 한다.
C 언어에도 폭넓지는 않지만 이미 Type Juggling 이 있긴하다.
다음의 코드를 보아라.
int i=1; while(1){ if (i > 120) break; i++; }
너무 당연하다고 생각하는가?
while(1) 의 의미를 알고 있는가?
if 및 while 구문에서 괄호 안에는 boolean 값이 나와야 한다. 1 은 boolean 값이 아니기 때문에 자동형변환이 일어난다.
1 은 true 로 변환되고, 2 도 true 로 변환되고, 0 은 false 로 변환된다. (0 이외의 값은 true 이다.)
이에 대하여 엄청난 Type Juggling 을 하는 PHP는
while(1), while(true), while(‘hello’), while(object 변수), while(resource 변수) 모두 동일한 동작을 한다.
아주 놀라운 자료형 변환이다. 이걸 이해하는데 정말 시간이 오래걸린다.
다른 예제를 살펴보자.
이번엔 boolean 이 아니라 integer 로 변환할 것이다.
<Juggling 예제 코드1>
<?php // Lael's World // https://blog.lael.be/post/1993 $_GET['countdown'] = '10'; $my_countdown = $_GET['countdown']; for ($i = $my_countdown; $i >= 0; $i--) { var_dump($i); echo $i . " gogo!\n\n"; }
<Juggling 예제 코드1 실행결과>
위와 같은 출력을 예측했다면 당신은 잘 하고 있는 것이고, 출력이 이해가지 않는다면 조금 더 노력해야 할 것이다.
먼저 $my_countdown 에는 string 형 10 이 저장되어 있다.
$i 에 $my_countdown 을 할당했으니, $i 에도 string 형 10 이 저장되어 있다.
$i >= 0 구문을 만나면 비교 연산자 이기 때문에, ’10’ >= 0 이 된다. string 이 integer로 변환되고 integer 형 10 으로 바뀐 후 비교를 한다.
변환 연산을 위해서 임시로 변한 것일 뿐 해당 값에는 변화가 없다. 즉 intval(’10’) >= 0 이 실행된 것이다.
echo 문을 만나면 $i 가 string 10인 경우를 제외하고는 echo strval($i) . ” gogo!” 가 실행된 것이다.
구문을 실행한 후 $i- 구문을 만나면 이때에는 int 형으로 변환된 9가 저장된다. 즉 $i = intval(’10’) - 1 이 실행된 것이다.
PHP를 프로그래밍 하면서 만날 수 있는 Type Juggling 한가지를 더 살펴보자.
환전 프로그램이다. 달러를 입력하면 한국 원 으로 변환해서 화면에 출력해 준다.
웹 인풋에 “숫자만 적어주세요” 라고 써두어도, 저렇게 문자까지 쓰는 사람이 꼭 있다.
<?php // Lael's World // https://blog.lael.be/post/1993 $_GET['dollar'] = '150 달러'; $my_dollar = $_GET['dollar']; $my_won = $my_dollar * 1100; echo 'KRW : ' . $my_won . ' WON';
실행결과를 볼까?
정말 이해가 안되지만 동작한다.
$my_won = intval($my_dollar) * 1100; 이라는 구문으로 변환되어 실행되어 버린다.
intval(‘150 달러’) 는 integer 형 150 과 같다.
참고로 Javascript 예제는 다음과 같다.
결론 : PHP 의 Type Juggling 에 대해 숙지(어려움)하고, 되도록 엄격한(strict) 코드를 작성하길 바란다.
엄격한 코딩을 위해서, 변수는 정보를 얻자마자 형태를 고정시키고 필터링 하는 것이 좋다.
Nice Tutorial.