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)
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
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;
uint[] public arr;
uint[] public arr2 = [1, 2, 3];
remove 함수를 통해 동적 배열의 특정 인덱스를 삭제하는 경우 동적 배열의 길이는 같고, 해당 인덱스의 값만 기본 값으로 재설정 된다.
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이 된다.
// 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 열거형 타입을 사용할 수 있다.