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및 비교를 해본다면 조금더 이해가 쉽게 될 거라고 생각한다.
반응형