상수

상수


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


개발자의 값


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


값의 정의


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


일관성 있는 값을 적용


이렇게 데이터를 상수명 형태로 변경해서 사용하는 이유는 고정된 데이터의 값을 일관성 있게 처리하기 위함입니다.
만일 어떤 고정값이 3이라는 숫자 값으로 존재한다고 합시다.

그 다음에 고정된 값 35로 변경하려고 할 때, 모든 연관된 소스 코드의 값을 모두 3에서 5로 하나씩 변경해야만 할 것입니다. 이러한 고정값과 데이터를 직접 변경하는 작업은 소스의 크기가 커질수록 매우 실수가 잦고 고된 일입니다.

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


설정값


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


상수의 특징


상수는 프로그램 안에서 변하지 않는 성질 때문에 메모리와 사용 면에서 변수와는 다른 특징을 보입니다.

상수의 위치

상수는 다음 장에 배울 변수와는 다릅니다. 변수는 메모리 영역과 사용에 대해서 관련이 깊지만, 상수는 코드에 고정 데이터로 직접 박히므로 일반적인 동적 메모리 할당(힙/스택 등) 구조와 다소 무관합니다.

또한 상수를 많이 사용한다는 것은 프로그램에 들어가는 고정 데이터 값이 많아진다는 의미와 같습니다. 고정 데이터의 사용으로 인해 프로그램 빌드 시 파일의 크기가 소폭 증가할 수 있습니다.

상수의 특성

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

PHP는 스크립트 엔진이 소스 코드를 읽어 들일 때, 정의된 상수명을 해석하여 해당 값으로 치환하여 실행합니다. 따라서 상수명의 개수와 크기는 프로그램의 초도 로딩 및 컴파일 단계에 일부 영향을 줍니다.

상수는 프로그램 소스의 일부분이며 변경 불가능한 값의 데이터가 되기 때문에, 소스 수준에서 고정되어 관리되는 특성을 가지고 있습니다. 반면, 뒤에서 배울 변수는 실행 단계에서 메모리에 적재되어 동적으로 변경되고 사라지므로 프로그램 소스 자체의 정적 크기와는 직접적 연관이 없습니다.


상수 정의 메커니즘


PHP에서는 상수를 정의할 때 대표적으로 두 가지 방식을 지원합니다. 컴파일 시점에 즉시 처리되는 const 키워드 방식과, 실행 중 런타임에 처리되는 define() 함수 방식입니다. 두 방식의 핵심 메커니즘 차이는 다음과 같습니다.

상수 정의 메커니즘


PSR-12 코딩 표준 규약 (명명법)


PHP에서 코드를 작성할 때 일관성 있는 협업을 위해 권장되는 표준 규약인 PSR-12에서는 상수를 명명할 때 다음과 같은 표준 규칙을 따르도록 엄격하게 규정하고 있습니다.

  1. 상수의 이름은 모두 대문자(UPPER_CASE)로 작성해야 합니다.
  2. 여러 단어가 결합하는 경우, 단어 사이에 언더바(_)를 사용하여 구분(Snake Case)합니다.
  3. 소스 코드에서 상수와 변수를 직관적으로 구분하기 위해, 상수명 앞에는 달러 기호($)를 붙이지 않습니다.
  • 예: DB_NAME, MAX_USER_LIMIT, API_TIMEOUT_SECONDS (올바름)
  • 예: dbName, max_user_limit, $DB_NAME (표준 컨벤션에 어긋남)


타입 지정 클래스 상수 (Typed Class Constants) — [PHP 8.3+]


PHP 8.3 이전에는 상수에 타입을 명시적으로 지정할 수 없어, 자식 클래스에서 상속받아 재정의할 때 엉뚱한 타입의 데이터로 덮어쓰더라도 이를 감지하기 어려웠습니다.

PHP 8.3부터는 클래스(또는 인터페이스, 트레이트) 내부에 상수를 선언할 때 명시적으로 데이터 타입을 지정할 수 있게 되었습니다. 이를 통해 타입 불일치 오류를 컴파일 단계에서 확실히 방지하고, 코드의 계약(Contract)을 명확하게 유지할 수 있습니다.

예제:

class Connection {
    // 상수 이름 앞에 타입을 명시합니다.
    public const string DEFAULT_HOST = "localhost";
    public const int DEFAULT_PORT = 3306;
}

class CustomConnection extends Connection {
    // 부모 클래스의 상수 타입을 임의로 변경하여 재정의할 수 없습니다.
    // public const string DEFAULT_PORT = "3306"; // ❌ 에러 발생 (TypeError)
}

클래스 상수에 대한 보다 자세한 선언 규정과 가시성(Visibility) 제어 방법은 객체지향 단원의 클래스 상수 가이드를 참조하세요.



상세 학습 목차

다음 세부 단계를 통해 상수를 선언하고 활용하는 구체적인 문법과 활용에 대해 실습합니다.

  1. 상수의 타입: 상수가 지닐 수 있는 데이터 형식을 파악합니다.
  2. define() 함수: 런타임에 상수를 설정하는 표준 내장 함수입니다.
  3. const 키워드: 컴파일 시점에 상수를 생성하는 언어 키워드입니다.
  4. 상수 존재 확인: 특정 상수가 메모리에 정의되어 있는지 안전하게 확인합니다.
  5. 예약된 상수: 미리 정의된 내장 상수 및 문맥에 따라 변하는 마법 상수를 활용합니다.
서브목차