Solidity 문법 - (26) enum

2023. 6. 4. 21:26BlockChain/Solidity 깨부수기 ( 유투브 강의 )

목차
1. enum
2. enum 예제코드

 

1. enum

 

enum을 사용하는 방법에 대해서 간단하게 알아보도록 하자.

 

enum을 사용하는 이유는 특정한 상태의 조건을 나타내기 위해서 사용한다.

 

enum 안에 여러가지 상태를 기술해놓고, 그 상태일 경우 어떤 동작을 할지 조건문을 써주는 식으로 활용이 가능하다.

 

 

선언 방법

enum [변수명] {
    [enum 변수명],
    [enum 변수명],
    [enum 변수명],
    ...
}

 

 

사용 방법

// 선언된 enum 사용
[변수명] 접근제한자 [enum 변수명]

// enum안의 값 사용법
[변수명].[enum 변수명]

 

 

2. enum 예제코드

 

 

다음의 코드는 각 함수를 실행할 때 enum을 이용해 상태를 변경해주는 컨트랙트이다.

 

차의 상태에 따라 시동걸기, 시동끄기, 운전중, 멈추기 등등을 나타낸다.

 

각 enum은 마지막 함수를 통해서 값을 출력했을 경우 uint8의 값으로 볼 수 있다.

 

출력값이 uint8이라고해서 returns안에 uint8이라고 적으면 안되고 enum 변수명을 적어주어야 에러가 나지 않는다.

 

인덱스와 같이 표현되므로 아래의 TurnOff, TurnOn, Driving, Stop은 각각 0, 1, 2, 3으로 표현된다.

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 < 0.9.0;

contract ExEnum{
    
    enum CarStatus{
        TurnOff,
        TurnOn,
        Driving,
        Stop
    }
    
    CarStatus public carStatus;
    
    constructor(){
        carStatus = CarStatus.TurnOff;
    }
    
    event carCurrentStatus(CarStatus _carStatus, uint256 _carStatusInInt);
    
    function turnOnCar() public {
        require(carStatus == CarStatus(0), "To turn on, your car must be turned off");
        carStatus = CarStatus(1);
        emit carCurrentStatus(carStatus,uint256(carStatus));
    }
    

    function DrivingCar() public {
        require(carStatus == CarStatus.TurnOn, "To drive a car, your car must be turned on");
        carStatus = CarStatus.Driving;
        emit carCurrentStatus(carStatus,uint256(carStatus));
    }
    
    function StopCar() public {
        require(carStatus == CarStatus.Driving, "To drive a car, your car must be turned on");
        carStatus = CarStatus.Stop;
        emit carCurrentStatus(carStatus,uint256(carStatus));
    }
    
    function turnOffCar() public {
        require(carStatus == CarStatus.TurnOn 
                || carStatus == CarStatus.Stop , "To turn off, your car must be turned on or driving");
        carStatus = CarStatus.TurnOff;
        emit carCurrentStatus(carStatus,uint256(carStatus));
    }

    function CheckStatus() public view returns(CarStatus) {
        return carStatus;
    }
}

 

위의 예제 코드는 솔리디티 깨부수기를 그대로 가져왔다.
https://github.com/D-One0914/BreakingSolidityBasic/blob/main/lec38.sol