ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Solidity의 Array (배열) 사용법과 주의사항
    Solidity 2022. 4. 23. 13:40

     

    코딩을 처음 막 배우기 시작했을 때 개인적으로 배열이 다루기 쉬워서 뭘 해도 배열인 리스트만 썼던 기억이 납니다.

     

    Solidity에서 값을 찾는 부분에서는 Mapping(Python의 딕셔너리) 보다는 효율이 떨어지지만 반복문을 쓸 수 있다는 장점 또한 있어서 필수적인 존재이기도 하고 직접 테스트하다 보니 생각과 달랐더 부분이 있어서 이 점 공유하고 싶어서 글을 씁니다. (일반적으로 Key와 Value로 이뤄져있는 딕셔너리가 값을 빨리 찾기 위해 나왔기에 Solidity에서만 그런 것이 아니라는 점을 말씀드립니다.)

     

    이 글은 D_One 님 강의 중 18강 Array 배열 강의를 통해 배우고 학습했던 것을 쓰고 있다는 점을 다시 한번 말씀드립니다.

     

     

    배열

    저장하고 싶은 데이터들을 묶는 것인데 이렇게 저장한 각각의 데이터는 인덱스(순서)를 가지고
    이를 통해 원하는 값을 가져오고 반복문을 사용할 수 있습니다.

     

    주의사항

    1. 주 작업이 많은 데이터 중에서 값을 찾는 것이라면 배열보다 Mapping이 효율적이기에 이를 고려해야 합니다.
    2. 만약 사용한다면 배열의 길이를 제한하는 것을 추천한다. (50 정도로)
    3. 보통 반복문을 사용하고자 배열을 쓰는데 해커들이 이를 이용하여 악의적으로 무한 반복문을 통해 이더리움 서버를 과부하시킬 수 있습니다.

     

    // SPDX-License-Identifier: GPL-3.0
    
    pragma solidity >= 0.7.0 < 0.9.0;
    
    contract arrayTest{
    	uint256[3] public priceArray;
        
        // priceArray 길이 리턴
        function lengthPrice() view public returns(uint256){
        	return priceArray.length();
        }
        
        // priceArray 마지막 인덱스 이후에 값 추가 (배열 길이 제한시 사용 불가능)
        function pushPrice(uint256 _price) public{
        	priceArray.push(_price);
        }
        
        // priceArray 해당 인덱스의 값 변경
        function changePrice(uint256 _index, uint256 _price) public{
        	priceArray[_index] = _price;
        }
        
        // priceArray 해당 인덱스 값 리턴
        function getPrice(uint256 _index) view public returns(uint256){
        	return priceArray[_index];
        }
    }

     

    원리를 생각하면 당연한 것일지 모르지만 알게 된 점들은 아래와 같습니다.

    1. 배열의 길이를 제한하면 push 함수를 쓸 수 없다.
    2. 길이를 제한한 배열의 길이를 조회하면 그 제한한 값이 리턴됩니다.
      위의 경우에는 lengthPrice 함수의 리턴 값은 3이 됩니다.

    배열 길이 제한할 경우 push 함수를 쓰려고 하면 타입에러가 발생합니다.

     

    제가 생각했던 것은 길이를 제한한 배열의 경우 그 길이를 조회하면 값이 없다면 0이 리턴되고 값이 있다면 그 길이만큼 리턴되는 것을 예상했는데 직접 해보니 제한한 길이의 값을 리턴하는 것을 알 수 있었습니다.

     

     

    그리고 값을 삭제하는 기능은 같은 popdelete 함수의 차이점을 쓰고 마무리하고자 합니다.

    해당 인덱스 삭제 여부가 다르기에 그 결과에 따라 배열의 길이 값도 변경된다.

    // SPDX-License-Identifier: GPL-3.0
    
    pragma solidity >= 0.7.0 < 0.9.0;
    
    contract arrayTest{
    	uint256[] public priceArray;
        
        // 마지막 인덱스의 값 삭제 (해당 인덱스도 삭제하기에 배열의 길이도 변경된다)
        function popPrice() public{
        	priceArray.pop();
        }
        
        // 해당 인덱스의 값만 삭제 (해당 인덱스는 그대로 존재하고 값만 삭제되기에 배열의 길이는 그대로이다.)
        function deletePrice(uint256 _index) public{
        	delete priceArray[_index];
        }
    }

     

    이제 막 시작해서 제가 잘 모르는 부분도 많을 수 있습니다.

    틀린 부분 있으면 언제든 댓글로 알려주시면 수정하겠습니다.

    감사합니다!

     

     

    < 참고 자료 >

    D_One 님 강의를 토대로 작성했습니다. (인프런과 유튜브에서 보실 수 있습니다)

    https://inf.run/KwvJ

     

    'Solidity' 카테고리의 다른 글

    구조체(struct)와 가스(gas) 관계  (0) 2022.05.11
    접근 제한자와 생성자  (0) 2022.05.11
    Struct (구조체) - Mapping & Array  (0) 2022.04.24

    댓글

Designed by Tistory.