PHP의 자료형(Data Type)과 자동형변환(Type Juggling) 알아보기
프로그래밍 언어의 조건
컴퓨터공학전공 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.