PHP의 자료형(Data Type)과 자동형변환(Type Juggling) 알아보기

HYEONG HWAN, MUN/ 8월 31, 2015/ 미분류/ 1 comments

https://blog.lael.be/post/1993

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)를 만들어본다.

 

코드가 실행되기 까지 꽤나 다양한 단계가 있는데 각 단계에 대해서 배운다.

cl

 

 

프로그래밍 언어는 반드시 다음의 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

 

스크린샷 2015-09-04 오전 12.12.08

<자료형 테스트코드>


<?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);

 

스크린샷 2015-09-04 오전 12.11.35

<자료형 테스트코드 실행결과>

 

2. PHP 자동 자료형변환 (Type Juggling)

PHP 를 배우면서, 잘 모르면 쉽고, 알면 정말 어려운 것Type Juggling 이다.

 

krustjuggle

<이게 바로 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 로 변환할 것이다.

스크린샷 2015-09-05 오후 10.52.02

<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";
}

 

스크린샷 2015-09-05 오후 10.53.40

<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 한가지를 더 살펴보자.

 

환전 프로그램이다. 달러를 입력하면 한국 원 으로 변환해서 화면에 출력해 준다.

웹 인풋에 “숫자만 적어주세요” 라고 써두어도, 저렇게 문자까지 쓰는 사람이 꼭 있다.

스크린샷 2015-09-05 오후 11.29.27

 


<?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';

 

실행결과를 볼까?

스크린샷 2015-09-05 오후 11.31.14

 

정말 이해가 안되지만 동작한다.

$my_won = intval($my_dollar) * 1100;    이라는 구문으로 변환되어 실행되어 버린다.

intval(‘150 달러’)integer 형 150 과 같다.

 

참고로 Javascript 예제는 다음과 같다.

스크린샷 2015-09-05 오후 11.37.42

 

결론 : PHP 의 Type Juggling 에 대해 숙지(어려움)하고, 되도록 엄격한(strict) 코드를 작성하길 바란다.

엄격한 코딩을 위해서, 변수는 정보를 얻자마자 형태를 고정시키고 필터링 하는 것이 좋다.

스크린샷 2015-09-05 오후 11.46.13

1 Comment

Leave a Comment

작성하신 댓글은 관리자의 수동 승인 후 게시됩니다.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
*
*