로컬변수


로컬변수의 개념은 함수의 사용과 연관이 있습니다. 함수는 코드의 재사용과 독립성을 보장하는 코드 작성 방법입니다. 또한 함수는 기존 코드들과 분리된 각각의 코드 모듈입니다.

함수는 프로그램에서 여러 번 호출을 통하여 재사용됩니다. 만일, 함수가 호출될 때마다 외부 변수 값에 영향을 받거나, 이전 호출한 함수의 작업된 변수의 영향이 있다고 한다면 함수를 재사용하는 데 많은 어려움이 있을 것입니다.

따라서 함수에서 사용되는 변수는 외부의 변수들과 단절하고 독립성이 필요합니다. 따라서 함수 내부에서 선언한 변수는 함수 안에서만 사용을 할 수 있도록 독립성을 유지하도록 설계되었습니다. 이렇게 함수 내부에서 독립된 선언과 사용을 할 수 있도록 하는 변수를 로컬변수라고 합니다.

위의 그림처럼 PHP에서 생성하는 변수들은 대부분 글로벌변수로 작성됩니다. 또한 함수에서 작성 및 사용되는 변수는 로컬변수로 인식합니다.

위의 그림처럼 <?php 다음에 처음으로 선언된 $a는 글로벌변수입니다. 또한 test() 함수 안에 동일한 이름의 변수$a는 외부의 $a와 다른 변수입니다. 함수 안에서만 사용 가능한 변수가 로컬변수입니다.

이 프로그램을 예를 실행하면 한 개의 글로벌 변수와 두 번의 로컬변수가 생성됩니다. 하지만 세 개의 변수명은 모두 같습니다. 변수명이 같을지라도 PHP는 세 개의 메모리 영역을 할당하게 됩니다. 즉, 서로 다른 변수입니다.


휘발성 변수


로컬변수는 주로 함수 내에서 선언한 변수를 말합니다. 또한 함수 내에서 생성된 로컬변수는 휘발성을 띠고 있습니다.

휘발성이란 변수를 사용하고 나서 더 이상 필요 없을 경우에 자동으로 없어지는 효과를 말합니다.

로컬변수도 함수를 호출할 때 함수 내에서 사용되는 변수 메모리를 할당합니다. 또한 함수가 종료되면 로컬변수들은 자동으로 사라지게 됩니다. 함수 호출 처리가 끝났기 때문에 자동으로 없어지는 것입니다.

하지만 글로벌변수는 선언과 동시에 프로그램 종료까지 살아 있습니다. 그렇지만 로컬변수는 생성과 소멸을 반복합니다.


변수 접근


글로벌변수와 로컬변수는 서로 상호 영향을 받지 않도록 독립되어 있습니다. 심지어 변수의 이름이 같아도 서로 다른 메모리를 할당합니다. PHP 프로그램 안에서도 서로 각각의 값을 읽고 쓸 수 없도록 격리되어 있습니다.

이러한 로컬변수의 특성 때문에 함수를 재사용하고 기존 코드와 영향 없이 동작이 가능합니다.

예제 파일 scope-01.php

<?php
	$x = 5; //글로벌변수 

	function test() {
		// 함수 내에서는 함수 외부에 있는 글로벌변수를 읽을 수 없습니다.
		echo "함수 안에서는 외부 변수를 사용할 수 없습니다. x = $x</p>";
	}

	test();

	echo "외부에서는 글로벌변수를 사용할 수 있습니다. x = $x</p>";
?> 

결과

함수 안에서는 외부 변수를 사용할 수 없습니다. x =
외부에서는 글로벌변수를 사용할 수 있습니다. x = 5

위의 예제는 함수 내에서 외부 글로벌변수의 접근을 실험합니다. 함수 내에서는 외부의 글로벌변수를 기본적으로 접근하여 사용할 수 없습니다. 함수 내에서 사용하고 있는 $x는 로컬변수로 생성된 별개의 새로운 변수 입니다.

또한 함수 안에서 사용한 로컬변수는 함수가 끝날 때 휘발성으로 자동 사라지게 됩니다.

예제 파일 scope-02.php

<?php
	
	$a = "jiny";
	$b = "lee";

	echo "글로벌 변수를 출력합니다. <br>";
	echo $a . " " . $b;
	echo "<br>";
	
	// 함수 정의
	function usersName(){
		// 로컬변수 선언
		$title = "jinyPHP";

		if ($a) {
			echo "a =". $a . "<br>";			
		} else {
			echo "a 값이 없습니다. <br>";
		}

		if ($b) {
			echo "b =".$b . "<br>";
		} else {			
			echo "b 값이 없습니다. <br>";
		}

	}

	// 함수를 호출
	echo "함수를 호출합니다.<br>";
	usersName();

	echo "<br>";

	echo "함수 안에 title 변수를 확인합니다.<br>";
	if ($title) {
		echo "title =". $title . "<br>";			
	} else {
		echo "title 값이 없습니다. <br>";
	}

?>

결과

글로벌 변수를 출력합니다.
jiny lee
함수를 호출합니다.
a 값이 없습니다.
b 값이 없습니다.

함수 안에 title 변수를 확인합니다.
title 값이 없습니다. 

기존의 PHP는 변수를 선언과 동시에 PHP 전체에서 선언한 변수를 사용을 할 수 있었습니다. 하지만 함수 안에서는 독립된 공간이기 때문에 외부 글로벌변수를 사용할 수 없습니다. PHP의 변수는 로컬변수와 글로벌변수 등으로 서로 독립되어 분리가 됩니다.


글로벌 키워드


앞 절에서 설명한 것과 같이 글로벌변수와 로컬변수는 서로 독립되어 간섭을 주지 않습니다. 메모리의 할당도 서로 다릅니다. 심지어 접근 또한 제한되어 있습니다.

함수들은 외부의 데이터를 입력받아 처리를 하고 값을 반환합니다. 하지만 프로그램 작성을 하다 보면 함수에게 전달하는 모든 값들을 매개변수로 전부 지정하여 사용하는 것은 어렵습니다. 이런 경우 공통의 외부 글로벌변수를 사용하면 편리할 수 있습니다. 공통의 변수를 함수 외부에서 사용하기 위해서는 함수 내에서 글로벌변수 선언키워드를 이용하여 지정하면 됩니다.

PHP는 외부 글로벌변수를 함수 내에서 예외적으로 접근 사용할 수 있는 global 키워드를 제공합니다. 함수 내에서 아래와 같이 선언을 하면,

|문법|

global $변수명;

함수 내에서 외부의 글로벌변수를 접근하여 사용할 수 있습니다.

예제 파일 scope-03.php

<?php
	
	$a = "jiny";
	$b = "lee";

	echo "글로벌 변수를 출력합니다. <br>";
	echo $a . " " . $b;
	echo "<br>";
	
	// 함수 정의
	function usersName(){
		// 글로벌 키워드를 통하여 외부 변수를 함수 내부에서 사용 가능하도록 만듭니다.
		global $a, $b;

		if ($a) {
			echo "a =". $a . "<br>";			
		} else {
			echo "a 값이 없습니다. <br>";
		}

		If ($b) {
			echo "b =".$b . "<br>";
		} else {			
			echo "b 값이 없습니다. <br>";
		}

	}

	// 함수를 호출
	echo "함수를 호출합니다.<br>";
	usersName();

?>

결과

글로벌변수를 출력합니다.
jiny lee
함수를 호출합니다.
a =jiny
b =lee

위의 예제는 글로번변수 접근에 대한 실험입니다. global 키워드로 선언한 외부 글로벌변수는 값을 함수 내에서 가지고 올 수 있습니다. 또한 함수 내에서 값을 변경할 수도 있습니다.