오늘은 스몰토크가 없이 수업 시작했어요.......
방금 밥먹어서 그런가 아주 졸리고 졸리네요ㅎㅎ
오늘부터 아침에 호수공원 산책하기로 마음먹었거든요.
날씨가 아주 좋더라구요!! 다음주 월요일부터 오운완도 올릴꺼에요
ㅋㅋㅋㅋㅋㅋㅋㅋㅋ
uint 256bit
(1byte=8bit) >> 32byte
표현할 수 있는 최댓값이 다르다!
uint8 >> uint 중 가장 작은 단위
uint256 >> 가장 큰 단위 >> 255까지 표현 가능함!!
ㄴ 두자리까지 가능 , FF(16)=255(10)
이부분 하시면서 진수 관련해서 10분정도 설명해주셨는데
나는 사실 너무 재밌었다. 진수 바꾸는거 재밌지 않나...?ㅋ..ㅋ.... 옛날에 장교수님 디논 듣는 기분이었어요ㅎㅎ
.
.
.
contract UINTBYTES {
uint a;
uint8 b;
uint16 c;
uint256 d;
function setABCD(uint _a, uint8 _b, uint16 _c, uint256 _d) public {
a=_a;
b=_b;
c=_c;
d=_d;
}
function에서 uint8을 uint16으로 바꾸게 된다면
상단에서 b는 uint8로 선언했기 때문에 오류.
function에서 uint16을 uint256으로 바꾸게 된다면
상단에서 c는 uint16으로 선언했기 때문에 오류.
uint256과 uint는 같다.
function에서 uint256을 uint8로 바꾸게 된다면
상단에서 uint256으로 선언했으니 d는 256bit까지 사용할 수 있고, function에서 d는 8bit까지만 표현하라고 했으니 오류 없이 가능한 것이다!
input할때는 원래 선언했던 것보다 짧은 건 상관없음! 선언한 애가 감당이 가능하면 되는 것이다!!
설명을 잘 못하겠네...
암튼 민서강사님의 찰떡같은 설명을 듣고 이것밖에 못쓰는게 상당히 아쉽긴한데,,
그래도 이거읽고..느낌정도는...오겠지.....
// 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 밖에 안됨 -> 준비한 값의 일부 날라감
}
*/
}
아까 uint에서 공부했듯이
1Bytes = 8bits = 두자리 이다.
아래와 같이 set을 하면 c에서 오류가 발생한다.
c에는 4자리값을 받으라고 했는데 두자리만 입력해서 오류가 발생하는 것이다.
c에 4자리를 주면 잘 동작한다.
bytes32를 사용하게 된다면, 입력값은 무조건 64자리가 되어야 오류가 발생하지 않는다.
그러니까 bytes는 입력값의 자릿수가 명확할 때 사용하는 것이 좋겠다!!
bytes32는 딱 64자리만 들어갈 수 있는데,
bytes는 거의 무한대로 들어갈 수 있다고 보면 된다!!
string은 동적, bytes1는 정적이기 때문에 매칭이 안된다.
그렇기 때문에 Bytes->String으로 변환하려면 bytes memory로 해야한다!!
Array : 같은 자료형들이 들어있는 집합
Array 정의 : 타입[] 배열이름
ex) uint[] number
pop 은 가장 늦게 들어온 값이 가장 먼저 빠져나가는 LIFO이다.
직관적으로보면 이렇다.
값을 전달한 후 pop을 하면 된다.
일단은 이 정도로만 알라고 하셨다.
이거 반복하시는거 보니까 시험에 나올거같아여
동적은 자릿수 안정해져있는거
정적은 자릿구 정해져있는거
bytes1 이런거는 자릿수가 정해져있ㅇ으니까 정적!
bytes 자체는 동적이지만, bytes(1) 이런식으로 만들어줄 수 있다.
성공!
사실 이 부분 할 때 너무 졸려서 제대로 못들어가지구...
이따 저녁에 복습해봐야겠다.
** Student형 변수 선언.
Student s;
** Student형 Array 선언.
Student[] students;
contract Struct2 {
struct Student2 {
string name;
string gender;
uint number;
uint birth;
}
Student2 s;
function setStudent2(string memory _name, string memory _gender, uint _number, uint _birth) public {
s = Student2(_name, _gender, _number, _birth);
}
function getStudent2() public view returns(Student2 memory){
return s;
}
}
오늘은 뭔가 내용이 엄청 길어진 것 같다..
내일 어린이날이니까 열심히 쉬고 다음주 수업 열심히 들어야겠다!!
(어린이날 알바가는사람.... 저요....... 쉬고싶습니다ㅠ)