본문 바로가기
전공공부/블록체인공학

Solidity 구조체

by 으노으뇨 2021. 11. 22.
728x90
반응형
SMALL

1. 구조체 개요

정의

구조체 : 서로 다른 자료형을 하나의 이름으로 묶는 자료형

이더리움의 데이터베이스를 활용하기 위해서 구조체 정의 및 구조체 배열 사용 필요
표현

구조체 표현 

구조체 이름 [ ] 배열이름 ;
구조체 이름 [ ] public 배열이름;

배열과 유사하다고 보면된다.

 Struct  구조체 이름 {
 자료형 변수명;
 ..
 자료형 변수명;
 }
 
 즉 구조체 이름 [ ] 배열이름
구조체 개요

구조체 배열 표현

일반적 : 구조체 변수 선언 후 값 삽입

배열 : .push 사용, 이 경우, 대다수 동적배열을 사용하기 때문에 배열의 맨마지막에 넣어주기위해 사용한다.

그래서 구조체 배열을 표현하는 방법으로는

방법 1:
구조체 이름 [] 배열이름;
구조체이름 변수 = 구조체이름(맴버값들);
배열이름.push(구조체 변수);

방법 2:
구조체이름[] 배열이름;
배열이름.push(구조체이름(맴버값들));

예제

//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.10;

contract Struct {

    struct St{
        uint no;
        string name;
    }
    St kim = St(10101,"kim");

}

St kim - St(1010,"kim");과 같이 우리가 일반적으로 사용하는 프로그래밍 언어처럼 사용할 수 있다.

그리고 다른 방법으로는 

pragma solidity ^0.6.10;

contract Struct {

    struct St {
        uint no;
        string name;
    }
    //St kim = St(10101, "kim");

    St[] stClass1.push(St(20,"kim"));

}

이렇게 넣어 줄수 있는 것이다.


예제

//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.10;

contract Structor2 {

    struct St {
        uint no;
        string name;
    }
    St[] ss1;
    St[] public ss2;
}

위의 코드는 St라는 구조체의 데이터 타입을 가지고있는 "배열" ss1, public 형태의 "배열" ss2를 선언해준것이다.


예제

//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.10;

contract Insertvalue {
    struct St{
        uint no;
        string name;
       
    }
    St[] stClass1;
    
    St kim=St(20,"kim")
    stClass1.push(kim);
    //이 두줄을 한줄로 줄일수있다.
    stClass1.push(St(20,"kim"));
}

앞서 작성한 코드와 같다. 그런데 이렇게 값을 넣는 방법이 두가지가 있고 실전으로도 사용할수있다는것을 강조하기 

위해 두번 작성했다.


2. 구조체 배열

함수사용(값 삽입)
function 함수이름(구조체 멤버 자료형 구조체 멤버이름...){

구조체변수 이름.push(구조체 이름(멤버이름, 멤버이름, 멤버이름...));

}

우리가 실제로 사용할때 위와같이 사용할 수 있다. 안에 unit, int 등등을 넣어서 쓸수있다.

예제

//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.10;

contract Functionstruct {
    struct St{
        uint no;
        string name;
    }
    St[] public st;
    function createSt(uint_no, string_name){
        st.push(St(_no,_name));
    }
}

해당 구조체를 만들었다. 이제 함수를 통해 값들을 넣을 수 있게 만든것이다.

함수 매개변수를 통해 uint no, string name이 입력받을 수 있고, 이 입력받은 것들이 push되어 삽입되는 것이다.

함수 사용(값 출력)
function 함수이름(uint index로 사용할 변수이름) public view returns (구조체 멤버 자료형 구조체 멤버이름2...){
멤버이름2=구조체이름[index로 사용할 변수이름].변수이름;
...
}

저장되어있는 구조체 배열중에서 특정한 값을 가져올때는 인덱스를 이용해서 꺼내오는 것이다.

구조체이름[0] 이러면 0번째 즉 첫번째값을 가져오는 등 배열의 기초를 지켜서 꺼내올수가있다.

실제로 해보자!!

//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.10;

contract Functionget {

    // SPDX-License-Identifier: UNLICENSED
    struct St {
        uint no;
        string name;
    }
    St[] public st;

    function setSt(uint_no, string_name) {
        st.push(St(_no, _name));
    }
    function getSt(uint_num) public view returns(uint noo, string namee) {
        noo = st[_num].no;
        namee=st[_num].name;
    }

}

언더바 _num에 숫자를 넣으면 해당 인덱스 순서의 값이 나오게 된다. 셋함수로 이런저런 값을 넣어준다면

넣어준 순서대로 값이 들어가게 될것이다. 

그리고 그 순서대로 출력을 원하면 0번부터 시작하는 인덱스로 해당 순서의 숫자를 입력해주면 나올것이다.

직접 실행해보겠다.

버전은 ^0.4.18 버전으로 했다

값을 넣어주고 

트랜잭트를 한다면 지금은 리믹스 환경에서 해서 그렇지 실제로는 해당 계약의 모든값과 모든것들이 이 값을 공유하게

되는것이다.

1이라는 수를 넣고 kimhy 을 넣고 트랙젝트 (그럼 해당 St라는 구조체 형태의 배열에 첫번째로 셋팅이된다)

두번째로도 2라는 수와 leehy를 넣어주었다. 이는 첫번째와 마찬가지로 다음순번으로 값이 저장되게 된다.

그다음 get함수를 통해 0번째 인덱스의 값을 가져오게 한다면 1과 kimhy값을 얻을 수 있게된다.

마찬가지로 함수 get을 통해 1을 입력하면 값들을 얻을 수 있다.


해보기2

pragma solidity ^0.4.18;

contract Practice {
    struct Customer{
        uint no;
        string name;
        string level;
    }
    Customer store1 = Customer(1, "KimEunHo","Gold");
    
    function getCustomer() public view returns(uint no, string name, string level){
        no=store1.no;
        name=store1.name;
        level=store1.level;
    }
}

컴파일이 완료된다면 디플로이환경으로 들어가서 디플로이 버튼을 눌러주자.

그리고함수 "겟커스토머"를 실행하면

값들을 얻을 수 있따.


해보기3

//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.10;

contract Practice2 {

    struct Customer {
        uint no;
        string name;
        string level;
    }
    Customer[] public store1 ;
    function setCustomer(uint _no, string _name, string _level){
        Customer.push(Customer(_no,_name,_level));
    }
    function getCustomer(uint _num) public view returns(uint no, string name, string level){
        no=Customer[no].no;
        name=Customer[name].name;
        level=Customer[level].level;
    }
}

앞서는 구조체를 그냥 사용했다면 지금은 구조체를 배열 store1으로 생성해서 사용했다. 그래서 푸쉬도 쓰고 그랬다.

똑같이 컴파일해주고 디플로이해주면

해당 값을 넣고 얻을 수 있는 함수들이 있다.

총 2개를 넣어주고~

값들이 모두 잘나온다.

그리고 그 밑에 store1이 있다. 음... 이건 만든 함수는 없는데 무었일까? 한번 값들을 똑같이 넣어보자

결국 이 배열의 인덱스에 따라 나오게끔 되는 기능이 있는 것이다.

728x90
반응형
LIST

댓글