ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Struct (구조체) - Mapping & Array
    Solidity 2022. 4. 24. 14:55

     

    인프런에서 D_One 님의 20강 강의를 듣고 이에 대해 작성하는 것임을 말씀드립니다.

     

    Struct (구조체)

    • 나만의 타입 만드는 것
    • DB의 스키마와 같다고 생각한다.

     

    // SPDX-License-Identifier: GPL-3.0
    
    pragma solidity >= 0.7.0 < 0.9.0;
    
    contract structUser{
    	// 아래가 User라는 구조체 정의한 것
    	struct User{
    		string name;
    		string job;
    		uint256 age;
        }
        
        // 바로 값을 넣고 그것을 그대로 리턴 (이렇게 하면 여러개의 데이터는 못 넣는거 아닌가...?)
        function createStructUser(string memory _name, string memory _job, uint256 _age) pure public returns(User memory){
        	return User(_name, _job, _age);
        }
    }

     

    위의 방식보다는 Mapping이나 Array에 구조체를 많이 넣는다고 하니 그렇게 테스트 해보겠습니다.

     

    // SPDX-License-Identifier: GPL-3.0
    
    pragma solidity >= 0.7.0 < 0.9.0;
    
    contract structUser{
    	// 아래가 User라는 구조체 정의한 것
    	struct User{
    		string name;
    		string job;
    		uint256 age;
        }
     	
    	// mapping 선언 : mapping(타입 지정 => 구조체명) 접근 제한자 설정(public 등) mapping명(UserMapping) 
        mapping(string => User) public UserMapping;
        
        // 아래의 _key의 타입은 바로 위에서 설정한 mapping 데이터 타입과 일치해야 합니다.
        function createUserMapping(string memory _key, string memory _name, string memory _job, uint256 _age) public{
        	UserMapping[_key] = User(_name, _job, _age);
        }
        
        // key 값으로 UserMapping 조회
        // 포인트 부분 아래에서 따로 설명
        function getUserMapping(string memory _key) view public returns(User memory){
        	return UserMapping[_key];
        }
        
        // array 선언 : 구조체명[] 접근 제한자 설정(public 등) array명(UserArray)
        User[] public UserArray;
        
        // UserArray 데이터 삽입
        function createUserArray(string memory _name, string memory _job, uint256 _age) public{
        	UserArray.push(User(_name, _job, _age));
        }
        
        // UserArray 데이터 조회 (인덱스 기준)
        function getUserArray(uint256 _index) view public returns(User memory){
        	return UserArray[_index];
        }
    }

     

    getUserMapping

    1. 해당 key 값은 createUserMapping 때처럼 설정해둔 데이터 타입과 동일하게 해야 한다.
    2. returns(User memory) - 리턴되는 것은 User 구조체이고 string 타입이기에 memory라고 써야하는 듯한데 추후에 memory에 대해서도 다루겠습니다.
    3. 그러나 실제로 return 할 때는 key 값을 기준으로 찾기 때문에 key 값을 가지고 있는 UserMapping에서 값을 찾아야 하기에 위와 같이 작성해야 한다.

     

    createUserArray

    해당 함수의 첫 번째 줄은 다른 함수들과 사실상 동일해서 헷갈릴게 없지만 아래에 실제 데이터를 넣는 부분에서 조금 헷갈려서 써봅니다.

    array명.push(구조체명(입력값1, 입력값2 ...));

     

    getUserArray

    returns(구조체명 memory)

    return array명[해당 인덱스];

     

     

    < 결론 >

    구조체는 array 또는 mapping과 연결하여 사용이 많이 된다고 한다.

    returns 부분에는 실제 리턴될 데이터 정보(여기서는 구조체명과 data location 명시)를 입력해야 하고

    return 부분에는 원하는 데이터를 불러오기 위해 연결되어 있는 mapping명이나 array명을 입력해야 한다. 

     

     

    < 참고 자료 >

    D_One님 구조체 강의

    https://youtu.be/Q1EIEGfb9lg

     

    'Solidity' 카테고리의 다른 글

    구조체(struct)와 가스(gas) 관계  (0) 2022.05.11
    접근 제한자와 생성자  (0) 2022.05.11
    Solidity의 Array (배열) 사용법과 주의사항  (0) 2022.04.23

    댓글

Designed by Tistory.