[Solidity] Mapping, Array, Enum

jhcha·2023년 7월 27일
0

Solidity

목록 보기
4/17
post-thumbnail

Mapping

url: https://solidity-by-example.org/mapping/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract Mapping {
    // Mapping from address to uint
    mapping(address => uint) public myMap;

    function get(address _addr) public view returns (uint) {
        // Mapping always returns a value.
        // If the value was never set, it will return the default value.
        return myMap[_addr];
    }

    function set(address _addr, uint _i) public {
        // Update the value at this address
        myMap[_addr] = _i;
    }

    function remove(address _addr) public {
        // Reset the value to the default value.
        delete myMap[_addr];
    }
}

contract NestedMapping {
    // Nested mapping (mapping from address to another mapping)
    mapping(address => mapping(uint => bool)) public nested;

    function get(address _addr1, uint _i) public view returns (bool) {
        // You can get values from a nested mapping
        // even when it is not initialized
        return nested[_addr1][_i];
    }

    function set(address _addr1, uint _i, bool _boo) public {
        nested[_addr1][_i] = _boo;
    }

    function remove(address _addr1, uint _i) public {
        delete nested[_addr1][_i];
    }
}

mapping은 키와 값으로 이루어진 오브젝트 객체와 같다.
mapping(keyType => valueType)

  • keyType은 bytes, string 같은 기본 자료형 타입을 가진다.
  • valueType은 array 혹은 다른 mapping 객체를 저장할 수 있다.
mapping(address => uint) public myMap;
function get(address _addr) public view returns (uint) {...}
function set(address _addr, uint _i) public {
function remove(address _addr) public {

set 함수를 통해 keyType에 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4 address 값을 입력하고, valueType에 135 에 해당하는 uint 값을 입력했다.

myMap[0x5B38Da6a701c568545dCfcB03FcB875f56beddC4] = 135

mapping valueType에 다른 mapping을 참조하는 경우 다음과 같이 작성할 수 있다.

mapping[keyType][another keyType] = another valueType
mapping[0x5B38Da6a701c568545dCfcB03FcB875f56beddC4][135] = true

Delete

  • delete는 Solidity에서 특정 변수를 기본 변수 값으로 재설정하기 위해 사용할 수 있다.
  • mapping keyType에 사용하면 해당 keyType과 valueType이 삭제된다.
  • 정적 배열은 모든 인덱스가 기본 값으로 재설정 되고, 동적 배열은 배열의 길이가 0으로 재설정 된다.

Array

url: https://solidity-by-example.org/array/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract Array {
    // Several ways to initialize an array
    uint[] public arr;
    uint[] public arr2 = [1, 2, 3];
    // Fixed sized array, all elements initialize to 0
    uint[10] public myFixedSizeArr;

    function get(uint i) public view returns (uint) {
        return arr[i];
    }

    // Solidity can return the entire array.
    // But this function should be avoided for
    // arrays that can grow indefinitely in length.
    function getArr() public view returns (uint[] memory) {
        return arr;
    }

    function push(uint i) public {
        // Append to array
        // This will increase the array length by 1.
        arr.push(i);
    }

    function pop() public {
        // Remove last element from array
        // This will decrease the array length by 1
        arr.pop();
    }

    function getLength() public view returns (uint) {
        return arr.length;
    }

    function remove(uint index) public {
        // Delete does not change the array length.
        // It resets the value at index to it's default value,
        // in this case 0
        delete arr[index];
    }

    function examples() external {
        // create array in memory, only fixed size can be created
        uint[] memory a = new uint[](5);
    }
}

배열 (Array)는 컴파일 과정에서 결정되는 정적 크기 배열과 동적 크기 배열이 존재한다.

  • 정적 배열
    • 컴파일 과정에서 배열의 크기가 결정된다.
    uint[10] public myFixedSizeArr;
  • 동적 배열
    • push, pop 함수를 통해 배열의 크기가 변경되는 것을 확인할 수 있다.
    uint[] public arr;
     uint[] public arr2 = [1, 2, 3];

remove 함수를 통해 동적 배열의 특정 인덱스를 삭제하는 경우 동적 배열의 길이는 같고, 해당 인덱스의 값만 기본 값으로 재설정 된다.

접근 제어자 (가시성 지정자)

  • 접근 제어자 혹은 가시성 지정자라고 하는 것은 변수 명 앞에 혹은 함수의 매개변수 뒤에 위치한다.
  • 접근 제어자는 해당 변수나 함수에 대하여 접근을 통제하기 위해 사용한다.
  • public, private, internal, external 4가지로 나누어진다.
    • public: 어느 곳에서든 접근 가능
    • private: private가 선언된 내부에서만 접근 가능
    • internal: private 처럼 internal 정의된 내부에서 접근 가능, 상속받은 자식들도 접근 가능
    • external: private와 반대로 외부에서만 접근 가능, 내부에서 접근 불가능

Enum

url: https://solidity-by-example.org/enum/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

contract Enum {
    // Enum representing shipping status
    enum Status {
        Pending,
        Shipped,
        Accepted,
        Rejected,
        Canceled
    }

    // Default value is the first element listed in
    // definition of the type, in this case "Pending"
    Status public status;

    // Returns uint
    // Pending  - 0
    // Shipped  - 1
    // Accepted - 2
    // Rejected - 3
    // Canceled - 4
    function get() public view returns (Status) {
        return status;
    }

    // Update status by passing uint into input
    function set(Status _status) public {
        status = _status;
    }

    // You can update to a specific enum like this
    function cancel() public {
        status = Status.Canceled;
    }

    // delete resets the enum to its first value, 0
    function reset() public {
        delete status;
    }
}

열거형 타입 (enumerated type)이라고 하는 enum은 관련이 있는 상수들의 집합을 의미한다.
enum은 첫 번째 원소부터 0으로 시작하는 값을 갖는다.
따라서, status의 초기 값은 0, Pending 상태와 같다.
cancel()은 Status enum의 4번째 원소, Canceled를 현재 status에 입력한다.
delete status는 status의 기본 값으로 재설정하기 때문에, 0, Pending이 된다.

Import

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
// This is saved 'EnumDeclaration.sol'

enum Status {
    Pending,
    Shipped,
    Accepted,
    Rejected,
    Canceled
}

enum Status라고 하는 열거형 타입을 enumDeclaration.sol 파일에 저장한다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

import "./EnumDeclaration.sol";

contract Enum {
    Status public status;
}

다음, import "./EnumDeclaration.sol" 를 통해 enum Status 열거형 타입을 사용할 수 있다.

0개의 댓글