Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 노개북
- blockchain
- 노마드코더
- 이더리움
- 정보처리기사
- node.js
- Non-Blocking
- 카카오페이지클론
- 페이지클론
- Klaytn
- 정보처리기사실기
- solidity
- git
- ETH
- 정보처리기사실기요약
- 솔리디티
- 비트코인
- npm
- it5
- ERC721
- it5분잡학사전
- 블록체인
- React
- 클레이튼
- 2021정보처리기사실기
- 카카오홈페이지클론
- ERC-721
- github
- web3.js
- 콜백함수this
Archives
- Today
- Total
Be lazy, Be crazy
STRUCT - 구조체 본문
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