phpclass/객체모델2005. 10. 11. 12:21
written: Oct 18 2005
상수
상수(constant)라는 것은 프로그램에서 한번 값이 결정되면 다시는 새로운 값으로 변경될 수 없는 객체입니다. 언어마다 상수의 분류가 다소 다르기는 합니다만 대체적으로 숫자형, 문자형, 문자열 상수로 구분되며 자바에서는 부울린형이 추가되어 있습니다. 참고로 자바에서는 상수를 리터럴(literal)이라고 부릅니다.
< 상수의 분류 >
대분류 소분류 사용예
숫자형 정수 1, 100, 2005, 0777, 0xFF, ...
실수 1.2, 100.0, 3.1415927, ...
지수 0.12e-2, 10e45, 0.36E-3, ...
문자형 영문자 소문자 'a' - 'z', 대문자 'A' - 'Z'
숫자형문자 '1'  - ' 9'
특수문자 '#', '$', '?', newline과 같은 escope code, ...
부울린형 예약어 true, false
문자열형 "Hello world.", ...
상수를 변수처럼 사용하는 방법
각 언어마다 상수를 변수처럼 이름을 가진 상수로 사용할 수 있도록 해줍니다. 이 방법은 언어마다, 그리고 상수가 정의된 위치에 따라 다를 수 있기때문에 각 언어별(PHP, C++, 자바)로 상수이름을 어떻게 정의하여 사용할 수 있는지 살펴보겠습니다.
PHP에서는 5.0부터 클래스에서 정의되는 상수를 제공합니다. 이 상수를 클래스 상수라고 하며 기존의 전역영역에서 사용하던 전역상수와 구별하여 사용할 수 있습니다.
PHP에서 전역상수를 정의하기 위해서는 define 함수를 이용합니다.
[code php;gutter:false] <?php define("PI", 3.1415927); echo PI; ?> [/code]
C++에서는 아래와 같은 방법으로 상수의 이름을 사용하도록 해줍니다.
[code c;gutter:false] #define PI 3.1415927 [/code]
위와 같은 C++에서의 방법은 PHP의 define() 함수에 의한 방법과는 그 구현방법이 다릅니다. C++에서의 #define은 프리프로세서(preprocessor)로 매크로 기능을 이용하는 방법으로 컴파일하기 전에 상수이름이 해당 상수로 모두 대치됩니다.
PHP의 define() 함수에 의해 정의된 상수는 하나의 기억장소에 저장되나 그 값이 변수처럼 새로운 값으로 치환되지 못하도록 합니다.
아래와 같이 C++에서의 또 다른 상수이름을 지정할 수 있는 방법인 const 키워드를 이용하는 방법이 있으며 이 방법의 의해 정의된 상수이름은 PHP의 define() 함수에 의해 정의된 함수처럼 하나의 기억장소를 할당받으며 그 값을 변경할 수 없습니다.
[code c;gutter:false] const float pi = 3.1415927; [/code]
PHP5에서 제공되는 클래스 상수가 위와 유사하게 const 키워드를 이용하여 정의합니다.
[code php;gutter:false] const pi = 3.1415927; [/code]
PHP에서는 float와 같은 자료형을 지정하지 않는다는 것을 감안하면 C++ 표현 방식과 같다는 것을 알 수 있습니다.
참고로 자바에서는 #define, const 대신에 final 키워드를 사용하여 상수(리터럴) 이름을 지정할 수 있습니다.
[code java;gutter:false] final float pi = 3.1415927; [/code]
클래스 상수
클래스 상수는 클래스 단위로 설정할 수 있는 상수로 아래와 같이 const 키워드를 사용하여 클래스 상수를 정의하며 전역 상수와 마찬가지로 변수를 나타내는 $ 문자를 붙이지 않습니다.
const 클래스상수명 = '상수값';
클래스 상수는 클래스 안에서 사용되는 키워드 $this뿐만 아니라 생성된 인스턴스를 가지고는 접근할 수 없습니다. 따라서 클래스 상수를 사용하기 위해서는 아래와 같이 self, parent 키워드 또는 클래스명을 통해 접근해야 합니다.
[code php;gutter:false] <?php class super_class { const constant = 'super_class::constant value'; function show_constant() { print self::constant . "\n"; } } class sub_class extends super_class { const constant = 'sub_class::constant value'; function show_constant() { print parent::constant . "\n"; print self::constant . "\n"; } } /** * This will print * super_class::constant value */ print super_class::constant . "\n"; /** * This will print * sub_class::constant value */ print sub_class::constant . "\n"; $obj = new sub_class; /** * This will print * super_class::constant value * sub_class::constant value */ $obj->show_constant(); /** * This will print * super_class::constant value * sub_class::constant value */ sub_class::show_constant(); /** * This will print * super_class::constant value */ super_class::show_constant(); /** * echo $obj::constant; is not allowed */ ?> [/code]
< 클래스 상수 사용하기 >
클래스 상수는 항상 public 가시범위(visibility)를 가지고 있기 때문에 const 키워드 앞에는 public 접근 제한자를 포함하여 어떠한 접근제한자도 지정해서는 안됩니다.

Posted by 방글24