PHP Enum 설명: PHP 8.1 이상에서 Enum 사용 방법
요약
본 영상은 PHP 8.1 이상에서 도입된 Enum 기능을 설명합니다. 과거 상수(constant)를 사용하던 방식과 비교하며, Enum을 사용하면 특정 상태 값의 유효성을 강제하고 코드 안정성을 높일 수 있음을 보여줍니다. 개발자는 Enum을 통해 데이터 타입 자체에 제한을 걸어 오류 발생 가능성을 줄일 수 있습니다.
핵심 포인트
- PHP 8.1+에서 도입된 Enum은 C# 등 다른 언어와 유사한 기능을 제공합니다.
- Enum 사용 시, 정의된 케이스 중 하나여야 하므로 값의 유효성 검사가 강제됩니다.
- enum 이름과 콜론(:)을 사용하여 특정 케이스에 접근할 수 있습니다.
- 비교 연산자(===)를 사용하여 Enum 타입 간의 안전한 비교가 가능합니다.
영상: PHP Enums Explained: How to Use Enums in PHP 8.1+
채널: Dani Krossing
길이: 14분 17초
출처: 자막 (자동, 영어)
그러니까, 우리가 오랫동안 PHP에서 부족했던 것 중 하나는 enums라는 것이었습니다. 이는 C#와 같은 다른 언어에서는 이미 가지고 있던 기능입니다. 적어도 저는 Unity 내부에서 게임을 만들 때 C#에서 사용해 본 적이 있습니다. 그래서 enums를 설명하는 가장 좋은 방법은 과거에 실제로 코드를 작성하던 방식과, 이제 enums를 사용하여 어떻게 할 수 있는지의 예시를 드리는 것입니다. 예를 들어, 로그인 시스템이 있는 웹사이트가 있고 이 웹사이트 안에 여러 사용자들이 있으며, 저는 특정 상태를 가지고 싶습니다.
우리는 웹사이트 가입 요청이 아직 보류 중인지 확인하고 싶습니다. 아니면 사용자가 실제로 활성 상태인지 비활성 상태인지 확인하고 싶습니다. 과거에는 여기에 'status pending', 'status active', 'status inactive'와 같은 여러 상수(constant)를 만들었습니다. 그리고 이 상수는 우리가 다른 것들을 비교하는 데 사용할 수 있는 값을 가지고 있었습니다. 그렇죠? 그래서 함수 내부에서, 우리는 기본적으로 들어가서
저도 제 이름을 전달할 수 있습니다. 어떤 종류의 값이라도 전달할 수 있고 실제로 작동합니다. 오류 메시지가 뜨지 않을 겁니다. 제가 요청하는 것은 단지 문자열(string)일 뿐이니까요. 그래서, enums를 사용해서 할 수 있는 것은 enum 내부에 값을 미리 결정하고 그 값이 이들 중 하나여야 한다고 말하는 것입니다. 그리고 함수에 전달해야 하는 것이 enum이어야 합니다. 만약 여기서 다음 페이지로 이동하면, 제가 이제 enum을 생성한 것을 볼 수 있습니다. 이것은 C#에 대해 조금 알고 있다면 매우 익숙할 겁니다. 왜냐하면 이것이 C#에서 작동하는 방식과 거의 동일해 보이기 때문입니다.
하지만 기본적으로 우리는 enum을 정의하고 특정 이름을 붙여 호출합니다. 이 경우 저는 이것을 status라고 부릅니다. 그리고 단순히 몇 가지 케이스(case)를 만듭니다. 따라서 여기서는 pending, active, inactive를 만들었습니다. 이전 예제에서 했던 것처럼요. pending, active, inactive입니다. 하지만 대신에, 이 세 가지는 여기에 있는 enum 내부의 케이스들입니다. 그래서 제가 할 수 있는 것은 이것들을 상태(status)를 설정하는 매개변수로 실제로 사용할 수 있다는 것입니다. 즉, 이 enum의 일부여야 하는 코드 조각 안에서요.
그래서 저는 단순히 banana라고 쓸 수 없습니다. 그러면 실제로는 오류 메시지가 발생할 것이기 때문입니다. 왜냐하면 첫째로 유효한 값이 아니며, 둘째로 enum 내부의 값 중 하나가 아니기 때문입니다. 그리고 이 enum과 상호작용하는 몇 가지 다른 방법이 있습니다. 예를 들어, enum 내부의 케이스 중 하나에 접근하는 것입니다. 그래서 저는 변수(variable)를 enum 이름에 콜론(:)을 붙이고 그 케이스 이름을 할당할 수 있다고 말할 수 있습니다. 이 경우 여기서는 제가 enum 내부의 active 케이스에 접근하려고 합니다.
이제 우리는 '내장 속성(built-in property)'이라고 불리는 것에 접근할 수도 있습니다. 이 경우 name에 포인트를 하면 active를 출력하게 됩니다. 또한 비교 연산자도 사용할 수 있습니다. 예를 들어, 여기에 if 조건문이 있고, 위에서 만든 사용자 상태가 현재 active enum 케이스와 같은지 확인하고 싶다고 가정해 봅시다. 이때는 두 개의 등호가 아닌 세 개의 등호를 사용하여 확인할 수 있는데, 이는 최대한 안전하게 만들고 싶기 때문입니다. 그리고 이 값이 active라는 이름의 enum과 같은지 확인하고 싶습니다.
만약 같다면, 사용자 상태가 활성(active)이라고 출력하고 싶습니다. 그래서 이 새로운 예제에서는 enum 예제를 사용하는데, 이번에는 문자열로 정의합니다. 즉, status라는 enum이 있고, 각 enum 케이스에 할당되는 값이 문자열이라는 것입니다. 따라서 각 케이스에 값을 실제로 붙일 수 있습니다. 여전히 pending, active, inactive가 있으며, 이전과 정확히 같습니다. 하지만 이제 특정 용도로 사용할 수 있는 이 값도 붙어 있습니다.
아래로 내려가면 value 속성에도 접근할 수 있다는 것을 알 수 있습니다. 이전 예제에서는 name에 접근했습니다. 만약 여기에 active enum이 있고, name 속성에 포인트를 한다고 가정하면, 이것은 name 속성이기 때문에 'active'를 출력합니다. 그리고 value 속성을 출력하고 싶다고 하면, 실제로 무엇과 같은지 그 값을 출력하게 됩니다. 이 경우, 위에서 우리가 가진 'active' 문자열을 출력하는 것입니다. 따라서 이 enum 예제 안에는 두 가지 다른 속성에 접근할 수 있습니다.
물론, 다른 종류의 데이터 타입도 사용할 수 있습니다. 여기서는 정수(integer) 데이터 타입을 가진 priority라는 이름의 enum이 있습니다. 이 역시 low, medium, high와 같은 케이스를 가지고 있으며, 값은 각각 1, 2, 3입니다. 그리고 다시 한번, 이 다양한 케이스들의 값을 출력하고 싶다면, 그냥 해당 enum에 접근한 다음 콜론 두 개(::)로 특정 케이스를 지정하고, 그 다음 값 속성(value property)을 지정할 수 있습니다. 또한, 이러한 enum들에 사용할 수 있는 몇 가지 다른 메서드들도 가지고 있습니다. 예를 들어, 데이터베이스에서 가져온 값이 있다고 가정해 봅시다.
이 특정 사용자의 is_user_active라는 컬럼에서 값을 꺼내서 이 사용자가 현재 활성화되어 있는지 확인하려고 합니다. 그리고 이 값을 코드 내의 enum과 비교하고 싶습니다. 반대로는 어떻게 할까요? PHP 내부에서 from()이라는 것을 사용할 수 있는데, 이것은 기본적으로 값들을 다시 enum으로 변환해 줍니다. 예를 들어, 만약 제가 status라는 변수를 사용한다고 가정하고, 그 값이 이전 예제에서 다뤘던 Status::BACK과 같다고 해봅시다. 실제로 복사해서 붙여넣을 수 있도록 하겠습니다.
만약 여기에 붙여넣는다면, 특정 값을 이 특정 enum의 케이스 중 하나와 비교해 보고 싶을 때, 변수를 status::로 설정한 다음 from() 메서드를 사용하여 active가 이 특정 enum 내에 유효한 값인지 확인할 수 있습니다. 이 경우, active는 실제로 Active 케이스 안에 있는 값입니다. 따라서 만약 status를 출력하고 이름 속성(name property)을 지정한다면, status가 그 특정 문자열을 포함하는 특정 enum과 같기 때문에 active가 출력될 것입니다.
이 경우 여기서는 이름(name)을 사용하거나 값(value)을 사용할 수도 있으며, 그러면 'active'가 출력될 것입니다. 여기서 중요한 점은 from 메서드를 사용할 때, 예를 들어 제가 여기에 'banana'라고 입력한다면 (왜냐하면 'banana'는 이 특정 enum 내부에 실제로 존재하지 않기 때문입니다), 실제로는 ValueError를 발생시킨다는 것입니다. 따라서 이 값이 존재하지 않으면 웹사이트 내부에서 ValueError가 발생하게 됩니다. 그리고 여러분은 제 IntelliSense나 Copilot이 저에게 같은 것을 알려주는 것을 실제로 볼 수 있습니다. 그래서 이것은 꽤 멋진 것이고, 이것이 바로 아래에 있는 또 다른 예제인 tryFrom을 사용하는 이유입니다. 이는 기본적으로 from과 정확히 같은 일을 하지만, 만약 우리가 전달한 enum 내부에 특정 값이 존재하지 않아 확인하려고 할 때 웹사이트 내부에서 오류를 유발하는 대신, 단순히 null을 반환합니다.
따라서 이 아래 예제에서는 위에서 했던 것과 정확히 같은 것을 하려고 시도하지만, tryFrom 안에 'banana'를 전달하려고 합니다. 그리고 'banana'가 여기 오른쪽에 있는 값들 중 하나로 이 enum 내부에 존재하지 않기 때문에, 이것은 단순히 null을 반환합니다. 그런 다음 우리는 웹사이트 내부에서 사용자 정의 메시지를 발생시킬 수 있습니다. 예를 들어, 만약 null이 반환된다면, 저는 '만약 현재 status가 null과 같다면, 왜냐하면 banana가 존재하지 않기 때문에, 화면에 어떤 종류의 메시지를 출력할 수 있다'라는 if 문을 만들 수 있습니다. 이렇게 하면 웹사이트 내부의 사람들이 자신이 무언가를 잘못했거나 특정 상황임을 알게 됩니다.
여기서는 매우 다양한 작업을 수행할 수 있습니다. 따라서 이 두 가지 다른 방법을 사용할 때의 모범 사례는 다음과 같습니다. 웹사이트 내부 사용자로부터 데이터를 가져오거나 개발자인 우리가 통제할 수 없는 외부 데이터가 필요할 경우, try from을 사용하는 것이 좋습니다. 왜냐하면 from 메서드를 사용하게 되면 웹사이트 내부에 오류 메시지를 유발하기 때문입니다. 우리는 데이터가 잡히고 확인되는 과정에 대해 아무런 통제권이 없기 때문에, 문제가 생겼을 때 적절한 코드로 처리하는 대신 웹사이트 내부에 지속적으로 오류 메시지가 발생할 수 있습니다.
따라서 만약 그 값이 특정 방식이어야 한다는 것을 아는 것(예: 자체 데이터베이스)을 가져오는 것이라면 from을 사용하세요. 왜냐하면 이 경우 무언가 잘못되면 그것은 코드에 문제가 있다는 의미이기 때문입니다. 따라서 실제로 오류 메시지를 출력하려면 from을 사용해야 합니다. 하지만 사용자나 외부 웹사이트의 데이터라면 try from을 사용하여 웹사이트 내부에서 해당 오류를 어떻게 처리할지 실제로 제어할 수 있습니다. 예를 들어, 이전에 몇 가지 예제에서 사용했던 것과 동일한 enum 예제를 가져와 보겠습니다.
'사용자 상태 업데이트(update user status)'라는 함수를 만들고 싶다고 가정해 봅시다. 기본적으로 우리는 이 enum을 기반으로 사용자 상태를 업데이트하고 싶습니다. 제가 할 수 있는 것은 두 개의 매개변수를 전달하는 것입니다. 하나는 데이터베이스에서 올바른 사용자를 가져오기 위한 '사용자 ID(user ID)'이고, 다른 하나는 enum입니다. 즉, status라는 데이터 타입이 이 함수에 전달됩니다. 더 보기 쉽게 하기 위해 언랩(unwrap)할 수도 있습니다. 우리는 status를 실제 값 또는 이 값의 데이터 타입으로 전달하고, 그 후 '변수 상태(variable status)'라는 플레이스홀더를 만들 수 있습니다.
그리고 이것은 void를 반환할 것이며, 이는 기본적으로 값을 반환하고 싶지 않다는 의미입니다. 이 함수 내부에서 무언가를 수행하기만 할 것입니다. 따라서 실제 함수 내부에서는 사용자 업데이트와 해당 사용자 ID를 특정 값으로 출력(echo)하기만 원합니다. 즉, 우리가 사용자를 무엇으로 업데이트하든 그 값이 'banana' 같은 것이 아니라는 것을 확실히 보장하는 것입니다. 왜냐하면 그것은 코드 내에서 발생할 수 있는 오류일 수 있기 때문입니다. 따라서 대신 enum을 전달함으로써, 무언가 잘못될 경우 실제로 오류 메시지를 얻게 된다는 것을 절대적으로 확신할 수 있습니다. 왜냐하면 우리는 임의의 문자열이나 웹사이트 내부에서 이상함을 유발할 수 있는 다른 것이 아니라 enum 값을 전달하기를 원하기 때문입니다.
제가 아래에서 이 함수를 사용하는 방법은 단순히 함수를 참조하고, 사용자 ID로 하나를 전달하는 것입니다. 따라서 이것은 제 웹사이트의 첫 번째 사용자입니다. 그리고 'status::active'라는 enum을 간단히 전달하는데, 이는 제가 이 특정 함수를 사용하여 데이터베이스를 업데이트한다면, 이 사용자를 활성(active) 상태로 설정한다는 의미가 됩니다. 이렇게 하는 잘못된 예시로는 아래에 있는 예를 사용하는 것입니다. 여기서 저는 updateUserStatus라는 동일한 함수를 가져와서 사용자 ID로 다시 정수형을 전달하는데, 이것은 올바릅니다.
하지만 만약 'active'나 'banana' 같은 문자열을 전달하려고 시도한다면, 이는 enum이 아니기 때문에 실제로 타입 오류가 발생합니다. 저는 단지 문자열을 전달하려고 노력하고 있는 것이고, 이 부분이 상수(constants)를 사용하여 예전에 하던 방식과는 조금 다릅니다. 만약 제가 이것이 enum 타입을 요구하지 않는다면, 'banana'를 그냥 전달할 수 있고, 그것은 실제로 사용자 상태를 'banana'로 설정하여 데이터베이스를 업데이트하려고 시도할 것입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 YouTube Dani Krossing (Unity 인디)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기