본문 바로가기

Web Development/PHP

[PHP] 기초문법(변수형태-진리값,정수,실수,문자열,배열,객체,널)에 대해서

HTML모드와 PHP모드 구분하기

 

PHP는 HTML을 포함합니다. 그래서 어느 부분이 PHP소스이고 어느 부분이 HTML부분인지 알필요가 있습니다.

 

PHP부분

<? 로 시작하고 ?> 로 끝나는 부분

<?php 로 시작하고 ?> 로 끝나는 부분

※<? ?> 와 <?php ?>의 차이는 크게 없지만 보통 <? ?>으로 많이 사용합니다.

만약에 <? ?>스타일로 사용했는데 에러가 난다면 <?php ?>을 사용합니다.

 

HTML부분

php부분을 제외한 모든 부분

 

<잠시>다음 소스에서 PHP소스와 HTML소스는 무엇일까요?

<? echo "leejunsik"; ?>
<b>leeju<? echo "lee"; ?>nsik</b>
<?php echo "junsik"; ?>
<i>junsik</i>

 

PHP에서 한줄의 끝 구분하기

 

PHP에서는 한줄의 명령이 끝나면 ;(세미콜론)을 꼭 붙여주어야 하며 안써주면 에러가 발생합니다.

PHP에서는 ;을 한줄의 끝으로 알아듣기 때문에 반드시 한문장이 끝나면 세미콜론을 붙여 주셔야 합니다.

 

ex)

<?

echo "leejunsik";

?>

<? echo "junsik"; echo "junsik"; ?>

<?

echo "junsik"

;

?>

<? echo "한줄인 경우에는 세미콜론(;)을 하지 않아도 됩니다." ?>

 

<잠시>다음 소스를 실행한후 에러가 발생하면 고쳐보세요!

<? echo "junsik"; echo "junsik" ?>
<?
echo "junsik"
?>
<? echo "junsik" echo "junsik"; ?>

 

PHP는 대소문자를 구분하지 않는다.

 

PHP는 변수명은 대소문자를 구분하며 사용자정의함수,PHP정의함수는 대소문자를 구분하지 않습니다.

PHP프로그래밍을 하다보면 알겠지만 대소문자를 구분하지 않으면
프로그래밍이 쉽지만 소스의 가독성이 떨어지는 경향이 있습니다.

 

PHP에 주석달기

 

주석은 소스의 설명을 뜻합니다. 그래서 PHP는 주석을 실행하지 않고 그냥 넘어가 버립니다.

그냥 넘어간다는 말은 아무런 실행을 하지 않는다는 뜻입니다.
주석의 주목적은 소스의 설명을 적어놓아 나중에 다시 보게 되거나
남이 자기의 소스를 볼때 좀더 쉽게 이해할수 있게 하는데 목적이 있습니다.
주석을 다는 습관을 들입시다.

 

주석은 아래 3가지 종류가 있습니다.

//            한줄주석

#             한줄주석

/* .. *//    여러줄주석

 

ex)

<?
echo "주석을 해보아요";
//주석입니다.
echo "주석을 해보아요";
# echo "주석입니다요.";

/*
주석입니다.
주석입니다.
*/
?>

 

변수란?

 

변수는 말그대로 "변하는 수" 입니다.
철이가 1000원을 가지고 구멍가게에 가서 껌을 한통사고 500원이 남았습니다.
이때 철이가 가지고 있는 돈이 1000원에서 500원으로 바뀌었습니다.
여기서 "철이가 가지고 있는 돈" 이라는 것이 변수가 되는 것입니다.
처음에는 1000원이라는 값을 갖고 있었는데 껌을 사고난 직후 500원이란 값으로 변하였습니다.

 

프로그래밍에서 변수란 프로그램 내에서 어떤 값을 임시로 저장하기위해 메모리 공간에 이름을 붙여놓은 것입니다.

PHP에서 변수를 $name 과 같은 모양으로 표시합니다.
$name은 name 이라는 이름의 변수임을 뜻합니다.

 

여기서 다른 언어와 변수 지정법이 다른점은 보통 변수를 만들게 된다면(C언어를 예로 들면)

int number;(데이타형 변수이름;)

이런식으로 만들게 되지만 PHP에서는 따로 변수를 선언하지 않아도
자동적으로 대입되는 값에 따라 데이타형이 결정되어 변수가 생성된다.

 

변수명 작성 규칙

 

1.첫번째 문자는 반드시 알파벳이나 특수문자 '_' 만 됩니다.

2.중간 문자는 알파벳,숫자,특수문자 '_' 만 됩니다.

 

변수명 예제(에러를 잡아보세요)

<?
 $value;
 $_lee;
 $2lee;
 $@lee2;
 $^lee;
 $한글;
?>

 

PHP에서 지원하는 데이타 형의 종류(boolena,Integer,float,string)

 

php에서는 변수명을 선언하면 자동으로 데이타형이 결정납니다.
근데 자동으로 데이타형이 결정나는데 왜 데이타형에 대해서 알아야 할까요?

데이타 형은 보통 변수에 할당되는 메모리를 보다 효율적으로 사용하기 위해서 알아 두어야 합니다.

 

진리값 (boolean)

boolean 형은 진리값, 즉 참(TRUE)과 거짓(FALSE) 두가지 값만을 가지기 위한 변수형입니다.
메모리를 아주많이 절약할 수 있겠네요. 1bit 만 필요하니까요

 

여기서 잠깐-bit? Byte?
bit는 컴퓨터에서 가장 작은 단위로 0과 1, 두 가지를 저장할 수 있는 크기의 용량을 말합니다.
(여기서 0과 1 두 개 모두를 저장하는 것이 아니라 둘 중 하나의 값을 저장할 수 있는 것을 말합니다.)
8bit = 1Byte 이므로 1Byte는 2의 8승 가지, 즉 256가지를 표현할 수 있는 크기가 됩니다.
(이 1Byte 크기로 알파벳을 비롯하여 0~9까지 숫자와 특수기호들을 표현하게 됩니다. )
보통의 경우 숫자는 메모리를 4Byte 차지하게 되는데, 4Byte는 2의 32승 가지를 표현할 수 있으므로
정수를 사용한다면 0~4294967295 또는 -2147483648~2147483647 사이의 숫자를 저장할 수 있게됩니다.

 

정수 ( Integer )

<?

$a = 1234; # 십진수
$a = -123; # 음수
$a = 0123; # 8진수 ( 십진수의 83과 같습니다. )
$a = 0x12; # 16 진수 ( 십진수의 18과 같다 )

?>

십진수와 음수는 아시겠지만 8진수와 16진수는 표현법이 새롭습니다.
8진수는 0으로 시작하고 0~7까지의 숫자만을 사용하여 표현하며,
16진수는 0x로 시작하고 0~9와 A~F까지의 총 16가지의 문자로 표현합니다.

프로그래밍을 하기 위해서는 2진수와 8진수 그리고 16진수와 친해져야 합니다.

 

여기서 잠깐-PHP에서 정수?
PHP는 정수를 표시하기 위해서 4Byte의 메모리 공간을 부여합니다.
위에서도 언급하였듯이 4Byte공간은 총 232 가지의 표현이 가능합니다.
정수는 부호가 없이 0 이상의 값을 표현할 때는 0~4294967295 사이의 수를
부호가 있는 정수 값을 표현할 때는 -2147483648~2147483647 사이의 수를 가질 수 있습니다.
총 32개의 bit 중에서 첫 번째 bit를 부호bit으로 사용하여 0일 때 양수.. 1일 때 음수로..
표현하기 때문에 실제 숫자는 31개의 bit으로 표현하게 되어 위와 같은 범위를 갖게됩니다.

 

실수 ( float & doubles )

<?

$a = 1.234;
$a = 1.2e3;//2번째

?>

두 번째에서 e3 은 10의 3승인 1000이 곱해진다는 뜻입니다. 즉, 1200 이란 값이 됩니다.

 

여기서 잠깐-실수는 소수점?
실수를 표시하기 위해서는 소수점이 필요합니다.
소수점 윗자리와 아랫자리 모두를 표현해야 하기 때문에 8Byte의 메모리를 사용합니다.

 

문자열 ( String )

문자열을 표시하는 방법에는 아래와 같은 세가지가 있습니다.

큰 따옴표(") , 작은따옴표('), 상속 문법을 이용한 방법

 

1. 큰 따옴표

"나는 문자열이다." 와 같이 큰 따옴표 사이에 문자열을 써넣으면 됩니다.

 

1) 따옴표 내의 특수문자 사용

큰 따옴표를 이용한 문자열 표현에서는 다음과 같은 특수문자의 사용이 허용됩니다.

 

특수문자

의미

\n

 개행문자 ( 줄 바꿈 )

\r

 캐리지 리턴

\\

 역 슬래쉬

\t

 수평 탭

\"

 따옴표

\$

 달러 표시

 

라인피드(LF) : 커서는 그대로 있고 한줄 아래로 이동

캐리어 리턴(CR) : 커서를 그 줄의 맨 처음으로 이동

개행문자(NewLine=CrLf) : 줄바꿈을 한후 그줄의 맨 앞으로 이동

 

예제)아래의 예제는 이해하셔서 애기해주세요!

<?
    
echo "나는 문자열이예요~ ^^*<BR>\n"

    echo 
"우히히 정말 특별하죠? <BR>\r"
;
    echo 
"역슬래쉬를 보이려면 역슬래쉬 두개를~ \\<BR>"
;
    echo 
"탭\t 탭2<BR>"
;
    echo 
"따옴표 안에 따옴표를 넣으려면 \" <BR>"
;
    echo 
"달러 표시도 \$ <BR>"
;
?>

 

2) 따옴표 내의 변수사용

큰 따옴표내에서는 변수의 사용이 가능합니다.
예를 들어 $name 이라는 변수에 "백윤정" 이라는 문자열이 저장되어 있다면,

$str = "나의 이름은 $name입니다."; 라고 하였을 때

$str = "나의 이름은 백윤정입니다."; 와 같은 효과를 가지게 됩니다.

 

2. 작은 따옴표

'나는 문자열이다.' 와 같이 작은 따옴표 안에 문자열을 넣으면 됩니다.
작은 따옴표를 이용한 방법은 큰 따옴표를 이용할 때와 차이가 있는데,
작은 따옴표 내부에 쓰여진 특수문자와 변수가 허용되지 않는 다는 것입니다.

echo '작은 따옴표 안에서는\n 특수문자와 변수가 $name 동작을 안해요.';
의 결과는 작은 따옴표 안에서는\n 특수문자와 변수가 $name 동작을 안해요.

보여지는 그대로 출력됩니다.

 

3.상속 문법을 이용한 방법(히어닥 문법)

$str = <<<EOD
문자열이라네~
나도 문자열이라네~

EOD;

와 같은 방법으로 문자열을 표현하는 것으로 큰 따옴표와 동일한 기능을 하며 따옴표를 역슬래쉬없이
사용할 수 있다는 장점이 있습니다.

 

문자열의 연산

 

문자열을 연결하고자 할 때는 "." 기호를 사용합니다.

 

※ 문자열 연결 연산자는 . 만 가능하며 + 는 사용할수 없다.

+ 는 숫자 연산을 할때 사용합니다.

 

예제)

<?php
    $str = "문자열";
    $str = $str . " 좀더 붙여서..";
    $str = $str . " 나도 끼워줘~\n";

    echo $str . "<BR>";

    $num = 9;
    $str = "Number: $num";
    echo $str . "<BR>";
    $num = 9;
    $str = 'Number: $num';
    echo $str . "<BR>";
?>

 

여기서 잠깐
문자열을 표시할 때 큰따옴표를 이용하면 따옴표 내부에 있는 것들을 한번 확인하는 절차가 필요합니다.
안에 변수가 있는지 특수문자가 있는지 확인하는 것이죠.
이런 절차를 파싱이라고 하는데 큰따옴표의 경우 파싱이라는 절차가 더 있기 때문에 당연히
작은 따옴표를 이용하는 것이 더 빠를 수밖에 없습니다. 물론 미소한 차이지만요.
따라서 단순 문자열 즉, 변수나 특수기호를 포함하지 않는 문자열을 표현하실 때는
작은 따옴표식 방법을 이용하는게 더 좋습니다.

배열 사용하기(일차원 배열)

 

배열은 동일한 이름을 가진 변수에 한 개의 값을 저장하는 것이 아니라 여러 가지 변수값을
저장하기 위해 만든 변수의 집합입니다. 다음은 기본적인 배열 사용입니다.

 

배열 예제1

<?
    $a[0]="abc"
;
    $a[1] ="def"
;
    $b["foo"]=13
;
    echo $a[0].$a[1].$b["foo"];

    echo $a[0].$a[1].$b[foo];

    //$b[foo]와 $b["foo"]는 같습니다.하지만 $b["foo"]형식으로 쓰는게 좋습니다.

?>

 

위에서 보시다시피 배열은 $변수명[인덱스번호] 이런식의 형태입니다.
변수는 대부분 하나의 변수에 하나의 값을 갖는게 기본인데,
배열은 위처럼 a라는 변수에 abc 와 def를 모두 가질 수 있습니다.

하나의 변수에 여러개의 값을 가지다보니 그들을 구분할 수 있는 것이 필요하게 되었습니다.
그것이 바로 인덱스 번호입니다.
PHP에서는 0부터 시작하는 숫자형 인덱스(스칼라배열)와 foo와 같이 문자로 구분하는 문자형 인덱스(연관배열) 두가지가 있습니다.

$a[0]와 $a[1]는 각각 a라는 이름의 배열변수에서 첫 번째와 두 번째 값이라는 뜻입니다.

 

배열 예제2

<?
    $a[]="abc"
;
    $a[] ="def"
;

    $b["name1"]="junsik";

    $b["name2"]="younjung";

    ech count($a)." ".sizeof($b);
?>

 

위의 배열 $a에는 인덱스번호 없이 대입되었습니다.
이럴경우 php에서 자동으로 0부터 정해줍니다.
$a[]="abc";와 $a[] ="def";와 같이 인덱스번호 없이 대입되면 자동으로 php에서는 $a[0]에 "abc"를 넣고 $a[1]에 "def"을 넣어줍니다. 

하지만 문자형 인덱스는 인덱스 생략이 존재 하지 않습니다.

 

배열 예제3

<?

 $number1=array("11","22","33");//방법1

 $number2[0]="11";//방법2
 $number2[1]="22";
 $number2[2]="33";

 $number3 = array(0 => 11, 1 => 22, 2 => 33);//방법3

?>

 

배열변수에 값을 대입할때는 위의 3가지 방법이 있습니다.

방법1은 여러값을 한꺼번에 저장할때 사용하며 인덱스번호는 0부터 1씩 증가되며 생성됩니다.

방법2는 하나하나 대입할때 사용합니다.

방법3는 인덱스번호와 값을 자유롭게 지정하여 대입가능합니다.

보통 방법1과 방법2를 많이 사용합니다.

 

배열 예제4

<?
 $number[0]="11";
 $number[1]="22";
 $number[2]="33";
 $number[3]="33";
 $number[4]="33";

 echo max($number);
 echo "<br>";
 echo min($number);
 echo "<br>";
 echo array_sum($number);
 echo "<br>";
 echo count($number);
?>

 

$number배열 변수에 5개의 값을 대입합니다.

max()함수는 배열값에서 가장 큰수를 min()함수는 배열값에서
가장 작은수를 array_sum()함수는 배열값의 전체 합계를 count()함수는 배열의 갯수를 출력합니다.

 

배열 사용하기(다차원 배열)

 

PHP는 다차원 배열을 지원합니다.
다차원 배열이란 1차원적인 $a[0],$a[1] 같은 모양이 아니라 두가지 이상의 인덱스를 이용하여
값을 구분하는 $a[0][0] 이러한 모양의 배열을 말합니다.

그래서 다차원 배열은 일차원 배열보다 2배 이상 값을 담을수 있겠죠?

 

예를 들어 4x4 배열의 경우 아래와 같이 메모리에 저장이 됩니다.

$a[0][0]

$a[0][1]

$a[0][2]

$a[0][3]

$a[1][0]

$a[1][1]

$a[1][2]

$a[1][3]

$a[2][0]

$a[2][1]

$a[2][2]

$a[2][3]

$a[3][0]

$a[3][1]

$a[3][2]

$a[3][3]

 

예제

<?
    $name[0][0]="leejunsik";
    $name[0][1]="leejunsik";
    $name[0][2]="leejunsik";
    $name[0][3]="leejunsik";

    $name[1][0]="leejunsik1";
    $name[1][1]="leejunsik1";
    $name[1][2]="leejunsik1";
    $name[1][3]="leejunsik1";

echo count($name);

echo count($name[0]);

echo count($name[1]);

?>

 

그러면 우리 자기는 $a[0][0][0] 는 안되냐? 그럴껍니다. 당연히 됩니다.

인덱스가 3개니깐 3차원 배열이 됩니다.
하지만 실무에서는 보통 일차원 배열을 많이 사용하며 정말 복잡한 로직만 이차원 배열을 사용합니다.
왜냐하면 3차원 배열부터는 복잡해서 사용하기 어렵기 때문입니다.

 

객체(object) 사용하기

 

객체를 배우려면 OOP (object-oriented programming) 에 대해서 아셔야 합니다

우리말로 객체지향프로그래밍이라고 합니다.
객체지향프로그래밍은 모든 사물을 객체로 생각하는 것부터 시작합니다.

 

PHP는 버전 4부터 객체지향 프로그래밍을 60%지원합니다.

맨먼저 객체(object)는 메소드(기능)와 프로퍼티(속성)를 가집니다.
어떠한 사물이더라도 메소드와 프로퍼티를 가진 객체로 생각해보자라는 것입니다.

 

인간을 객체로 생각해 보겠습니다. 인간은 어떠한 메소드가 있을까요?

 

걷고 달리고 말하고 음식을 먹고 잠을 자고 등등  많은 메소드를 가집니다.
속성또한 이름,나이,주소 등등 수많은 속성들을 가집니다.

이러한 많은 메소드와 속성을 가진 것이 인간이다! 라고 인간을 정의하는 겁니다.

(여기서 정의한 인간이 class-클래스 입니다.)

 

class는 도장과 같습니다. 도장(class)을 만들었다면 이제부터는 찍어내기만 하면 됩니다.
인간이란 class로 찍어내면 철수니 영희니 돌쇠니 하는 사람들이 나오게 되는 것입니다.
이렇게 class를 통해 만들어진 철수를 객체(object)라고 하는 것입니다.

 

1.간단히 만든 인간 class예제

 

예제

<?
class Human //class라는 예약어로 선언을 합니다.

{  //인간 클래스를 정의 합니다.

        var $Name;//속성에는 var을 붙힙니다.
        var $Age;
        var $Height;
        var $Weight; 

        function Eat ( )

        {

        //먹는 행위를 메소드로 정의

        }
        function Walk ( )

        {

        //걷는 행위를 메소드로 정의

        }
        function Work ( )

        {

        //일하는 행위를 메소드로 정의

        }
        function Talk ( $words )

        {

        //말하는 행위를 메소드로 정의

        }
} //인간 클래스를 정의를 종료합니다.

 

    $철수 = new Human;

    //인간 클래스를 이용해 철수 객체를 생성
    $철수->Eat();

    // 먹는 행위를 메소드를 실행합니다.
    $철수->Talk($철수->$Age);

    // 말하는 행위를 메소드를 실행합니다. 인자도 보냅니다.

 

?>

 

객체를 생성한 후에 메소드나 프로퍼티에 접근하기 위해서는 "->" 와 같은 기호를 이용합니다.
$철수->Eat(); 와 $철수->Talk($철수->$Age);이 메소드에 접근하는 예입니다.

 

2.상속

 

객체지향 프로그래밍에는 상속이라는 것이 존재합니다.
상속은 기존에 정의한 클래스를 이용하여 이와 유사한 클래스를 새로 정의하고자 할 때 사용합니다.
아기는 인간의 한 형태이기 때문에 인간의 메소드와 속성을 모두 가집니다.
이말은 상속을 받음으로 해서 이미 있는건 다시 정의할 필요가 없다는겁니다.

그렇게 하면 소스의 양도 줄고 새로운 클래스도 만들수 있고 일석이조의 효과를 얻을수 있습니다.

 

예제

<?
class Baby Extends Human {  //인간 클래스를 상속받아 아기 클래스를 정의 합니다.
       
        function 모유먹기 ( ) { 모유를 먹는 행위를 함수로 정의 }
        function  천사와대화 () { 천사와 대화하는 행위를 함수로 정의 }
}   

    $재민 = new Baby; //아기 클래스를 이용해 재민이 객체를 생성
    $재민->천사와대화(); // 옹알~ 옹알~
?>

 

Extends 라는 키워드를 통해 상속을 받을 수 있습니다.

 

총정리 예제

<?

//인간 클래스
class human
{
 var $age;
 var $name;
 var $sex;

 function eat()
 {
  echo "밥을 먹습니다.";
 }
 function run()
 {
  echo "달리기를 합니다.";
 }
}

//아기 클래스
class baby extends human
{
 var $birthday;
 function angel_talk()
 {
  echo "천사와 대화하기";
 }
}


$byc=new baby;//아기 객체 생성
echo $byc->angel_talk();//아기객체로 메소드 실행
echo $byc->eat();//아기 객체로 인간에서 상속받은 메소드 실행
echo $byc->run();//아기 객체로 인간에서 상속받은 메소드 실행
?>

 

여기서 참고
객체지향프로그래밍은 대규모 프로젝트에 대한 배려속에서 태어났다고 해도 과언이 아닙니다.
최근 프로그래밍의 대세가 객체지향프로그래밍이지만 PHP에서 꼭 사용해야 하는 것은 아닙니다.
이 또한 하나의 프로그래밍 방식일 뿐입니다.
이 부분이 잘 이해가 안된다고 포기하지마시고 살짝쿵~ 무시해 버리세요.

 

널 (NULL)

 

NULL 은 無를 뜻합니다. 아무것도 없는 값을 나타내는 특별한 변수입니다.

나중에 차차 배우게 될겁니다.

 

변수형의 변환

 

만약에 우리가 지금까지 배운 7가지 Type을 자신이 원하는 다른 타입으로 바꾸고 싶을 때는 다음과
같은 방법으로 바꿀수 있습니다.

 

<?

$bar="1234";

$foo = (int) $bar

echo $foo;

?>

 

(int), (integer) - 정수형으로 변환

(real), (double), (float) - 실수형으로 변환

(string) - 문자열로 변환

(array) - 배열로 변환

(object) - 객체로 변환

 

여기서 잠깐
PHP에서는 변수 선언시 변수의 데이타형 선언이 필요 없습니다.

두 강좌에 걸쳐서 다양한 변수형을 배웠지만 특별한 경우를 제외하고 대부분의 경우는
PHP가 변수 대입시 자동으로 변수의 데이타형을 결정하게 됩니다.

그래서 어찌보면 위의 변수형의 변환이 의미가 없을수도 있습니다.