Prototype Ghost
귀신일지
Prototype Ghost
전체 방문자
오늘
어제
  • 분류 전체보기 (29)
    • Hacking (1)
      • CTF (0)
      • Wargame (0)
      • Review (1)
    • C (12)
      • Crypto (12)
    • C++ (4)
    • Python (1)
    • Swift (1)
    • Blockchain (9)
      • Solidity (9)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 솔리디티
  • 암호화폐
  • C
  • solidity
  • openssl
  • 블록체인
  • ethereum
  • Bitcoin
  • c언어
  • C++
  • 비트코인
  • 이더리움
  • Blockchain
  • 정보보안
  • 리눅스
  • 암호화
  • 접근제어
  • 프로그래밍
  • 보안
  • 복호화

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Prototype Ghost

귀신일지

Solidity : 배열 다루기
Blockchain/Solidity

Solidity : 배열 다루기

2023. 6. 4. 01:22

시작하며


오늘은 간단하게 배열을 다루는 법에 대해 다루겠다. 사실 다른 언어와 비슷하게 작동하나 조금 헷갈리는 것들이 있어서

이 글에서 정리해보려고 한다. 코드를 확인해보자.

 

1. 배열 선언


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

contract arrHandle {
    uint[] public arr1;
    uint[10] public arr2;
}

위를 보면 사이즈를 그때그때 동적으로 처리하도록 크기를 안정할 수도 있고 밑에 arr2 처럼 크기를 미리 정할 수도 있다.

 

2. push, pop, delete


솔리디티에서 배열의 요소를 추가하고 싶을 때는 push, 마지막 요소를 제거하고 싶을 때는 pop, 그리고 특정 인덱스의 값을 지우고 싶으면 delete를 사용한다. 여기서 중요한 것은 pop은 실제 데이터를 삭제하여 배열의 길이가 줄어들지만, delete의 경우 특정 인덱스에 단순히 0을 넣어 길이가 줄어들지 않는다. 차이를 확인해보자.

 

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

contract arrHandle {
    uint[] public arr1;

    function pushData(uint data) public{
        arr1.push(data);
    }

    function popData() public{
        arr1.pop();
    }

    function deleteData(uint index) public{
        delete arr1[index];
    }

    function getLength() public view returns(uint){
        return arr1.length;
    }
}

리믹스에서 해당 컨트랙트를 deploy하고 테스트해보자.

위의 초기 상태에서 5번 push를 진행하고 길이를 확인해보자.

현재 push를 다섯번 진행했을 때, getLength를 실행하면 길이 5가 출력되는 것을 볼 수 있다.

해당 배열에는 0번 인덱스부터 순서대로 1, 2, 3, 4, 5를 넣었다.

여기서 pop을 실행했을 때 길이를 확인해보자.

우선 pop을 실행하는 순간 arr의 getter로 4번 인덱스의 값을 가져오려하자 에러가 발생한다. pop으로 마지막 인덱스 데이터가 제대로 지워진 것을 확인할 수 있다. 길이도 확인해보자.

getLength()를 호출 후 결과를 확인해보면 길이도 4로 줄어든 것을 확인할 수 있다. 그렇다면 delete는 어떨까?

현재 마지막이 지워져 1, 2, 3, 4가 저장되어있다. 0번째 인덱스를 delete했을 때 결과를 확인해보자.

 

왼쪽은 delete이후 0번째 인덱스의 값을 확인한 것으로, 1이 아닌 0으로 바뀐 것을 확인할 수 있다. 오른쪽은 getLength()의 결과로, delete를 했다고 해서 길이가 줄어 3이 나오는 것이 아니라 4가 나오는 것을 확인할 수 있다. 

 

마치며


  pop은 완전한 삭제를 가능하게 해주지만 마지막 요소만 지운다는 불편함이 있고, delete는 완전한 삭제는 아니지만 인덱스를 자유롭게 정할 수 있다는 장점이 있다. 만약에 pop으로 데이터를 완전히 지우면서 인덱스를 정하고 싶다면 지우고 싶은 인덱스를 마지막 요소와 swap해서 pop을 해야할 것이다. 또 delete를 사용한다면 0에 대한 check를 통해 해당 인덱스에 값이 지워졌는지 안지워졌는지 확인해야 할 것이다.

 

참고자료

https://www.yes24.com/Product/Goods/111099912

 

솔리디티 프로그래밍 완벽 가이드 - YES24

개발 경험이 없어도 쉽게 블록체인과 솔리디티를 이해할 수 있습니다!솔리디티는 스마트 컨트랙트를 구현하는 언어이며, 스마트 컨트랙트는 블록체인에서 작동하는 프로그램이다. 『솔리디티

www.yes24.com

https://dayone.tistory.com/19

 

솔리디티 강좌 18강 Array 배열

안녕하세요 지난 시간에 이어, array를 다뤄 보려고 합니다. 배열은 타입 [] 접근제한자 변수명 이런식 으로 정의 됩니다 // SPDX-License-Identifier:GPL-30 pragma solidity >= 0.7.0 < 0.9.0; contract lec18{ uint256[] publ

dayone.tistory.com

 

728x90
반응형

'Blockchain > Solidity' 카테고리의 다른 글

Solidity : 생성자, 인스턴스화, 상속, overriding  (0) 2023.06.05
Solidity : Event  (0) 2023.06.05
Solidity : memory와 storage, 그리고 문자열 비교하기  (0) 2023.06.01
Solidity : 함수 및 Modifier  (0) 2023.06.01
Solidity : 가시성 지정자  (0) 2023.05.31
    'Blockchain/Solidity' 카테고리의 다른 글
    • Solidity : 생성자, 인스턴스화, 상속, overriding
    • Solidity : Event
    • Solidity : memory와 storage, 그리고 문자열 비교하기
    • Solidity : 함수 및 Modifier
    Prototype Ghost
    Prototype Ghost

    티스토리툴바