배열
- 배열의 차원
- 배열의 값 호출
- 저장소 배열과 메모리 배열
- 동적 배열과 정적 배열
- 배열에서 지원하는 함수
배열의 차원
배열은 차원으로도 분류됩니다. 1차원 배열, 2차원 배열, 3차원 배열이 존재하며 각각의 선언 방식과 정리되는 방식을 예시를 보인다면 아래와 같습니다.
uint[3] arrayOne = [10,20,30];
uint[3][2] arrayTwo = [[1,2,3],[4,5,6]];
uint[3][2][2] arrayThree = [[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]];
1차원 배열의 예시는 arrayOne, 2차원 배열의 예시는 arrayTwo, 3차원 배열의 예시는 arrayThree입니다. 배열 저장된 값은 번호를 가지게 되는데 이것을 index라고 부르며 번호는 0번부터 시작하게 됩니다. arrayOne배열에 값과 index를 비교한다면 arrayOne [0] = 10, arrayOne [1] = 20, arrayOne [2] = 30의 값을 가집니다. 저장해둔 값을 호출을 할 때 이러한 index를 이용하여 호출을 하게 됩니다.
배열의 값 호출
위에서 배열을 선언하는 방법을 보았고 이번에는 선언한 값을 필요할 때 호출하는 방식을 설명드리겠습니다. 약간의 주의가 필요하여 따로 준비하였으니 꼭 확인하시기 바랍니다.
uint[3][2] arrayTwo = [[1,2,3],[4,5,6]];
위와 같은 2차원 배열의 값들이 정리가 되는 방식을 먼저 설명드리겠습니다. 위에 작성된 코드에 uint [3][2]는 해석을 한다면 uint [3]의 배열을 하나의 묶음으로 보고 그러한 묶음을 1차원 배열 uint [2]에 입력된다고 해석하시면 됩니다. 글로 설명하면 이해가 어려울 수 있어 아래에 코드로 작성하였습니다. 아래의 코드는 이해를 돕기 위한 코드이므로 실행되지 않습니다.
uint[3] a = [1,2,3];
uint[3] b = [4,5,6];
uint[2] arrayTwo = [a,b];
function print(uint _indexOne, uint _indexTwo) public returns(uint256){
return arrayTwo[_indexOne][_indexTwo];
}
배열의 값을 호출하는 함수와 같이 설명을 한다면 _indexOne값에 들어가는 수는 arrayTwo 배열에서 a인지 b인지 선택을 하게 되고 _indexTwo값에 들어가는 수는 a혹은 b 배열에서 어떤 숫자를 선택할 것인지 정하는 값이 됩니다. 따라서 3이라는 값을 얻고 싶을 때는 _indexOne은 0을 _indexTwo는 2를 가지게 되고 6이라는 갑을 얻고 싶을 때는 _indexOne은 1을 _indexTwo는 2를 가지게 됩니다. 그렇기 때문에 호출 시 주의하시길 바랍니다.
저장소 배열과 메모리 배열
배열은 저장되는 위치에 따라 저장소에 저장이 되는 저장소 배열과 메모리에 저장되는 메모리 배열로 나눌 수 있습니다. 메모리에 저장된 데이터는 컨트랙트의 실행이 종료되면 지워지고 저장소에 저장된 데이터는 블록체인에 저장되어 영구히 저장됩니다.
uint[4] arrayOne = [1,2,3,4];
위와 같이 배열을 선언하였을 때 arrayOne이 1, 2, 3, 4의 값을 가지는 배열이 되고 arrayOne이라는 배열이 저장소에 저장되어 arrayOne은 저장소 배열이 됩니다. 하지만 우변의 [1, 2, 3, 4] 배열은 값을 넣어주기 위해 선언된 배열로써 메모리에만 저장되어 메모리 배열이 됩니다. 우변의 값은 날아가더라도 arrayOne에는 이미 각각의 값이 저장되어있으므로 문제가 없습니다.
동적 배열과 정적 배열
배열을 선언할 때 배열의 크기가 코드에 의하여 정해져 있는 배열을 정적 배열, 코드를 실행하여 값의 입력에 따라 크기가 변하는 것을 동적 배열이라고 합니다.
uint[4] arrayStatic = [1,2,3,4];
uint[] arrayDynamically;
arrayStatic의 경우 uint [4]를 통하여 크기를 4로 지정하였기 때문에 정적 배열입니다. arrayDynamically의 경우는 uint []에서 알 수 있듯 크기를 입력하지 않았기에 함수를 통하여 크기를 늘리거나 줄일 수 있습니다.
배열에서 지원하는 함수
배열에서 지원하는 함수로는 length, push, pop, delete이 있습니다. 각각 활용하는 방법을 예시로 보인다면 아래와 갔습니다.
① length
uint[] arrayOne;
function arrayLength() public returns(uint256){
return arrayOne.length;
}
배열의 길이를 반환할 때 사용합니다.
② push
uint[] arrayOne;
function arrayPush(uint _indexOne) public{
arrayOne.push(_index);
}
배열의 마지막에 값을 추가합니다.
③ pop
uint[] arrayOne;
function arrayPop() public{
arrayOne.pop;
}
배열의 제일 최신 값 측 제일 마지막 index에 저장된 값을 삭제합니다. 따라서 배열의 길이도 삭제한 수만큼 줄어듭니다.
④ delete
uint[] arrayOne;
function arrayDelete(uint _indexOne) public{
delete arrayOne[_index];
}
입력한 index에 저장된 데이터 값을 0으로 만듭니다. 배열의 길이에 변화는 없습니다.