상세 컨텐츠

본문 제목

솔리디티 강좌 18강 Array 배열

솔리디티 깨부수기 - 기본

by D_One 2021. 9. 18. 13:12

본문

 

 

안녕하세요 

 

지난 시간에 이어, array를 다뤄 보려고 합니다.

 

배열은 타입 [] 접근제한자 변수명   이런식 으로 정의 됩니다

 

// SPDX-License-Identifier:GPL-30
pragma solidity >= 0.7.0 < 0.9.0;

contract lec18{

    uint256[] public ageArray; 

}

 

위에 보시는 바와 같이 ageArray가 정의가 되었습니다.

 

배열은 mapping과 다르게 length 값을 구 할수 있습니다.

// SPDX-License-Identifier:GPL-30
pragma solidity >= 0.7.0 < 0.9.0;
 
contract lec18{
    
    
    uint256[] public ageArray; 
    
    function AgeLength()public view returns(uint256) {
        return ageArray.length;
    }
    
    
}

배열에는 값을 넣거나 뺄수도 있답니다.

물론 다른 언어와 똑같이 인데스는 0 부터 시작한답니다.

 

// SPDX-License-Identifier:GPL-30
pragma solidity >= 0.7.0 < 0.9.0;
 
contract lec18{
   
    uint256[] public ageArray;
    
    function AgePush(uint256 _age)public{
        ageArray.push(_age);
    }


}

위에 AgePush는 배열인 ageArray 에 uin256 타입인 값을 넣어 준답니다.

예를들어 10 을 맨처음에 넣는다면 인데스 0 의 값은 10이 되겠네요. 

 

만약에 인덱스 0의 값을 다시 수정하고 싶다면  밑의 코드 처럼 하면 된답니다.

// SPDX-License-Identifier:GPL-30
pragma solidity >= 0.7.0 < 0.9.0;
 
contract lec18{
    
    uint256[] public ageArray;

    function Agepush(uint256 _age)public{
        ageArray.push(_age);
    }
    function AgeChange(uint256 _index, uint256 _age)public{
        ageArray[_index] = _age;
    }

}

AgeChange 처럼 배열의 특정 인덱스 값을 지목 해주고, 거기에 값을 넣어주면 됩니다.

여기서 주의 해야할점은 아직 배열이 생성되지도 않았는데 값을 넣으면 오류가 납니다.

예를들어, 현재 저희는 인데스 0에 10 이라는 값 만 넣었습니다.

그런데 저희가 AgeChange(11,55)를 한다면 에러가 납니다.

왜냐하면 배열의 인데스 11 은 아직 생성되지도 않았기때문이죠.

 

인제 배열의 값을 지워 볼게요, 

지우는 방법은 두가지 예요, 

Pop 과 delete 입니다.

 

Pop: 가장 최신의 값을 지운다/ length 도 줄어든다 

예를 들어, |1|2|3|4| 라는 배열이 있다고 가정합니다.

현재 이 배열의 길이는 4 입니다.

그리고, 인데스는 0 부터 시작하니, 3 까지 있겠네요.

즉 인덱스 3 은 마지막 값인 4 를 나타 내겠죠.

 

그러면 저희가 Pop을 쓴다면, 마지막 값인 4 가 사라지고, 길이도 3 으로 줄어들게 됩니다. 

 

delete : 원하는 인덱스의 값을 지운다, 그러나 length 는 줄어들지 않는다

delete를 쓰면 원하는 값에 0 이나 null 넣어서 기존의 값을 비워 줍니다, 그렇기때문에 길이는 줄어들지가 않아요.

 

// SPDX-License-Identifier:GPL-30
pragma solidity >= 0.7.0 < 0.9.0;
 
contract lec18{
    
    
    uint256[] public ageArray;

    function AgePop()public {
        ageArray.pop();
    }
    
    function AgePop(uint256 _index)public {
        delete ageArray[_index];
    }

    
    
}

 

좀 더 나아가서, 

애초에 배열값을, 미리 넣어주거나, 사이즈를 미리 넣어줘 제한을 걸수도 있습니다.

 

// SPDX-License-Identifier:GPL-30
pragma solidity >= 0.7.0 < 0.9.0;
 
contract lec18{
    
    uint256[10] public ageFixedSizeArray;
    string[] public nameArray= ["Kal","Jhon","Kerri"];
    
}

 

자 그러면 총 코드는 이렇게 된답니다.

// SPDX-License-Identifier:GPL-30
pragma solidity >= 0.7.0 < 0.9.0;
 
contract lec18{
    
    
    uint256[] public ageArray;
    uint256[10] public ageFixedSizeArray;
    string[] public nameArray= ["Kal","Jhon","Kerri"];
  
    function AgeLength()public view returns(uint256) {
        return ageArray.length;
    }
    
    function AgePush(uint256 _age)public{
        ageArray.push(_age);
    }
    function AgeChange(uint256 _index, uint256 _age)public{
        ageArray[_index] = _age;
    }
    function AgeGet(uint256 _index)public view returns(uint256){
        return ageArray[_index];
    }
    function AgePop()public {
        ageArray.pop();
    }
    
    function AgePop(uint256 _index)public {
        delete ageArray[_index];
    }


}

영상 참고 해주세요

관련글 더보기