[TIL] 2023-05-04 DAY34
오늘 배운것들
- Solidity 코딩
1) 변수의 크기
2) array
3) string과 bytes 형변환
4) struct
각종 팁
- 컴공 수업 중 강사님 추천 강의
- operating system
- data structure
- algorithm
- 무료 대학강의 사이트들
http://www.kmooc.kr/
https://ocw.mit.edu/
http://www.kocw.net/home/index.do
회고
- 임베디드에서 작은 메모리 용량을 최대한 활용하기 위해 변수의 할당량을 줄이듯, 솔리디티에서 가스비를 절약하기위해 변수의 크기를 고려하는 것이 좋다. -> 가스비때문에 자원관리 필요
- 초보들이 가장 많이 하는 실수는 에러메세지를 무시하는 것 -> 에러 메세지를 잘 읽어서 수정하는 것이 가장 빠르고 좋은 방법이다.
변수 크기
✔ 1byte = 8bit
✔ 16진수 = 2진수(bit) 4자리 = 4bit
✔ 16진수 2자리 = 8bit
✔ => uint는 byte 단위
✔ uint -> uint256
✔ bytes32 -> bytes 무제한
✔ => 만약 트랜잭션 자리수를 넣을 경우 가스비까지 고려하면 bytes말고 bytes32가 더 효율적임.
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.18;
/*
실습가이드
1. 10 넣어보기, 0x10 넣어보기 -> 각각 차이 보기
2. setABCD에서 b에 256 넣어보기 -> b는 uint8 -> 2자리까지 -> 256은 100 -> 자리수 넘어감
3. setABCD에서 0x1234 모두 넣어보기 -> b는 uint8 -> 2자리까지 -> 256은 100 -> 자리수 넘어감
*/
contract UINT {
uint a;
uint8 b; // 8bits = 1 byte = 16진수 2자리 = 0 ~ ff(16진수) = 0 ~ 255(10진수)
uint16 c;
uint256 d;
function setABCD(uint _a, uint8 _b, uint16 _c, uint256 _d) public {
a = _a;
b = _b;
c = _c;
d = _d;
}
function setABCD2(uint8 _a, uint8 _b, uint8 _c, uint8 _d) public {
a = _a; // 준비한 것은 64자리, 들어온 것은 2자리 -> 문제없음
b = _b; // 준비한 것과 들어온 것 일치
c = _c; // 준비한 것은 4자리, 들어온 것은 2자리 -> 문제없음
d = _d; // 준비한 것은 64자리, 들어온 것은 2자리 -> 문제없음
}
/*
function setABCD3(uint256 _a, uint256 _b, uint256 _c, uint256 _d) public {
a = _a;
b = _b; // uint8로 선언되었는데 들어오는 값은 더 큰 uint256
c = _c; // uint16로 선언되었는데 들어오는 값은 더 큰 uint256
d = _d;
}
*/
function getABCD() public view returns(uint, uint8, uint16, uint256) {
return (a,b,c,d);
}
function getABCD2() public view returns(uint, uint, uint, uint) {
return (a,b,c,d);
}
/*
function getABCD2() public view returns(uint8, uint8, uint8, uint8) {
return (a,b,c,d);
a, d // 준비한 것은 uint256인데, 내보내는 값은 uint8 밖에 안됨 -> 준비한 값의 일부 날라감
}
*/
}
array: 같은 자료형들이 들어있는 집합 -> 한개의 자료형만 들어갈 수 있음
형태: 자료형[] array이름
// uint array
contract Array {
// array = 같은 자료형들이 들어있는 집합
uint[] numbers;
string[] letters;
// 1. 넣기
function push(uint _a) public {
numbers.push(_a);
}
// 2. 빼기
function pop() public {
numbers.pop();
}
// 3. 보기
function getNumber(uint _a) public view returns(uint) {
return numbers[_a-1]; // 배열이름(n번째)
}
// 4. 길이
function getLength() public view returns(uint) {
return numbers.length;
}
// 5. 바꾸기
function changeNum(uint _k, uint _z) public {
numbers[_k-1] = _z;
}
// 6. 삭제
function deleteNum(uint _n) public {
delete numbers[_n]; // 삭제된 숫자는 사라지는 것이 아니라 0으로 변경됨 -> 길이는 유지됨
}
// 7. 전체 array 반환
function returnArray() public view returns(uint[] memory) {
return numbers;
}
}
struct: 여러 타입의 자료들을 모음
형태: 구조체 선언 struct 구조체명 {.../.../...}
contract Struct {
// 퀴즈: 이름, 성별, 번호, 생년월일을 가진 학생 구조체를 만들고 학생형 s라는 변수를 선언하시오.
// 그 후에, s에 값을 넣는 함수와 s의 값을 반환하는 함수를 만드세요.
struct Student {
string name;
string gender;
uint number;
uint birth;
}
Student s;
Student[] students; // Student형 변수들의 array students
function setStudent(string memory _name, string memory _gender, uint _number, uint _birth) public {
s = Student(_name, _gender, _number, _birth);
}
function getStudent() public view returns(Student memory) {
return s;
}
function pushStudent(string memory _name, string memory _gender, uint _number, uint _birth) public {
students.push(Student(_name, _gender, _number, _birth)); // 배열명.push(구조체명(구조체 정보들))
}
function popStudent() public {
students.pop();
}
function getLength() public view returns(uint) {
return students.length;
}
function getStudent(uint _n) public view returns(Student memory) {
return students[_n-1];
}
function getStudents() public view returns(Student[] memory) {
return students;
}
}
어떤 경우에 에러가 나는지 확인
-> 함수의 이름이 같아도 허용이 되는 경우는 input의 갯수가 다를때 뿐이다.
글이 너무 길어지므로 github에서 확인