Web Programming >> PHP Programming
|
|||||||||||||||||
[목차] | |||||||||||||||||
제2장 PHP의 기초 문법
2. PHP에서의 변수 C나 Perl 프로그래밍을 해본 사람이라면 Perl이 C에 비해서 변수 처리에 유연하다는 것을 느꼈을 것이다. PHP도 바로 이 Perl과 비슷한 방식으로 변수를 다룬다.
PHP에서의 변수형 PHP에서 지원하는 주요 변수형은 다음과 같다.
PHP에서는 $name처럼 변수임을 나타내기 의해 변수명 앞에 '$' 표시가 붙는다. 그러나 C에서처럼 변수를 사용하기 위해 특정 타입으로 먼저 선언할 필요는 없다. PHP에서의 변수는 그 변수가 담고 있는 값에 따라서 변수형이 결정된다. 따라서 변수가 담고 있는 값의 형태가 숫자에서 문자열로, 혹은 문자열에서 숫자로 변할 때마다 변수의 타입 역시 바뀌게 되며 이는 변수의 사용에 있어서 상당한 융통성과 편리함을 제공한다.
[예제1.2]php에서의 변수 사용
[예제1.2]의 해석 결과는 다음과 같다.
4행에서 변수 var_a는 "3500"이라는 정수 값을 가지므로 정수형이다. 그리고 변수 var_b는 문자열 "안녕" 이라는 값을 가지므로 문자열 변수가 된다. 그러나 10행에서 이 변수에 다시 "200"이라는 문자열을 주면 이 200이라는 값은 연산 관계에 라 문자열로 사용될 수 도 있고 정수로도 사용될 수 있다. 11행에서 보면 변수 var_b가 "200"이라는 문자열을 담고 있지만 정수형 변수인 var_a와의 덧셈 연산을 수행할 때에는 정수형 타입으로 인식되어 var_result가 "3700"이 된 것을 알 수 있다. 즉, 변수의 타입은 C에서와 같이 프로그래머에 의해 미리 선언, 결정되는 것이 아니라 그 변수가 담고 있는 값에 따라서 그때그때 바뀔 수 있다는 것이 PHP변수가 가진 특징이다. 그러나 정확한 연산이 필요한 프로그램에 따라서는 해당 변수의 변수형을 프로그래머가 임의로 바꾸어야 할 경우가 생기는데 이때에는 해당 변수를 type casting(형 변화) 하거나 PHP에서 제공하는 settype()함수를 사용해야 한다. Type casting 방법은 C와 동일하다. 해당 변수 잎에 바꾸고자 하는 변수형을 적어주면 된다. 현재 PHP에서 허용되는 type casting은 다음과 같다.
type casting 외에도 settype()함수를 이용하면 인자로 전해주는 변수형으로의 형 변환이 가능하다.
settype() 함수는 인자로 전해준 변수를 특정 변수형으로 형 변환하며 지원하는 변수형은 integer, double, string, array, object가 있다. 반대로 gettype()함수를 이용하면 변수의 현재 변수형을 알 수 있다. [예제1.3]을 보면 쉽게 이해할 수 있을 것이다.
[예제1.3] php에서 변수의 형 변환
6행에서 ${type}형 부분을 보면 변수 이름과 일반 문자열을 구분하기 위해서 '{}'를 사용한 것을 볼 수 있다. 이와 같이 변수값 뒤에 바로 문자열 등을 붙여서 출력하고자 할 때에는 변수 이름 부분과 문자열 부분을 구분하기 위해 변수 이름을 {}로 둘러싸야 한다. 만일 $type형과 같이 구분하지 않고 붙여서 사용하면 $type형을 하나의 변수 이름으로 인식하므로 당연히 아무 값도 출력되지 않는다.
1. 배열변수(array) PHP에서 배열은 두 가지 종류가 잇다. 하나는 우리가 흔히 생각하는 배열로 단일 값을 원소로 갖는 스칼라 배열(scalar array)이고, 다른 하나는 키(key)와 값(value)의 쌍을 하나의 원소로 갖는 연과 배열(associative array)이다. 일반 배열이 인덱스, 즉 배열의 참조 번호를 통하여 그 값에 접근할 수 있는데 반하여 연관 배열은 배열의 참조 번호가 아닌 참조키로 값에 접근할 수 있다. 즉, 키와 값이 하나의 쌍으로서 존재할 때 그 관계를 관련지어 생각할 수 있는 배열이므로 연상 배열, 혹은 조합 배열이라고도 하며 Perl에서 다루는 연관 배열(hash)과 같다고 생각하면 된다.
PHP에서 배열 변수를 정의하고 여기에 값을 할당하는 방법은 두 가지가 있다. 첫째는 아래의 예제처럼 인덱스, 즉 참조 번호를 명시하지 않은 채 배열 변수에 순차적으로 값을 할당하는 방법으로 이 경우 값이 할당되는 순서에 따라 배열 원소의 순서가 결정된다. 배열 원소의 인덱스는 C나 Perl에서처럼 0부터 시작한다.
두 번째 방법은 PHP에서 제공하는 배열 생성 함수 array()를 이용하여 배열 변수를 생성하는 방법이다.
위와 같이 array 함수의 인자로 직접 배열에 값을 할당할 수 있으며 그 결과는 앞의 예제와 동일하게 배열 $name에 세 명의 이름이 원소로 저장된다.
앞에서 연관 배열에 대해서 얘기했는데 연관 배열은 '=>' 기호의 왼쪽은 참조키, 오른쪽은 값을 하나의 원소로 하여 배열 변수에 저장되며 각 배열의 원소는 콤마(.)로 구분 지어진다. 예를 들어, 사람의 이름과 그 사람의 성적을 변수에 저장할 경우에는 스칼라 배열보다는 이와 같은 연관 배열이 보다 유용하게 쓰일 수 있다.
위의 배열에서 "이완천"과 "김영아", "길현수"는 배열 $list의 참조키이고 "99"와 "81",그리고 "87"은 값이다. 앞서 연관 배열은 배열의 참조 번호가 아닌 참조키를 통해 그 값에 접근할 수 있다고 했다. 즉, 위의 배열에서 $list["이완천"]은 99라는 값을 갖고 $list["김영아"]는 81, $list["길현수"]는 87을 그 값으로 갖는다.
2. 객체(object)형 변수 PHP에서 또 하나의 변수 타입인 객체는 클래tm(Class)를 통해서 생성되며 New 연산자를 통해 초기화 된다. 이는 Java나 C++같은 객체지향 프로그래밍에서 흔히 사용되는 방식이다.
[예제1.4] class를 이용한 객체 변수의 생성
위에서 $sedan이라는 변수에 Car 클래스 객체를 생성하여 할당함으로써 $sedan이라는 변수는 Car 클래스의 함수인 testCar()라는 함수에 접근, 호출할 수 있다. 따라서 "call to testCar function!"이라는 문자열이 해석 결과로 출력된다. 클래스에 포함된 함수 에 접근하기 위해서는 '->'라는 연산자가 사용된다.
PHP를 이용한 프로그래밍을 하다보면 외부에서 제작한 PHP 소스 코드를 많이 볼 수 있는데 그중 상당수는 이렇게 클래스를 이용한 함수 형태로 코딩되어 누구나 자신이 개발중인 코드에 쉽게 모듈처럼 이식할 수 있도록 되어 있는 경우가 많으므로 이들 코드의 해석을 위해서는 객체와 클래스에 대한 개념을 이해하고 있어야 한다.
변수의 사용 범위 1. 전역 변수와 지역 변수 변수의 사용 범위는 변수가 전역 변수(global varialbe)si 지역 변수(local variable)냐에 따라서 함수와 실행 결과가 달라질 수 있기 때문에 매우 주의해야 한다. 기본적으로 PHP에서 변수는 그 변수가 정의되는 영역에 따라 결정된다.
[예제1.5] 전역 변수와 지역 변수의 차이
위에서 2행의 변수 $a는 함수 Test() 밖의 영역에서 정의되었다. 그런데 함수 Test()는 이 변수 $a를 출력하려고 한다. 결과가 어떻게 나올까? 결과는 아래와 같이 변수 $a의 값으로 아무 값도 출력되지 않는다.
왜 이런 결과가 나올까? 대답은 간단하다.
함수의 5행에서 출력하려고 했던 변수 $a 는 2행에서 정의된 변수$a와는 존재 영역이 다른 변수이기 때문이다. 기본적으로 함수 내에서 정의되는 변수는 그 함수 내에서만 유효하다. 5행을 보면 변수 $a를 출력하려고 하는데 이 값은 함수 내에서 아무런 값도 할당받지 않았기 때문에 아무 값도 가지고 있지 않다. 따라서 값을 출력하려고 해도 결국 공백으로 출력되는 것이다. 즉, 사용자가 함수 내에서 정의하고 사용하는 변수는 기본적으로 그 함수 내의 영역에서만 의미를 갖는 지역 변수가 되는 것이다.
그렇다면 Test() 함수를 이용하여 2행에서 정의된 변수 $a가 가진 값, 100을 출력하려고 하면 어떻게 해야 할까? 답이 나올 것이다. 바로 함수 내 변수의 영역을 전역 변수로 확대하면 되는 것이다. 여기서는 함수 내의 변수 $a가 함수 밖에서 정의 된 변수 $a를 참조할 수 있도록 $a를 전역변수로 설정하면 된다.
[예제1.6] 전역 변수의 선언
함수 내 변수를 전역 변수로 설정하려면 [예제1.6]과 같이 해당 변수 앞에 전역 변수임을 의미하는 global이라는 선언 자를 붙이면 된다. 그러면 6행의 실행 결과로 2행에서 정의된 변수 $a의 값 100이 출력된다. 하나의 예제를 더 보자.
[예제1.7] 전역변수의 범위
[예제1.7]에서 5행의 전역 변수 설정이 있을 때와 없을 때의 결과는 어떻게 될까? 5행이 없을 경우에는 앞서 얘기한 것처럼 함수 내의 변수 $a 와 $b는 함수 밖으로 벗어나질 못하므로 9행에서 출력되는 $b는 동일 영역인 3행에서 정의된 변수 $b의 값, "2"로 출력된다. 그러나 5행처럼 변수 $a 와 $b를 global로 설정하면 변수 $a 와 $b는 각각 1과 2를 가지므로 6행에서 1과 2를 더한 값이 $b에 재 할당되어 9행에서 $b의 값으로 "3"이 출력된다.
변수를 전역화 시키는 또 하나의 방법이 있다. 변수를 전역화 시키려면 이와 같이 global 선언 자를 이용한 방법 외에도 PHP에서 내부적으로 정의된 배열 $GLOBALS을 사용하면 된다. 이를 이용하면 [예제1.7]이 [예제1.8]과 같이 바뀌지만 그 결과는 동일하다.
[예제1.8]$GLOBALS 내장 변수를 이용한 전역 변수의 설정
코드를 보면 알 수 있듯이 $GLOBALS 변수는 전역화 하고자 하는 변수의 이름을 그 참조키로, 해당 변수의 값을 그 값으로 갖는 연관 배열이다.
2. 정적 변수 또 하나, PHP에서 전역 및 지역 변수 외에 정적 변수(static variable)라는 것이 있다. 이는 기본적으로 지역 함수 내에서만 존재하지만 함수가 호출된 후 종료되어도 사라지지 않고 계속 그 값을 저장하고 있는 변수를 말한다. 따라서 재귀 함수 호출과 같이 일정 횟수를 반복하기 위한 작업에서 몇 번 반복이 되었는지를 체크할 수 있는 카운터 변수로 쓰일 수 있다.
해당 변수를 정적 변수로 정의하기 위해서는 static 이라는 선언자를 사용한다.
[예제1.9] 정적 변수의 설정
만일 위의 3행에서 변수 $i가 static 없이 일반 변수로 정의되었다면 countIt() 함수가 매번 호출된다하더라도 변수 $i의 값은 3행에서 "0"으로 초기화 되어버리므로 결국 계속 "0"이 출력된다. 그러므로 5행의 증가 연산은 실질적으로는 아무런 효과가 없게 된다. 그러나 3행에서와 같이 변수 $i를 정적 변수로 설정하면 매번 호출될 때마다 정적 변수 $i의 값은 사라지지 않고 보존되기 때문에 5행에서 $i는 1씩 증가하게 된다. 따라서 함수가 몇 번씩 반복 수행되어야 하는 재귀 호출의 경우에는 이러한 정적 변수를 유용하게 사용할 수 있다.
3. 가변 변수 Variable Variables에 대해 가변 변수라는 말이 적합한 번역인지는 모르겠으나 이름보다는 개념으로 이해하면 어려울 것이 없다. 한 마디로 말해 가변 변수는 변수의 값을 그 이름으로 갖는 변수이다. 아래의 코드를 보자.
[예제1.10] 가변 변수의 설정
결과는 아래와 같다.
2행에서 변수 $var1은 apple이란 값을 갖는다. 3행을 보면 변수를 나타내는 문자 $가 두 번 쓰인 것을 볼 수 있다. 이것은 변수 $var1이 가진 값 apple을 그 이름으로 갖는 새로운 변수 $apple을 정의하는 것이며 그 변수에 'juice'라는 값을 할당한다는 의미이다. 즉, $$var1은 변수 $apple과 동일한 의미를 갖는다. 따라서 4행과 5행은 동일한 결과를 나타낸다. 참고로 가변 변수를 사용할 때는 $문자가 두 번 쓰이므로 변수임을 가리키는 $과 변수 이름으로 사용되는 변수($var1)를 구분하기 위해서 4행에서처럼 {}표시를 해주는 것이 코드에 혼동이 없고 좋다.
|
|||||||||||||||||
[목차] |