IT/블록체인
[Solidity] mapping
KimCookieYa
2023. 9. 2. 03:51
mapping
mapping
은 Solidity에서 키(key)-값(value) 쌍을 저장하는 자료 구조이다. 이는 JavaScript의 객체(Object)/해시 테이블과 유사하며, 특정 키를 사용하여 값을 빠르게 검색할 수 있다.
기본 문법
mapping(keyType => valueType) public/external/internal/private mapName;
keyType
: 키의 데이터 유형을 지정한다. 이는uint
,int
,address
등과 같은 Solidity의 기본 타입일 수 있습니다.mapping
및dynamic arrays
는 키로 사용될 수 없다.valueType
: 저장할 값의 데이터 유형을 지정한다. 모든 데이터 타입이 가능하며, 다른mapping
및dynamic arrays
도 포함될 수 있다.public/external/internal/private
: 가시성을 지정한다.
예제
pragma solidity ^0.8.0;
contract Example {
mapping(address => uint) public balances;
function setBalance(address _address, uint _balance) public {
balances[_address] = _balance;
}
function getBalance(address _address) public view returns (uint) {
return balances[_address];
}
}
특징 및 주의사항
- 기본 값: 모든 키는 기본적으로 0 또는 해당 타입의 "zero state"를 가진다. 따라서 초기화되지 않은 키를 조회하면 0을 반환한다.
- 삭제:
delete
키워드를 사용하여 특정 키의 값을 제거할 수 있다. 제거 후 해당 키는 다시 기본값으로 초기화된다. - 열거 불가능:
mapping
은 기본적으로 열거할 수 없다. 즉, 저장된 모든 키-값 쌍을 순회할 수 있는 방법은 없다. - 저장 공간:
mapping
은 Ethereum의 저장 공간(Storage)에 데이터를 저장한다. 따라서 가스 비용이 발생할 수 있다. - 외부 사용 불가: 다른 스마트 컨트랙트에서
mapping
에 직접 접근할 수 없으므로, Getter 함수를 통해 접근해야 한다.
JavaScript의 객체와의 차이점
Solidity
의 mapping
과 JavaScript
의 object
는 표면적으로는 유사한 기능(키-값 쌍 저장)을 제공한다. 그러나 몇 가지 중요한 차이점이 있다. 이 차이점들은 각 언어와 환경의 본질적인 특성에서 기인한다.
주요 차이점
- 데이터 저장 위치
Solidity
의mapping
은 블록체인의 저장 공간(Storage)에 저장되므로 변경될 때마다 가스 비용이 발생한다.JavaScript
의object
는 메모리에 저장되며, 별도의 비용이 없다.
- 가시성 및 접근성
Solidity
의mapping
은 외부에서 직접 접근할 수 없어, Getter 함수를 제공해야 한다.JavaScript
의object
는 외부에서도 직접 접근 및 수정이 가능하다.
- 열거 가능성
Solidity
의mapping
은 열거할 수 없어, 저장된 모든 키-값을 알 수 없다.JavaScript
의object
는for...in
루프나Object.keys()
등을 사용하여 열거할 수 있다.
- 타입 제한
Solidity
의mapping
은 키와 값의 타입을 명시적으로 지정해야 한다.JavaScript
의object
는 동적 타이핑을 지원해 키와 값의 타입을 미리 지정할 필요가 없다.
- 기본 값 설정
Solidity
의mapping
은 사용되지 않은 모든 키가 기본적으로 0 또는 해당 타입의 "zero state"를 가진다.JavaScript
의object
에서 존재하지 않는 키를 조회하면undefined
를 반환한다.
장단점
- Solidity의 mapping
- 장점: 블록체인의 분산 저장 환경에서 안정적이고 빠른 데이터 접근을 제공한다.
- 단점: 가스 비용, 열거 불가능, 외부 접근 제한 등이 있다.
- JavaScript의 object
- 장점: 유연하고 다양한 데이터 타입을 쉽게 다룰 수 있다.
- 단점: 메모리에 저장되므로 휘발성이며, 블록체인과 같은 분산 환경에는 적합하지 않을 수 있다.
주 사용처
Solidity
의mapping
은 주로 스마트 컨트랙트에서 사용되며, 블록체인에서 안정적인 데이터 관리가 필요할 때 사용된다.JavaScript
의object
는 웹 개발을 비롯한 여러 애플리케이션에서 널리 사용된다.
이러한 차이점과 장단점을 고려하면, 두 구조가 유사해 보이지만 실제로는 다른 목적과 환경에 적합하다는 것을 알 수 있다.