상수


컴퓨터는 다양한 데이터 값을 처리합니다. 정수값, 실수값 및 문자열 등 프로그램 언어들은 이러한 다양한 데이터 값을 연산하고 결과를 화면에 출력합니다.

데이터의 값은 개발자가 사전에 정의한 값이 될 수도 있고, 프로그램에서 연산을 통해 생성된 데이터일 수도 있습니다. 개발자가 프로그램에서 직접 정의한 데이터 값은 프로그램 동작 중에는 변경되지 않는 고정값입니다. 보통 이렇게 프로그램 동작에 따라서 처리되는 값이 아닌 프로그램 처음부터 끝까지 고정된 값을 상수라고 표현합니다.

고정된 값은 다양한 이름으로 재정의하여 사용할 수 있습니다. 이를 데이터를 상수화 처리한다고 합니다. 상수는 숫자 또는 논리값, 문자열 등 다양한 데이터 값을 상수명으로 지정할 수 있습니다. 심지어 특수기호 등도 상수로 지정할 수 있습니다.

이렇게 데이터를 상수명 형태로 변경해서 사용하는 이유는 고정된 데이터의 값을 일관성 있게 처리하기 위함입니다. 만일 어떤 고정값이 3이라는 숫자 값으로 있다고 합시다. 그 다음에 고정된 값 3을 5로 변경하려고 할 때, 모든 연관된 소스 코드의 값을 모두 3에서 5로 변경해야만 할 것입니다. 이러한 고정값과 데이터를 변경하는 작업은 소스의 크기가 커질수록 쉬운 일이 아닐 것입니다.

이처럼 상수는 자주 쓰는 고정값이나, 사람이 쉽게 인지할 수 없는 특수 데이터 값 등을 상수명 형태로 정의해서 사용하면 매우 편리합니다. 또한 수정할 때 상수 이름의 값만 수정함으로써 소스의 전체적인 데이터 값을 한꺼번에 바꿀 수 있습니다. 대표적으로 자주 사용하는 상수명으로는 색상을 표시하는 RED, WHITE, BLUE 등의 색상 코드값을 상수로 정의해서 많이 사용합니다.

상수명 및 데이터는 프로그램 소스의 상단 또는 별도의 파일로 분리, 관리하는 경우가 많이 있습니다. 즉, 이렇게 별도 관리되는 파일들을 환경 설정 파일이라고도 부릅니다.

상수는 다음 장에 배울 변수와는 다릅니다. 변수는 메모리 영역과 사용에 대해서 관련이 있지만 상수는 메모리와는 상관이 없습니다.

또한 상수를 많이 사용한다는 것은 프로그램에 들어가는 고정 데이터 값이 많아진다는 의미와 같습니다. 고정 데이터의 사용으로 인해 프로그램의 크기는 커질 수 있습니다.


5.1 정수형 상수


  • 소수점 이하 부분이 없는 음수(-), 0, 양수(+)
  • signed 및 unsigned 수로 구분되며 8진수, 10진수, 16진수의 값을 가집니다( O로 시작하면 8진수 형태, Ox로 시작하면 16진수 형태).
  • 정수 상수는 컴퓨터 비트(bit)에 따라 다르지만 1byte 또는 2byte 크기로 표현됩니다.


5.2 실수형 상수


  • 소수점이나 지수가 있는 데이터를 의미합니다.
  • 실수 상수는 8byte, 4byte에 표현하고자 할 때는 실수 상수 뒤에 f자를 표시합니다.
  • Long double 유형의 실수 상수를 사용하고자 할 때에는 끝에 l이나 L자를 표시합니다.
  • 소수점이 있는 수치로 음수(-), 양수(+)로 구성됩니다. 예) 0.34, 5.58f


5.3 문자 상수


단일문자

  • 하나의 단일 문자 즉 알파벳 한 글자를 의미합니다. 문자 상수는 (‘ ‘) 안에 단일 문자로 표기합니다.

문자열 상수

  • 두 개 이상의 문자가 모여 있는 문자열을 이중 인용부호 (“ “ )를 사용하여 표시합니다.


5.4 상수의 특성


상수명은 고정된 데이터의 별칭과 같습니다. 따라서 상수명은 프로그램 안에서 실행이 시작되기 전에 미리 선언하는 것이 일반적입니다.

PHP 인터프리터 언어는 프로그램 실행 전에 상수명에 대해서 정의한 데이터 값을 다 치환 적용한 후에 프로그램이 실행됩니다. 따라서 상수명의 갯수와 크기는 프로그램 실행 파일에 영향을 줍니다.

프로그램은 컴파일/인터프리터(소스), ROM(롬)/하드디스크 등에 저장되어 실행됩니다. 또한 상수명는 프로그램의 소스의 일부분이며 데이터의 값이 됩니다. 즉, 프로그램의 소스 자체가 큰 상태에서 실행되는 특성을 가지고 있습니다.

반면, 뒤에서 배울 변수는 메모리에 적재되어 실행되므로 프로그램의 소스 크기와는 상관이 없습니다.


5.5 상수 설정


PHP언어 에서는 두 가지 방식으로 상수를 설정할 수 있습니다. 내장 함수 define() 과 상수 키워드 const를 통하여 상수를 선언할 수 있습니다.


5.5.1 상수의 명칭


상수의 명칭을 정의할 때는 문자, 언더바(_)로 시작된 이름으로만 설정할 수 있습니다. 다만 상수명은 첫 글자를 숫자로 정의할 수 없습니다. 또한 상수는 상수값으로 스칼라 값 또는 NULL로 설정할 수도 있습니다.


5.5.2 스칼라 값


스칼라 값은 문자열, 정수, 부동소수점, 논리값을 의미합니다.


5.5.3 상수값 사용


PHP에서 코드에 설정한 상수값은 상수명을 그대로 적으면 됩니다. 상수는 변수와 달리 $ 기호를 사용하지 않습니다.

상수 출력 예제)

echo DB_TYPE;


5.6 define()


내장 함수 define()은 PHP언어에서 상수를 설정할 수 있도록 사전에 미리 만들어 제공되는 함수입니다.


5.6.1 define() 함수


define() 함수는 세 개의 실행 인자 값을 입력할 수 있습니다. 첫 번째는 상수명, 두 번째는 상수의 스칼라 값, 세 번째는 대소문자 구분 여부입니다.

|관련함수|

bool define("상수명", "상수값", true);

실행 인자 중 세 번째 인자는 생략할 수 있습니다. 세 번째 인자를 생략할 경우에는 기본적으로는 true 로 설정된 것으로 간주합니다.

예제 파일 define-01.php

<?php
	// 상수를 정의합니다.
	define("DB_TYPE","mysql");
	// 설정한 상수를 출력합니다.
	echo DB_TYPE."<br>";
?>

결과

 mysql

define() 함수는 실행 후 결과값으로 논리값을 반환합니다. 상수 설정이 성공한 경우 true, 실패할 경우 false를 반환함으로 상수 설정의 성공 여부를 확인할 수 있습니다.

예제 파일 define-02.php

<?php
	// 상수를 정의합니다.
	define("DB_TYPE","mysql");
	// 설정한 상수를 출력합니다.
	echo DB_TYPE."<br>";

	// 상수를 중복 정의해 봅니다.
	if(define("DB_TYPE","mysql")){
		echo "상수 설정 성공";
	} else {
		echo "상수 설정 실패";
	}

?>

결과

mysql
상수 설정 실패

위의 두 번째 예는 동일한 이름의 상수를 중복으로 선언하기 때문에 define() 함수는 상수의 설정 false를 반환합니다.


5.6.2 배열 상수


배열 상수 설정 기능은 PHP 7.x부터의 새로운 기능입니다. 기존 PHP 5.6 까지는 상수의 값은 단지 한 개의 값으로만 정의가 가능했습니다.

PHP 7.x 은 기존 define() 내장 함수를 개량하여 비슷한 문법적 처리를 통해 배열 상수를 설정할 수 있습니다.

예제 파일 define-03.php

<?php
	// 배열 상수를 선언합니다.
	define('ANIMALS', [
    	'dog',
    	'cat',
    	'bird'
	]);

	echo ANIMALS[1]; // outputs "cat"

?>

결과

cat

배열 상수도 배열 변수처럼 상수명 뒤에 []를 붙여서 배열 접근 및 처리를 할 수 있습니다.


5.7 const 키워드


PHP는 define() 함수 이외에 const 키워드를 사용해서도 상수를 선언할 수 있습니다. const는 키워드를 통해 상수를 설정합니다. 따라서 define()처럼 상수의 선언 오류 등을 함께 확인할 수 없는 단점을 가지고 있습니다.

|문법|

const 상수명 = 값;

const는 상수를 생성하는 시점이 PHP프로그램이 실행되면서 const 키워드를 만나는 시점에 생성됩니다. 따라서 소스에서 const 명령이 선언하기 이전에 상수명을 호출하게 되면 미정의 상수명 사용으로 인하여 오류가 발생할 수 있습니다.

const 상수 선언 키워드는 함수나 반복문 loop 또는 if문 안에서는 사용할 수 없습니다. 함수 호출이나 반복문과 같은 곳에서는 중복된 상수명 선언을 시도할 수 있기 때문입니다.

예제 파일 const-01.php

<?php
	// 상수를 선언합니다.
	const DB_TYPE = "mysql";
	// 상수를 출력합니다.
	echo DB_TYPE;
?>

결과

mysql

위의 예에서 DB_TYPE이라는 상수를 선언하며, 상수값으로는 “mysql”을 대입합니다. 이처럼 생성한 상수값은 PHP에서 바로 사용하거나, 다른 변수에 값으로 대입할 수도 있습니다.

예제 파일 const-02.php

<?php
	// 상수를 선언합니다.
	const DB_TYPE = "mysql";
	$dbTYPE = DB_TYPE;
	// 상수를 출력합니다.
	echo $dbTYPE;
?>

결과

mysql


5.8 상수 존재 여부 확인


상수명은 중복하여 사용할 수 없습니다. 상수의 중복 사용을 방지하기 위해 또는 상수값 참조 오류를 방지하기 위해 기존 상수값이 선언되었는지 확인이 필요합니다.

PHP는 내부의 상수값이 존재하는지 확인할 수 있는 defined() 내부 함수를 제공합니다. defined() 함수는 내부의 상수 목록에서 입력한 상수의 값이 존재하는지 여부를 논리값으로 결과를 반환합니다.

|관련함수|

bool defined ( string $name )

defined(“상수명”)을 입력하면 상수 존재 여부를 true 또는 false 형태의 논리값으로 결과를 반환합니다.

예제 파일 defined.php

<?php
	if (defined('TEST')) {
    	            echo "상수가 존재합니다.";
	} else {
		echo "상수가 없습니다.";
	}
?> 


예약된 상수 목록


모든 언어들이 그러하듯이 사전에 많은 상수를 포함하고 있습니다. 상수를 선언하여 사용할 때 실수로 상수명이 중복되어 프로그램의 오작동을 발생할 수도 있습니다.

상수를 선언하기 전에는 PHP에서 미리 사용된 상수명인지 확인하고 중복되지 않게 쓰는 것이 중요합니다. 또는 앞에 개인적인 접두어를 붙여서 사용하는 것도 또 다른 방법일 수 있습니다.

PHP언어에서는 기존에 미리 선언된 상수의 목록을 확인할 수 있는 내부 함수를 제공하고 있습니다.

|관련함수|

array get_defined_constants ([ bool $categorize = false ] )

위 함수의 반환값 형태는 배열인 것을 확인할 수 있습니다. get_define_constants() 함수는 PHP 내부 상수와 사용자가 개별적으로 선언한 모든 상수의 목록을 배열 형태로 반환받을 수 있습니다.

예제 파일 get_defined_constants.php

<?php
	// 상수를 정의합니다.
	define("MY_CONSTANT", 1);
	// 정의된 모든 상수들을 출력합니다.
	// 카테고리도 같이 출력합니다.
	print_r( get_defined_constants(true) );
?> 

위의 예제는 get_defined_constants() 함수로 PHP의 내부 상수와 사용자 정의 상수의 목록을 출력하는 것입니다. 출력 결과는 내용이 많아서 지면상 생략하도록 하겠습니다.


5.10 미리 정의된 상수


PHP는 개발자가 선언하지 않아도 이미 미리 정의된 상수들이 있습니다. 대부분의 프로그램 언어 또한 사전에 내장된 상수들은 다수 존재합니다.

  • FILE 파일의 전체 경로와 파일명, 절대 경로를 표시합니다.

  • LINE 파일의 현재 줄을 표시합니다.

  • DIR 현재 디렉터리 경로를 출력합니다.(PHP 5.3에 추가)

  • FUNCTION 함수명을 표시합니다. (PHP 5에 추가)

  • CLASS 클래스명을 표시합니다. (PHP 5에 추가)

  • METHOD 클래스 메서드명을 표시합니다. (PHP 5에 추가)

  • NAMESPACE 이 상수는 컴파일 시에 정의됩니다. (PHP 5.3에 추가)

  • PHP_VERSION 서버에 설치된 PHP 버전을 표시합니다.

  • PHP_OS PHP가 실행 중인 OS의 이름을 표시합니다.

  • TRUE TRUE (참), 1을 의미합니다.

  • FALSE FALSE (거짓), 빈 값을 의미합니다.

  • E_ERROR 문법 오류가 아닌 복구가 불가능한 에러를 표시합니다.

  • E_WARNING PHP가 스크립트 실행에는 문제없으나 오류가 있음을 표시합니다.

  • E_PARSE 스크립트에서 문법적으로 잘못된 명령을 만난 경우 표시합니다.

  • E_NOTICE 에러는 아니지만 알릴 사항이 있음을 표시합니다.

예제 파일 const-03.php

<?php 
	// 파일의 전체 경로와 파일명, 절대 경로를 표시합니다.
	echo __FILE__ . "<br/>\n";

	// 상수를 정의한 위치가 5 라인입니다. 
	echo __LINE__ . "<br/>\n";

	// 서버에 설치된 PHP버전을 표시합니다.
	echo PHP_VERSION . "<br/>\n";

	// PHP가 실행 중인 OS의 이름을 표시합니다.
	echo PHP_OS . "<br/>\n";

	echo TRUE . "<br/>\n";

	echo FALSE . "<br/>\n";  

	// 함수명 상수 정의 
	function functionname(){ 
    		echo __FUNCTION__."<br>"; 
	} 
	
	functionname();

	// 클래스명 상수 정의 
	class classtest
	{ 
    		var $test = __CLASS__; 
    		function test()
    		{ 
           			echo $this->test; 
    		} 
	} 

	$test = new classtest; 
	echo $test->test."<br>";

	// 메서드명 상수 정의 
	class classtest2
	{ 
    		var $test = __METHOD__; 
    		function test()
    		{ 
          			echo $this->test; 
    		} 
	} 

	$test2 = new classtest2; 
	echo $test2->test."<br>";
	

?>

결과

C:\php-7.1.4-Win32-VC14-x86\jinyphp\const-03.php
6
7.1.4
WINNT
1

functionname
classtest
classtest2

위의 예제는 다양한 내부 상수들을 확인하고 출력하는 예제입니다.