Be lazy, Be crazy

STRUCT - 구조체 본문

BlockChain/솔리디티

STRUCT - 구조체

정신이 많이없는 개발자 2022. 5. 7. 14:48
728x90
반응형
오늘은 Solidity에서 사용되는 struct 구조체에대해서 간단하게 정리해 보려고합니다.
구조체라고 하면 사실 못알아 먹는 사람들이 더 많을 것 같다고 생각이됩니다.
예를 들어서 설명하는 습관은 나쁘다고 생각하지만 저 같은 초보자들에게는 처음에는 예시가 있어야 추상적인 개념들이 좀더 이해가 쉽기 때문에 예를 들어서 설명해보도록 하겠습니다.

우선적으로 타입스크립트를 공부해 보신분들이라면 Type을 만들어주는 작업이라고 생각하면 될것같습니다.
--- typeScript ---
type Person  = {
  name:string,
  age : number
}
이런식으로 작성하게 되면 Person이라는 타입으로 명시하게되면 위와같은 것만 사용해야 합니다. 
Person이라는 타입을 만들게되면 나중에 100명의 사람을 만들더라도 똑같은 형식을 사용하면 되기 때문입니다. 

솔리디티도 마찬가지로 구조체 === 타입이라고 생각하시면 편할 것 같습니다. 
--- solidity ---
struct Person {
 string name;
 uint age;
}

위에 타입스크립트와 솔리디티 비교를 한번 읽은다음 밑에 코드를 보게 되면 조금 더 이해가 쉬울 수 있습니다. 
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;


contract Structs {
    struct Car {
        string model;
        uint year;
        address owner;
    }

    Car public car;
    Car[] public cars;
    mapping(address => Car[]) public carsByOwner;

    function examples() external {
       //구조체를 초기화하는 3가지 방법 memory는 함수가 구동할때만 데이터를 가지고 있고 함수가 종료되면 데이터가 사라집니다.        
        Car memory toyota = Car("Toyota", 1990, msg.sender);
        Car memory lambo = Car({ year:1980, model:"Lamborghini", owner:msg.sender});
        Car memory tesla;
        tesla.model = "Tesla";
        tesla.year = 2010;
        tesla.owner = msg.sender;

        //그러기에 우리는 cars배열에 구조체를 넣어줄 것입니다.
        cars.push(toyota);
        cars.push(lambo);
        cars.push(tesla);

        //꼭 구조체를 초기화시킨다음 배열에 넣어주는 방식으로 하는것은 아닙니다. 
        // 바로 배열에 구조체를 넣어줄수도 있습니다.
        cars.push(Car("Ferrari",2020,msg.sender));
       

       //초기화가 진행되고 배열에 저장을 했으면 어떻게 읽어오고 데이터를 변환시킬까요?
       Car storage _car = cars[0];
       _car.year = 1999;
       delete _car.owner;

       delete cars[1];
    }  
}
결과적으로 위에 코드는 Car라는 구조체(model,year,owner)을 명시하는 구조체를 만들었습니다. 
Car[] public cars => Car구조체만담기는 배열을 만들었으며 변수명은 cars입니다.

1. Memory vs Storage
간단한게 storage는 지속적으로 기억이 되는 저장소이고 memory는 함수가 진행되는 동안에만 기억되는 저장소이다 .

2. Car구조체를 사용하는 방법 3가지
  1 )Car memory toyota  = Car("Toyota",1990,msg.sender)  Car구조체에 명시한 타입으로 원하는 값을 입력해준다. 
  2) Car memory lambo = Car({ year:1980, model:"Lamborghini", owner:msg.sender}); 구조체에 명시된 변수명을가
      가지고 {} 안에 직접적으로 넣어주면된다. 이럴경우에는 순서가 상관이 없다 
   3) Car memory tesla;
       tesla.model = "Tesla"; 
       tesla.year = 2010;
       tesla.owner = msg.sender;
   이렇게 tesla라는 Car구조체를 명시해주고 자바스크립트에서 객체에 값을 넣어주는 방식과 비슷하게 
   tesla.model | tesla.year | tesla.owner 직접적으로 넣어주는 방식이 있다 
   다시 정리해보자면 우리는 Car 구조체에에 값을 넣어보는 3가지 방법에 대해서 배워보았다.

3. 저장된 구조체 data값 변환 
cars.push(toyota);
//초기화가 진행되고 배열에 저장을 했으면 어떻게 읽어오고 데이터를 변환시킬까요?
Car storage _car = cars[0];  우리는 cars라는 배열에 Car값들을 넣어주었다.  cars[0] === toyota 
_car.year = 1999;  // 즉 toyota값은 1990이었는데 1999로 변환이된다. 
여기서 중요한점은 storage를 명시했다는 점이다.


이해가 안된다면 전체코드를 복사해서 remix.ethereum.org에서 직접 배포해보고 함수를 구동시키면서 
글과 함께 test및 비교를 해본다면 조금더 이해가 쉽게 될 거라고 생각한다. 

  
반응형

'BlockChain > 솔리디티' 카테고리의 다른 글

Mapping && Iterable Mapping  (0) 2022.03.22
Array Remove  (0) 2022.03.22
Array  (0) 2022.03.15
FunctionOutputs  (0) 2022.03.14
FunctionModifier  (1) 2022.03.13
Comments