변수

상수는 프로그램에서 필요로 하는 고정된 값을 선언하여 사용합니다. 하지만 프로그램은 고정된 데이터뿐만 아니라 가변적인 수많은 데이터를 처리하고, 임시값을 저장하고, 다시 읽어서 처리합니다. 이러한 반복적인 일을 수행하기 위해서는 변수라는 메모리 공간이 필요합니다. 이렇게 프로그램이 실행하고 있는 도중에 값을 저장하는 메모리 공간을 변수라고 부릅니다. 프로그램은 상수보다는 대부분 변수의 값을 처리하는 역할을 수행합니다.

6.1 변수

변수는 어떠한 값을 갖고 있을 수 있는 데이터 상자와 같다고 생각할 수 있습니다. 즉, 데이터 상자 안은 비어 있을 수도 있고, 정수를 담을 수 있고, 실수도 담을 수 있고, 또 다른 다양한 특성의 데이터 자료를 담을 수 있습니다.

프로그램을 개발할 때는 여러 개의 변수를 선언하여 사용하게 됩니다. 하드웨어를 다루는 언어에서는 변수의 개수는 제한적일 수 있겠지만, high-level 언어에서는 시스템의 메모리 공간에 따라서 자유롭게 변수를 사용할 수 있습니다.

이처럼 변수들이 많아질수록 프로그램 안에서 구분할 수 있도록 각각의 변수에 이름을 부여해야 합니다. 하지만 변수의 이름을 부여하는 데 있어서 약간의 규칙이 존재합니다.

6.1.1 변수명을 만드는 규칙 PHP는 간단하게 i나 x, y처럼 1개의 철자로 만들 수도 있고 age, sex, company 등 우리가 쉽게 알 수 있는 문자열로 만들어서 사용할 수 있습니다.

• 변수는 반드시 변수명 앞에 $ 기호를 붙여야 합니다. • 변수명은 반드시 문자 또는 _ 기호로 시작해야 합니다. • 변수명은 숫자로 시작할 수 없습니다. • 변수명은 알파벳 글자와 숫자, _ 기호의 조합으로 만들 수 있습니다. • 변수명은 대소문자를 구분합니다. $age와 $AGE는 다른 값의 변수명입니다.

예제 파일 var-01.php <?php // PHP는 변수의 대소문자를 구분합니다. $age = “18”; $AGE = “20”;

echo "소문자 = ".$age."<br>";
echo "대문자 = ".$AGE."<br>"; ?>

결과 소문자 = 18 대문자 = 20

위의 예제에서 보듯이 PHP의 변수는 대소문자를 구분합니다. 소문자 $age 와 대문자 $AGE는 서로 다른 값이 있습니다. 출력 또한 서로 다른 값을 출력합니다.

6.1.2 변수와 메모리 [출처:구글 이미지, 비슷한 것으로 대체 요망]

PHP 언어는 변수의 사용에 대해서 엄격한 규칙을 적용하지 않습니다. PHP 스크립트를 실행 도중에 새로운 변수를 만날 면 동적으로 메모리와 변수를 관리합니다. 동일한 변수가 없을 경우 새로운 변수를 컴퓨터 메모리에 공간 할당합니다.

변수는 메모리 공간과 관련이 있습니다. 변수의 선언이 많을수록 컴퓨터의 메모리를 많이 할당받아 사용하게 됩니다. PHP는 이렇게 할당 받은 메모리는 사용 종료 후 직접 메모리 해제를 하거나 프로그램 실행이 종료되면 자동으로 메모리가 해제됩니다.

6.1.3 변수의 선언 PHP변수는 C 언어 등 다른 언어와 달리 프로그램 실행 초반에 사용하고자 하는 변수의 타입과 이름을 미리 선언하지 않아도 사용이 가능합니다. 유연하게 변수 사용이 가능합니다.

이런 점에서 PHP가 빠른 코딩과 유연한 개발 환경을 가지고 있다는 것은 커다란 장점일 수 있습니다.

PHP는 새로운 변수를 사용하고자 할 때 $변수명으로 적으면 바로 변수를 생성하여 코드에 적용할 수 있습니다.

예) $변수명

PHP는 변수 데이터 타입을 데이터에 기반하여 자동으로 설정합니다. PHP는 데이터 값이 대입 되면 관련된 적합한 데이터 타입이 선택되는 것입니다. 즉, 변수에 데이터를 삽입함과 동시에 데이터 형이 정의됩니다.

변수 사용 예) 예제파일 : var-02.php

위의 예제를 보면 $txt 는 “Hello world!”라는 문자열을 담고 있는 변수입니다. $x는 정수 5의 숫자 값을 담고 있는 변수입니다. $y 는 10.5 라는 실수 값을 갖고 있는 변수입니다.

6.1.4 변수의 데이터 형식 앞서 설명한 것과 같이 다른 언어 C나 C++, java 등의 언어는 변수를 선언할 때 미리 변수명과 변수의 타입을 지정합니다. 하지만 PHP는 다른 언어에 비해서 변수 선언이 자유롭다는 장점과 더불어 데이터 타입 또한 유연합니다.

위의 간단한 예를 보면은 변수를 사용하기 전에 각각의 변수들이 어떠한 데이터 값을 가지고 있는지 유형을 지정하지 않았습니다. PHP는 데이터를 사용할 때 그 데이터와 가장 잘 맞은 유형의 형식으로 자동적으로 변환해서 동작하기 때문에 다른 언어에서 데이터 타입의 불일치로 오류를 발생하는 것을 줄일 수 있습니다.

데이터는 프로그램 로직을 구분하거나, 데이터 값을 연산하고, 출력할 결과물을 저장하는 등 다양한 용도에 따라서 사용됩니다.

PHP에서는 다음과 같은 8가지 데이터 타입을 지원합니다:

• 문자열 • 정수 • 실수(소수점을 포함한 수) • 논리값 • 배열 • 객체 • NULL • 리소스

데이터 타입은 고급 프로그램을 개발하는 데 있어서 꼭 알아야 할 기본 개념입니다.

6.2 문자와 문자열

PHP는 변수의 타입을 문자 변수와 문자열 변수로 구분하지 않습니다. PHP는 모두 하나의 문자열 변수로 취급합니다. 하지만 C 언어와 같은 언어들은 문자와 문자열을 구별하여 처리하고 있습니다.

PHP가 문자와 문자열을 구별하지 않더라도 개념을 이해하고 적용하면 더 많은 다양한 문자열 작업을 할 수 있습니다.

6.2.1 문자 문자란 컴퓨터가 처리하는 1byte 단위로 ASCII 코드 타입의 글자를 말합니다. 우리가 알고 있는 A B C 등 알파벳 글자 한 글자 한 글자를 문자라고 합니다. 보통 문자는 단일 따옴표로 많이 작성합니다.

문자 아스키(ASCII) 코드 컴퓨터에서 인식하는 문자란 1byte로 표현할 수 있는 0~255의 값을 갖는 ASCII 코드입니다.

아스키 코드는 7비트 부호 체계로 컴퓨터에서 문자를 표현합니다. 00(0x00)부터 127(0x7F)까지 총 128개의 부호가 사용됩니다.

10진수 부호 10진수 부호 10진수 부호 10진수 부호 032 056 8 080 P 104 h 033 ! 057 9 081 Q 105 i 034 “ 058 : 082 R 106 j 035 # 059 ; 083 S 107 k 036 $ 060 < 084 T 108 l 037 % 061 = 085 U 109 m 038 & 062 > 086 V 110 n 039 ‘ 063 ? 087 W 111 o 040 ( 064 @ 088 X 112 p 041 ) 065 A 089 Y 113 q 042 * 066 B 090 Z 114 r 043 + 067 C 091 [ 115 s 044 , 068 D 092 \ 116 t 045 - 069 E 093 ] 117 u 046 . 070 F 094 ^ 118 v 047 / 071 G 095 _ 119 w 048 0 072 H 096 ` 120 x 049 1 073 I 097 a 121 y 050 2 074 J 098 b 122 z 051 3 075 K 099 c 123 { 052 4 076 L 100 d 124 | 053 5 077 M 101 e 125 } 054 6 078 N 102 f 126 ~ 055 7 079 O 103 g

기본적으로 1바이트(8비트)에서 7비트는 정보를 표시하고 1비트는 에러 검출입니다. 에러 검출은 패리티 비트(parity Bit)라고도 합니다. 패리티 비트는 데이터 전송 시 오류 발생 여부를 체크합니다. 1의 개수가 홀수면 1을, 짝수면 0으로 표시합니다.

6.2.2 문자열 문자열은 말 그대로 문자들의 집합입니다. 여러 개의 문자들이 결합하여 문자열이 되는 것입니다.

C 언어에서는 문자열을 배열과 같은 개념으로 생각합니다. 동일한 문자열 변수의 이름을 가지고 있지만 한 글자씩 가지고 있는 변수(메모리)들의 집합으로 보는 것입니다. 보통 문자열은 이중 따옴표로 많이 작성을 합니다.

6.2.2 문자열 생성 PHP에서 문자열을 생성, 저장하는 것은 매우 쉽습니다. 그냥 $ 변수명에 큰따옴표(“) 또는 작은따옴표(‘)로 묶어서 대입해주면 됩니다. PHP 언어는 문자와 문자열을 구분하지 않기 때문에 두 가지 모두 사용이 가능합니다.

|문자열| $name1 = “Hello world!”; $name2 = ‘php world!’;

PHP 언어가 C 언어와 달리 문자와 문자열을 구분하지 않고, 문자 배열을 사전에 정의하지 않아도 된다는 것은 프로그램 동작 시 발생하는 데이터 타입 불일치 오류를 줄여줄 수 있는 강점입니다.

예제 파일 string-01.php <?php // 문자열 변수를 생성합니다. $name = “Hello world!”;

// 저장된 문자열을 화면에 출력합니다. echo $name; ?>

결과 Hello world! PHP는 문자열을 표시하는 데 있어서 큰따옴표(“)와 작은따옴표(‘)를 모두 사용할 수 있습니다. 작은따옴표(‘)는 큰따옴표(“) 안에 문자로 표시할 수 있습니다.

예제 파일 string-02.php <?php // 문자열 변수를 생성합니다. // 작은따옴표는 큰따옴표 안에 들어갈 수 있습니다. $name = “Hello ‘PHP’ world!”;

// 저장된 문자열을 화면에 출력합니다.
echo $name; ?>

결과 Hello ‘PHP’ world!

위의 예제는 $name 변수에 문자열을 저장 후에 값을 출력합니다.

6.2.3 문자열 배열 문자열은 문자들의 집합입니다. 여러 개의 문자들이 집합되어 있는 배열과도 같습니다. 문자열은 indexed된 배열처럼 접근하여 값을 사용할 수 있습니다.

다음 예제는 문자열을 배열 형태로 접근하고 처리하는 예입니다.

예제 파일 string-03.php <?php // 문자열 변수를 생성합니다. $name = “Hello world!”;

for($i=0;$i<strlen($name);$i++){ // 한 글자씩 출력합니다. echo “i = $i , “ . $name[$i] . “
”; }

?>

결과 i = 0 , H i = 1 , e i = 2 , l i = 3 , l i = 4 , o i = 5 , i = 6 , w i = 7 , o i = 8 , r i = 9 , l i = 10 , d i = 11 , !

$ 문자열 변수명 뒤에 배열 기호 [ ]를 통해 한 글자 한 글자씩 접근할 수 있습니다.

6.2.4 문자열 판별 생성한 변수의 타입이 문자열인지를 확인할 수 있습니다. is_string() 내부 함수는 입력되는 변수의 타입이 문자열인지를 판별하여 논리값으로 반환합니다.

|관련함수| bool is_string ( mixed $var )

예제 파일 string-04.php "; } ?>

결과 is_string(false) = bool(false) is_string(true) = bool(false) is_string(NULL) = bool(false) is_string(‘abc’) = bool(true) is_string(‘23’) = bool(true) is_string(23) = bool(false) is_string(‘23.5’) = bool(true) is_string(23.5) = bool(false) is_string(‘’) = bool(true) is_string(‘ ‘) = bool(true) is_string(‘0’) = bool(true) is_string(0) = bool(false)

위의 예제는 문자열 변수 타입을 체크하는 예입니다. 향후에 함수에 대해서 구체적으로 알아보겠지만 $values 안에 있는 여러 개의 데이터 값 중에서 문자열만 비교 판단을 합니다.

6.2.5 특수문자 문자 중에는 특수문자라는 것이 있습니다. 브라우저 이외에 콘솔 등 text 형태로 자료를 출력할 때 특수문자를 같이 이용할 때 좀 더 보기 좋은 문서를 만들 수 있습니다.

\n :개행문자

\r :캐리지 리턴

\t :탭

\f :폼피드

\b :백스페이스

\a :경고음

\e :esc문자

\ :역슬래시

6.2.6 문자열 변수 출력 문자열 변수를 출력 문자열 안에 넣으면 출력 함수는 문자열의 내용과 문자열 변수의 내용을 같이 출력합니다. 하지만 변수를 작은따옴표로 감싸서 출력하면 변수명을 직접 출력할 수 있습니다.

예제 파일 string-05.php <?php $a = “hello world!”;

// 문자열 변수 출력
print $a;
echo "<br>";

// 큰따옴표 안에 넣은 경우에도 변수 내용이 출력됩니다.
print "$a";
echo "<br>";

// 변수명을 출력하는 방법, 작은따옴표를 사용합니다.
print '$a';

?>

결과 hello world! hello world! $a

문자열을 사용할 때는 큰따옴표와 작은따옴표를 잘 구분하여 작성해야 합니다. PHP에서는 상황별로 다르게 인식하기 때문입니다.

6.3 정수형

정수는 소수점을 포함하지 않은 숫자를 말합니다.

6.3.1 정수의 정의 정수는 소수점을 포함하지 않기 때문에 컴퓨터 비트 환경에 따라 다르지만 최상의 부호 비트를 제외한 모든 비트를 이진법의 수로 표현합니다.

정수의 정의 ● 정수는 최소한 한 개의 숫자를 넘어야 합니다. ● 정수는 소수점을 포함하지 않습니다. ● 정수는 양수 또는 음수가 될 수도 있습니다. ● 정수는 세 가지 타입으로 표현할 수 있습니다. 10진법, 16진법 헥사 방식, 8진법으로 표현할 수 있습니다. 또한 비트 단위로 비트 연산이 가능한 타입니다.

10진법 표현은 기본적으로 우리가 사용하는 숫자를 입력하면 됩니다.

$a = 5; $b =123; $c = 777;

정수가 표현할 수 있는 값은 16bit, 32bit, 64bit 환경에 따라 다릅니다.

6.3.2 singed VS unsigned 정수는 양의 수와 음의 수로 변수의 최상의 부호 비트를 이용하여 수의 범위를 정의합니다. 따라서 정수는 -2,147,483,648 ~ 2,147,483,647의 사이 값을 갖게 됩니다.

singed란 정수의 부호 비트를 이용한 양수/음수 모두를 포함하고 있는 타입이라고 생각하면 됩니다. unsigned는 정수의 부호 비트를 사용하지 않고 모두 양의 수로 값을 처리하는 방식입니다. unsigned는 signed보다 두 배 더 많은 수를 표현할 수 있습니다.

6.3.3 정수변수 정수변수는 $변수명 뒤에 정수를 대입하면 됩니다.

예제 파일 int-01.php

결과 int(5985)

6.3.4 정수 확인 PHP는 생성한 변수가 정수변수를 확인할 수 있는 is_int()이라는 내부 함수를 제공합니다.

|관련함수| bool is_object ( mixed $var )

매개변수 값으로 변수를 전달하면 변수의 오브젝트 타입 여부를 논리값 형태로 반환합니다.

예제 파일 int-02.php <?php $values = array(23, “23”, 23.5, “23.5”, null, true, false); foreach ($values as $value) { echo “is_int(“; var_export($value); echo “) = “; var_dump(is_int($value));

echo "<br>"; } ?> 

결과 is_int(23) = bool(true) is_int(‘23’) = bool(false) is_int(23.5) = bool(false) is_int(‘23.5’) = bool(false) is_int(NULL) = bool(false) is_int(true) = bool(false) is_int(false) = bool(false)

위의 예제는 나열된 값들이 정수형 자료인지를 판별합니다.

예제 파일 int-03.php

결과 정수입니다.

6.3.5 2진수(정수) 정수는 컴퓨터의 기본 숫자 표현 값인 2진수로 값을 저장하고 출력할 수 있습니다.

2진법은 0b 로 시작하며, 0과 1로 표현을 합니다. PHP에서는 2진법으로 변수에 저장을 하기 위해서는 숫자앞에 0b를 같이 적어 줍니다. |문법| $a = 0b00000001; $b = 0b11111111;

예제 파일 int-04.php <?php // 2진법으로 변수에 값을 저장합니다. // 2진법은 0b로 시작합니다. $a = 0b00000001; $b = 0b11111111;

// 2진수를 8bit 형태로 출력합니다.
printf("2진법 : a = %08b, b= %08b <br>",$a, $b);
printf("10진법 : a = %d, b= %d <br>",$a, $b);

// 2진수 => 10진수 변환
echo "2진수(0b11111111) => 10진수(".bindec("0b11111111").")<br>";

// 10진수 => 2진수 변환
echo "10진수(8) => 2진수(".decbin("8").")<br>";  ?>

결과 2진법 : a = 00000001, b= 11111111 10진법 : a = 1, b= 255 2진수(0b11111111) => 10진수(255) 10진수(8) => 2진수(1000)

관련함수) 2진수를 10진수로 변환합니다. number bindec ( string $binary_string )

bindec() 함수는2진수 문자열을 입력하면 10진수 숫자값을 반환합니다.

관련함수) 10진수를 2진수로 변환합니다. string decbin ( int $number )

decbin() 함수는 입력값으로 10진수 숫자값을 입력시 16진수 문자열을 반환합니다.

6.3.5 8진수(정수) 정수는 8진수로 값을 표현할 수 있습니다.

8진법은 0~7까지의 숫자로 표현한 값을 말합니다. PHP에서는 8진법으로 변수에 저장을 하기 위해서는 숫자앞에 0을 하나더 적어 줍니다.

|문법| $a = 0123; //10진수로 83 $b = 010; // 10진수로 8

예제 파일 int-05.php <?php // 8진법으로 변수에 값을 저장합니다. // 8진법은 0로 시작합니다. $a = 0123; //10진수로 83 $b = 010; // 10진수로 8

// 2진수를 8bit 형태로 출력합니다.
printf("8진법 : a = %o, b= %o <br>",$a, $b);
printf("10진법 : a = %d, b= %d <br>",$a, $b);

// 8진수 => 10진수 변환
echo "8진수(123) => 10진수(".octdec("123").")<br>";

//10진수 => 8진수 변환
echo "10진수(8) => 8진수(".decoct("8").")<br>"; 

?>

결과 8진법 : a = 123, b= 10 10진법 : a = 83, b= 8 8진수(123) => 10진수(83) 10진수(8) => 8진수(10)

관련함수) 10진수를 8진수로 변환합니다.

string decoct ( int $number )

decoct() 함수는 입력값으로 10진수 숫자값을 입력시 8진수 문자열을 반환합니다.

관련함수) 8진수를 10진수로 변환합니다. number octdec ( string $octal_string )

octdec() 함수는 8진수 문자열을 입력하면 10진수 숫자값을 반환합니다.

6.3.6 16진수(정수) 정수는 헥사 값인 16진수로 값으로 표현할 수 있습니다.

16진법은 0~9, A~F 의 값을 가집니다. PHP에서는 16진법으로 변수에 저장을 하기 위해서는 숫자 앞에 0x를 같이 적어 줍니다.

|문법| $a = 0x01; $b = 0xa8; $b = 0xff;

예제 파일 int-06.php <?php // 16진법으로 변수에 값을 저장합니다. // 16진법은 0x로 시작합니다. $a = 0x01; $b = 0xa8; $b = 0xff;

// 2진수를 8bit 형태로 출력합니다.
printf("16진법 : a = %x, b= %x, c= %x <br>",$a, $b, $c);
printf("10진법 : a = %d, b= %d, c= %d <br>",$a, $b, $c);

// 16진수 => 10진수 변환
echo "16진수(a8) => 10진수(".hexdec("a8").")<br>";

//10진수 => 16진수 변환
echo "10진수(255) => 16진수(".dechex(255).")<br>"; 

?>

결과 16진법 : a = 1, b= ff, c= 0 10진법 : a = 1, b= 255, c= 0 16진수(a8) => 10진수(168) 10진수(255) => 16진수(ff)

|관련함수| 16진수를 10진수로 변환합니다. number hexdec ( string $hex_string )

hexdec() 함수는 16진수 문자열을 입력하면 10진수 숫자값을 반환합니다.

|관련함수| 10진수를 16진수로 변환합니다. string dechex ( int $number )

dechex() 함수는 입력값으로 10진수 숫자값을 입력시 16진수 문자열을 반환합니다.

6.4 실수형 실수는 정수의 개념보다 한단계 더 큰 수학적 개념입니다. 실수는 정수와 달리 소수점을 포함하여 큰 수의 값을 표현할 수 있습니다. 또는 지수로 표기된 실수 값을 말합니다.

6.4.1 실수 데이터 실수는 정수와 달리 데이터를 표현하는데 있어서 변수의 bit를 모두 숫자로 표현을 하지 않습니다. 숫자 부분과 지수를 표현하는 부분으로 나누어 처리합니다.

또한 실수는 컴퓨터의 표현의 제한으로 큰 수의 경우 숫자의 정밀도는 제한적일 수 있습니다. 큰 수를 사용하기 위해서 별도의 알고리즘이 필요로 합니다. PHP는 IEEE 754 형식을 따라 부동 소수점을 표현합니다.

IEEE 754는 1.11e-16의 반올림으로 인해 최대 상대 오차가 발생할 수 있습니다. 기본이 아닌 산술 연산은 더 큰 오류가 발생할 수 있습니다. 물론 여러 작업이 혼합 될 때 오류를 고려해야 연산을 해야 합니다.

또한 기수 10의 부동 소수점 숫자로 정확하게 표현할 수 있는 유리수 (예 : 0.1 또는 0.7)는 가수의 크기에 관계없이 내부적으로 사용되는 2 진수의 부동 소수점 숫자와 정확히 일치하지 않습니다.

따라서 정밀도를 잃지 않고 내부 바이너리로 변환 할 수 없습니다. 예를 들어 floor ((0.1 + 0.7) * 10)는 내부 표현이 7.999999999999911181과 같기 때문에 일반적으로 예상되는 8 대신 7을 반환합니다.

실수는 시스템 환경에 따라 표현을 할 수 있는 수는 차이가 있습니다. 64bit 환경에서 최대 표현 값은 ~1.8e308 입니다.

6.4.2 실수 변수 실수 변수는 $변수에 실수 값을 대입하는 것으로 쉽게 저장을 할 수 있습니다.

|문법| $a = 1.234; $b = 1.2e3; $c = 7E-10;

다음 예제는 실수변수를 화면에 출력하는 예제 입니다.

예제 파일 float-01.php

결과화면) float(10.365)

다은 예제는 각도의 라디안 값 계산하는 실수형 예제 입니다.

예제 파일 float-02.php <?php const PI = 3.14;

$deg = 30;
$rad = $deg * PI / 180.0;
printf("DEG = %d, RAD = %f", $deg, $rad); ?>

결과화면) DEG = 30, RAD = 0.523333

6.4.3 실수 확인 PHP는 생성한 변수가 실수변수를 확인할 수 있는 is_float()이라는 내부함수를 제공합니다. |관련함수| bool is_float ( mixed $var )

매개변수값으로 변수를 전달하면 변수의 오브젝트 타입 여부를 논리값 형태로 반환합니다.

예제 파일 float-03.php

결과 bool(true) bool(false) bool(false) bool(true) bool(true) bool(false)

위의 예제는 나열된 데이터들이 실수형 데이터 타입인지를 확인하는 예입니다.

6.4.4 실수 형변환 PHP에서는 변수에 실수 값을 저장할 때 변수의 타입은 실수형이 됩니다.

형변환이라는 것은 변수에 값을 입력할 때 값 앞에 변수의 형태를 미리 지정하여 저장하는 방법입니다.

예제 파일 float-04.php <?php // 실수값을 입력하면 변수는 실수 입니다. $pi = 3.14; var_dump( $pi ); echo “pi = $pi
”;

// 정수로 형변환 합니다.
$a = (int)5.14;
var_dump( $a );
echo "a = $a<br>";

// 더블형으로 형변환 합니다.
$b = (double)3.14;
var_dump( $b );
echo "b = $b<br>";

// 문자열로 형현환 합니다.
$b = (string)3.14;
var_dump( $b );
echo "b = $b<br>"; ?> 

결과 float(3.14) pi = 3.14 int(5) a = 5 float(3.14) b = 3.14 string(4) “3.14” b = 3.14

위의 예제는 형변환을 실험하는 예입니다. 형변환을 키워드를 이용하여 데이터의 값의 형을 바꿀 수 있습니다.

6.4.5 소수점 처리 실수형 수는 소수점을 포함하고 있습니다. 소수점이 있을 경우 버림, 올림, 반올림 내장 함수를 통해 계산할 수 있습니다.

|관련함수| 소수점 이하 올림 float ceil ( 실수값 )

ceil() 함수는 입력된 실수값의 소수점 이하를 올림 처리한 값을 반환합니다.

|관련함수| 소수점 이하 버림 mixed floor ( 실수값 )

floor() 함수는 입력된 실수값의 소수점 이하를 버림 처리한 값을 반환합니다.

|관련함수| 소수점 이하 반올림 float round (실수값, 자릿수)

round() 함수는 입력된 실수값의 이하 반올림 처리한 값을 반환합니다.

예제 파일 float-05.php <?php // 올림 echo ceil(4.3); // 5 echo ceil(9.999); // 10 echo ceil(-3.14); // -3

// 버림
echo floor(4.3)."<br>";   // 4
echo floor(9.999)."<br>"; // 9
echo floor(-3.14)."<br>"; // -4

// 반올림 처리
echo round(3.4)."<br>";         // 3
echo round(3.5)."<br>";         // 4
echo round(3.6)."<br>";         // 4
echo round(3.6, 0)."<br>";      // 4

// 소수점 자리 반올림
echo round(1.95583, 2)."<br>";  // 1.96
echo round(5.045, 2)."<br>";    // 5.05
echo round(5.055, 2)."<br>";    // 5.06

// 소수점 위3자리에서 반올림
echo round(1241757, -3)."<br>"; // 1242000

?>

결과 510-34 9 -4 3 4 4 4 1.96 5.05 5.06 1242000

위의 예제는 실수의 버림, 올림, 반올림에 대한 처리 예입니다.

6.5 논리변수 불린(Boolean)이라고 부르는 변수형 타입은 논리형 변수라고도 합니다. 주로 수학적의미로 참과 거짓을 표기합니다. 또는 1과 0의 숫자값으로 표현하기도 합니다. 하지만 요즘은 숫자값 대신 상수를 이용하여 true, false 기호를 많이 사용합니다.

논리변수를 불린이라고 부르는 이유는 영국의 수학자 겸 논리학자인 조지 불(George Boole) 이름에 서 유래한 것입니다.

논리변수는 조건문, 반복문 등 어떠한 처리 결과의 성공 여부를 확인하거나, 반환하는 값으로 가장 많이 사용하는 변수 타입 중 하나입니다. 따라서 논리변수의 개념은 반드시 숙지하고 넘어가야 합니다.

6.5.1 0 과 1 컴퓨터는 수많은 트랜지스터의 집합으로 표현을 합니다. 전기가 통하고 있는 상태 1과 전기가 단절된 상태 0 으로만 표현이 됩니다.

따라서, 컴퓨터는 우리가 일반적으로 사용하는 10진법의 수학을 표현하지 않고, 2진법 형태로 모든 데이터와 처리를 반복합니다.

6.5.2 논리변수 출현 기존 언어에서는 변수에 논리값을 숫자 0 또는 1의 값을 넣어서 판별을 하거나, 변수의 비트값을 연산하여 처리하였습니다.

0과 1의 표현은 사람이 직관적으로 쉽게 알아보기는 어렵습니다. 그래서,

|표현| 0 = false (거짓) 1 = true (참)

이라고 변수에 문자열로 ‘true’ 또는 ‘false’로 저장하여 문자열로 판별했습니다. 하지만 문자열을 통해 처리하는 것은 문자 수만큼의 메모리가 필요합니다. 따라서 논리변수 타입의 변수와 대입하는 값은 상수값처럼 TRUE, FALSE로 입력하여 처리합니다.

6.5.3 논리변수 생성 논리변수를 만드는 것은 간단합니다. $변수명 뒤에 논리 상수명을 적어주면 됩니다.

|문법| $x = true; $y = false;

논리값은 소문자/대문자를 구분하지 않습니다.

예제 파일 bool-01.php <?php $a = true; If ($a) { echo “a = true(참) 입니다.”; } else { echo “a = false(거짓) 입니다.”; }

echo "<br>";

$b = TRUE;
If ($b) {
	echo "b = true(참) 입니다.";
} else {
	echo "b = false(거짓) 입니다.";
}

echo "<br>";

$c = false;
If ($c) {
	echo "c = true(참) 입니다.";
} else {
	echo "c = false(거짓) 입니다.";
}

echo "<br>";

$d = FALSE;
If ($d) {
	echo "d = true(참) 입니다.";
} else {
	echo "d = false(거짓) 입니다.";
}

echo "<br>"; ?>

결과 a = true(참) 입니다. b = true(참) 입니다. c = false(거짓) 입니다. d = false(거짓) 입니다.

6.5.4 논리변수 확인 PHP는 생성한 변수가 논리변수를 확인할 수 있는 is_bool()이라는 내부함수를 제공합니다.

|관련함수| bool is_bool ( mixed $var )

매개변수 값으로 변수를 전달하면 변수의 논리 타입 여부를 논리값 형태로 반환합니다.

사용예 bool-02.php <?php $a = false; $b = 0;

// 논리값으로 쓰여진 변수인지를 확인합니다. if (is_bool($a) === true) { echo “a는 논리 변수 입니다.”; }

echo “
”;

// $b는 정수 0 입니다. 논리 변수가 아니라서 false 를 반환합니다. if (is_bool($b) === false) { echo “b는 논리 변수가 아닙니다.
”; var_dump($b); }

?>

결과 a는 논리 변수 입니다. b는 논리 변수가 아닙니다. int(0)

위의 예제는 변수값의 논리 타입 여부를 확인하는 예입니다.

6.6 배열 어레이 기존 모든 변수는 하나의 데이터 값을 가지고 있습니다. 배열이란? 이름 그대로 하나의 변수에 다수의 데이터를 가질 수 있는 특수한 변수 입니다.

6.6.1 배열의 개념 배열의 개념은 C 언어와 같은 언어를 참조하여 이해하면 더 쉽습니다. 실제적으로 배열은 여러 개의 변수들의 집합을 가리키는 포인터와 같습니다. 변수의 이름만 같은 여러 변수들을 묶어서 생성하고, 각각의 변수에 번호를 부여하여 사용을 하는 개념입니다.

PHP는 다양한 형태의 배열을 지원합니다.

● Indexed arrays 인덱스 배열이라고 해서 기존 전형적인 배열의 표현입니다. 배열의 각각의 데이터를 숫자 인덱스를 통하여 가리킵니다.

● Associative arrays 기존 숫자형 인텍스 키 대신에 각각이 이름 키를 이용하여, 각각의 데이터에 접근을 할 수 있습니다.

● Multidimensional arrays 다차원 배열로 하나의 각각의 데이터는 또 다른 배열을 담고 있는 배열변수가 될 수 있습니다.

6.6.2 배열 생성 배열 변수는 array() 함수를 이용하여 변수 선언과 동시에 초기값을 설정할 수 있습니다.

$변수명 = array(데이터1, 데이터2, 데이터3);

array() 변수는 다양한 값을 콤마(,)로 구분하여 배열변수의 초기값을 설정할 수 있습니다.

이렇게 생성된 배열은 기본적으로 indexed array 속성을 가집니다. indexed array는 $변수명 뒤에 배열 [번호] 형태로 접근할 수 있습니다.

항상 indexed array의 index값은 0부터 시작합니다.

예제 파일 array-01.php

결과 I like Volvo, BMW and Toyota.

위의 예는 $cars 변수에 array() 함수를 통하여 3개의 값으로 초기화 하였습니다. $cars 는 indexed array 속성을 가지고 있습니다. 각각의 배열의 데이터는 $cars 변수명 뒤에 배열기호 [ ]를 통하여 번호로 접근할 수 있습니다.

$cars[0] => “Volvo” $cars[1] => “BMW” $cars[2] => “Toyota”

배열은 이름은 동일하지만 [ ] 를 통하여 각각이 접근할 수 있습니다. indexed 배열은 항상 0부터 시작합니다.

6.6.3 Indexed Arrays

배열 생성 시 array() 내부함수를 이용하여 일괄적으로 초기할 할 수도 있지만 index 값을 통하여 개별로 하나씩 설정을 할 수도 있습니다.

예제 파일 array-02.php

결과 I like Kia, BMW and Toyota.

즉 처음에 배열을 선언하지 않고 변수명 뒤에 [ ]를 통해 배열화로 만들어 저장할 수 있습니다.

indexed 형태의 배열은 반복문을 통하여 처리하기에 매우 편리합니다. index 값이 일정한 숫자 형태로 처리되기 때문입니다.

예제 파일 array-03.php "; } ?>

결과 array0 array1 array2 array3 array4

6.6.3 연상(Associative) 배열 indexed 방식은 편리하나 각각의 값을 직관적으로 알기는 어렵습니다.

PHP 배열의 두 번째 형태인 연상 키워드를 이용한 배열입니다. PHP는 배열을 처리하는 데 쉽게 배열 키를 인지할 수 있도록 숫자 대신에 이름 키를 부여할 수 있습니다.

연상 배열 또한 배열을 생성 및 초기화 하는 방식으로 array()함수를 사용할 수 있습니다. 이전 indexed array와의 차이점이라면 배열 값을 입력 시 “이름”=> 형태가 추가 되는 것입니다.

$변수명 = array(“이름”=>”데이터1”,“이름”=>”데이터2”, “이름”=>”데이터3”);

또는

$age[‘Peter’] = “35”; $age[‘Ben’] = “37”; $age[‘Joe’] = “43”;

형태로 직접 이름 키를 생성하면서 배열을 만들 수 있습니다.

예제 파일 array-04.php "44", "Ben"=>"37", "Joe"=>"43"); echo "Jiny is " . $age['Jiny'] . " years old."; ?>

결과 Jiny is 44 years old.

다음은 연상 배열을 이름 키 값을 통해 foreach 반복문을 이용하여 이름과 값을 출력하는 예입니다.

예제 파일 array-05.php <?php $age = array(“Peter”=>”40”, “joy”=>”35”, “jiny”=>”43”);

Foreach ($age as $x => $x_value) { echo “Key=” . $x . “, Value=” . $x_value; echo “
”; } ?>

결과 Key=Peter, Value=40 Key=joy, Value=35 Key=jiny, Value=43

6.6.3 다차원(Multidimensional) 배열

지금까지 배열은 1차원적인 배열에 대해서 설명을 하였습니다.

실상황적으로는 1차원적인 데이터 보다는 가로, 세로 표처럼 2차원적인 데이터, 다수의 데이터 그룹이나 수학적 처리로 3차원 데이터의 처리도 필요할 것입니다.

다차원 배열이란 하나의 배열 값이 또 다른 배열을 가지고 있는 중복된 배열 구조를 말합니다.

● 1차원 배열은 변수명 뒤에 1개의 [ ] 배열 기호가 표시됩니다. ● 2차원 배열은 변수명 뒤에 2개의 [ ][ ] 배열 기호가 표시됩니다. ● 3차원 배열은 변수명 뒤에 3개의 [ ][ ][ ] 배열 기호가 표시됩니다.

이처럼 변수명 뒤에 배열 기호 [ ]를 중복하여 다차원 배열을 접근할 수 있습니다.

다음과 같은 표를 이차원 배열로 생성해 볼 수 있습니다.

브랜드 재고수량 판매수량 Volvo 10 300 BMW 11 250 Saab 12 350 kia 13 200

표는 가로 * 세로 형태의 이차원적인 배열 타입을 가지고 있습니다. 예제 파일 array-06.php

"; echo $cars[1][0].": In stock: ".$cars[1][1].", sold: ".$cars[1][2].".
"; echo $cars[2][0].": In stock: ".$cars[2][1].", sold: ".$cars[2][2].".
"; echo $cars[3][0].": In stock: ".$cars[3][1].", sold: ".$cars[3][2].".
"; ?>

결과 Volvo: In stock: 10, sold: 300. BMW: In stock: 11, sold: 250. Saab: In stock: 12, sold: 350. kia: In stock: 13, sold: 200.

이중 반복문을 통하여 다차원 배열을 처리할 수 있습니다. 예제 파일 array-07.php

Row number $row

"; echo "
    "; for ($col = 0; $col < 3; $col++) { echo "
  • ".$cars[$row][$col]."
  • "; } echo "
"; } ?>

결과 Row number 0 ● Volvo ● 10 ● 300 Row number 1 ● BMW ● 11 ● 250 Row number 2 ● Saab ● 12 ● 350 Row number 3 ● kia ● 13 ● 200

6.6.4 배열 확인

PHP는 생성한 변수가 배열변수를 확인할 수 있는 is_array()이라는 내부함수를 제공합니다.

|관련함수| bool is_array ( mixed $var )

매개변수 인자값으로 변수를 전달하면, 변수의 배열 타입 여부를 논리값 형태로 반환합니다.

예제 파일 array-08.php

결과 Array not an Array

6.7 오브젝트

오브젝트는 객체를 담을 수 있는 변수타입 입니다.

객체는 데이터와 데이터 프로세스를 처리할 수 있는 함수등을 말합니다. 대표적으로 객체라고 하면 클래스를 말할 수 있습니다.

6.7.1 객체 저장

변수를 객체로 설정하는 방법은 객체생성 키워드 또는 객체 변수를 대입을 하면 됩니다. 다음은 클래스 객체의 인스턴스를 생성하여 새로운 객체 변수를 생성합니다.

예제 파일 obj-01.php <?php class Car { function Car() { $this->model = “Grandure”; } }

// 객체 인스턴스를 생성하는 변수 $hyndai = new Car();

// 객체의 프로퍼티를 출력합니다. echo $hyndai->model;

?>

결과 Grandure

오브젝트 변수타입은 향후 객체지향 코딩을 할때 가장 많이 사용하는 변수 타입입니다.

6.7.2 객체 확인

PHP는 생성한 변수가 객체변수를 확인할 수 있는 is_object()이라는 내부함수를 제공합니다. |관련함수| bool is_object ( mixed $var )

매개변수 인자값으로 변수를 전달하면 변수의 오브젝트 타입 여부를 논리값 형태로 반환합니다.

예제 파일 obj-02.php

결과 객체입니다.

6.8 NULL 값

NULL은 프로그램에서 특수한 유형의 데이터입니다.

6.8.1 개념

NULL이란 변수에 어떠한 값도 설정되어 있지 않는 비어 있는 타입입니다. 또한 NULL은 공백(“”)과도 다른 의미입니다

변수를 NULL로 설정하고 싶다면 특수 키워드 null을 대입하면 됩니다.

|문법| $변수명 = null;

예제 파일 null-01.php <?php // $x변수에는 Hello world! 문자열이 저장되어 있습니다. $x = “Hello world!”; echo $x;

echo "<br>";
echo "=====";
echo "<br>";

// $x 변수에 null값을 선언합니다.
$x = null;
var_dump($x); ?>

PHP에서는 변수를 생성하고 데이터 값을 할당하지 않은 경우에는 기본적으로 NULL 로 설정됩니다.

예제 파일 null-02.php

6.8.2 NULL 확인 PHP는 생성한 변수가 NULL인지를 확인할 수 있는 is_null()이라는 내부 함수를 제공합니다.

|관련함수| bool is_null ( mixed $var )

is_null() 함수는 변수의 NULL 여부를 확인하여 논리값으로 결과를 반환합니다.

예제 파일 null-03.php <?php $x; If (is_null($x)) { echo “x = NULL입니다.”; } else { echo “x = NULL이 아닙니다.”; }

echo "<br>";

var_dump($x); ?>

결과 x = NULL입니다. NULL

6.8.3 NULL 연산자 NULL 값을 가진 변수는 경우에 따라서 프로그램의 오류의 원인이 되기도 합니다. 따라서 기존 is_null() 함수로 단순히 변수가 NULL 여부를 확인하는 것으로는 부족합니다.

NULL 변수인 경우에는 초기값을 설정해야 안전합니다.

PHP 7.x부터 새로운 NULL 연산자가 도입되었습니다.

|문법| $username = $_POST[‘user’] ?? ‘nobody’;

위의 새로운 연산자 ??는 만일 변수의 값이 있으면 변수의 값을 대입하고, NULL인 경우에는 ‘nobody’를 대입하는 예입니다.

예제 파일 null-04.php <?php

$x;

if (is_null($x)) { echo “x = NULL입니다.”; } else { echo “x = NULL이 아닙니다.”; }

echo “
”;

$username = $x ?? ‘nobody’; echo “username = $username”;

?>

결과 x = NULL입니다. username = nobody

?? 연산자의 특성 ?? 연산자는 기존 isset() 함수와 is_null() 함수로 두 가지 상태 모두를 체크하는 것과 비슷합니다.

PHP 7.x 이전의 버전을 사용하고 있다면 ?? 연산자를 다음과 같이 함수 형태로 만들어서 사용할 수 도 있습니다.

예제 파일 null-05.php <?php function _coalescing($var, $default){ if (isset($var)) { if ($var == NULL) { return $var; } else { return $default; } } else { return $default; } }

$x;
if (is_null($x)) {
	echo "x = NULL입니다.";
} else {
	echo "x = NULL이 아닙니다.";
}

echo "<br>";

$username = _coalescing($x,"nobody");
echo "username = $username"; ?>

결과 x = NULL입니다. username = nobody

출력 결과를 동일하게 확인할 수 있습니다.

?? 연산자는 삼항연산자(?)를 통해 응용할 수도 있습니다.

$username = isset($_GET[‘user’]) ? $_GET[‘user’] : ‘nobody’;

또한 ?? 연산자도 삼항연산자의 중복하여 연결하는 것처럼 ?? 연산자도 연결하여 사용할 수도 있습니다.

6.9 리소스(Resource)

특별한 유형의 리소스 타입은 실제적인 데이터 타입이 아닙니다. 리스트 타입은 함수를 참조하거나 외부 PHP 리소스를 참조할 수 있습니다.

일반적으로 리소스 데이터 타입은 데이터 베이스를 호출할 때 많이 사용합니다.

6.9.1 리소스 확인 get_resource_type() 내부 함수를 이용하면 리소스 타입을 확인할 수 있습니다.

|관련함수| string get_resource_type ( resource $handle )

예제 파일 resource-01.php <?php // prints: mysql link $c = mysql_connect(); echo get_resource_type($c) . “\n”;

// prints: stream $fp = fopen(“foo”, “w”); echo get_resource_type($fp) . “\n”;

// prints: domxml document $doc = new_xmldoc(“1.0”); echo get_resource_type($doc->doc) . “\n”; ?>

6.10 스칼라 타입

스칼라 타입은 두 가지 방식으로 사용할 수 있습니다. 기본적 선택인 강제적(coercive)인 방법과 엄격한(strict) 방법입니다.

PHP에는 네 가지 스칼라 타입이 있습니다. ● 정수 ● 실수 ● 문자열 ● 논리값

위 타입의 변수는 강요(coercive) 또는 엄격(strict)한 방식으로 사용이 가능합니다.

다음은 파라미터를 강제적인 방법으로 지정하는 예제입니다.

예제 파일 scalar-01.php <?php // Coercive 방법 echo “정수 합계.
”; function sumOfInts(int …$ints){ print_r($ints); echo “
”;

	// 배열의 합계를 출력합니다.
	return array_sum($ints);
}

var_dump(sumOfInts(2, '3', 4.1));

echo "<br>";
echo "실수 합계.<br>";
function sumOfFloat(float ...$ints){
	print_r($ints);
	echo "<br>";

	// 배열의 합계를 출력합니다.
	return array_sum($ints);
}

var_dump(sumOfFloat(2, '3', 4.1));

?>

결과 정수 합계. Array ( [0] => 2 [1] => 3 [2] => 4 ) int(9) 실수 합계. Array ( [0] => 2 [1] => 3 [2] => 4.1 ) float(9.1)

예제 파일 scalar-02.php <?php // Coercive 방법 function sumOfstr(string …$strs){ print_r($strs); echo “
”;

}

var_dump(sumOfstr('호랑이', '토끼', 4));

?>

결과 Array ( [0] => 호랑이 [1] => 토끼 [2] => 4 ) NULL

6.11 가변변수

변수를 사용하기 위해서는 변수명을 같이 정의해야 했습니다. 가변변수란 변수의 이름을 다른 변수의 이름을 통해 변수의 이름을 가변적으로 사용할 수 있는 PHP의 기능입니다.

|문법| ${ 변수 }

변수명 앞에 ${ 와 뒤에 } 를 적어서 사용을 하면, 변수명의 값을 가지는 변수와 동일합니다.

6.11.1 개념 $aaa = “홍길동”;

$aaa 변수는 “홍길동”이라는 값을 가지고 있습니다. $aaa 변수를 ${“aaa”}로 가리킬 수도 있습니다.

echo ${“aaa”}; 는 echo $aaa; 와 같습니다.

$bbb = “aaa”;

$bbb변수에 “aaa” 값을 넣어서 ${ $bbb } 형태로 다시 $aaa 변수를 가리킬 수도 있습니다.

예제 파일 var-01.php <?php $abc = “123”; $bbb = “abc”;

echo $bbb."<br>"; // abc라고 출력됩니다.
echo $$bbb."<br>"; // 123이라고 출력됩니다.

echo ${$bbb}."<br>"; // 123
echo ${"abc"}."<br>"; // 123

?>

결과 abc 123 123 123

위의 예제는 가변변수 처리를 위한 예입니다. 변수값을 이용하여 새로운 변수명을 지정할 수 있습니다.

6.11.2 배열 가변변수 다차원 배열을 이용하여 가변변수를 사용할 수 있습니다. 기존 가변변수의 확장입니다. 다차원 배열의 가변변수는 PHP 7.x에서 새롭게 도입된 기능입니다.

예제 파일 var-02.php <?php

$name = "jiny";
printf("name 변수값 = %s <br>", $name);

$var['foo']['bar'] = "name";
printf("배열값 = %s <br>", $var['foo']['bar']);

// 이전 PHP 5.x
echo "가변변수(name)값  = " . ${$var['foo'][ 'bar']};
echo "<br><br>";

?>

결과 name 변수값 = jiny 배열값 = name 가변변수(name)값 = jiny

위의 예제는 다차원 가변변수의 예입니다. 새롭게 등장한 다차원 배열을 통하여 가변변수로 사용할 수 있습니다.

6.12 변수 삭제 캐스팅 방식으로 생성한 변수를 삭제할 수 있습니다.

예제 파일 casting-01.php <?php echo “casting
”;

$a = “변수를 삭제합니다.”; echo $a.”
”; echo “변수 삭제 = “.(unset)$a; // 결과:

?>

결과 casting 변수를 삭제합니다. 변수 삭제 =

위의 예제는 변수를 삭제하는 예입니다. 별도의 unset() 함수를 사용하지 않고도 케스팅이라는 간단한 표현으로 생성된 변수를 삭제하고 메모리 해제를 할 수 있습니다.

6.13 자동 전역변수 자동 전역변수는 phpinfo() 함수를 통해 확인할 수 있습니다.

예제 파일 info-02.php <?php echo “casting
”;

$a = “변수를 삭제합니다.”; echo $a.”
”; echo “변수 삭제 = “.(unset)$a; // 결과:

?>

화면 출력

자동 전역변수는 PHP에서 미리 설정되어 있는 변수입니다. 하지만 전역변수들은 서버의 정보를 포함한 보완적인 민감한 내용도 같이 출력됩니다.

PHP 4.2.0 이후부터는 환경 설정 파일 php.ini에서 register_global 값을 기본 off로 설정합니다.