8 bit = 1 byte
1 byte 는 2자리 까지 표현이 가능.
16진수 2자리의 최대 표현값은 255 => ff
다음과 같이 변수 선언도 가능하다.
uint a;
uint8 b;
uint16 c;
uint256 d;
자릿수를 설정해주는 것 인데. 자릿수를 설정해주면 정적이 된다.
자릿수를 설정하지 않으면, 얼마나 큰 자릿수가 들어올지 모르기 때문에, 받을 수 있는 만큼의 최대 자릿수를 준비하므로 동적이다.
하지만 자릿수를 설정해주면 최댓값은 정해져 있기에 정적이다.
Array 는 하나의 자료형만을 모을 수 있다.
아래와 같이 정수형 array numbers 를 상태변수로 선언했다.
uint[] numbers;
그리고 아래 코드로 numbers 라는 배열의 모든 값을 가져온다.
function returnArray() public view returns(uint[] memory) {
return numbers;
}
위에선 returns 에 받아올 형태를 코드로 작성하는데, 원래라면 정수형인 uint 는 memory 를 적어줄 필요가 없다.
하지만 배열값은 큰 정보이기 때문에 memory 를 함께 적어주어야 코드가 동작한다.
returns(uint[] memory)
그리고 아래 코드로 k 번째 배열을 z 로 바꿀 수 있다.
function changeNum(uint _k, uint _z) public {
numbers[_k] = _z;
}
배열의 k 번째는 z 라는 정수 값이 된다.
이 함수는 상태변수 배열의 값을 바꾸기 때문에 가스비를 소모한다. 그러므로 view 는 적어주지 않는다.
솔리디티에서는 구조체 선언이 가능하다.
구조체는 서로 다른 자료형을 모을 수 있다. array 형식과 다른점이다.
contract Struct {
struct Student {
string name;
string sex;
uint number;
uint birth;
}
Student s; // Student형 변수 s
function setStudent(string memory _name,string memory _sex, uint _number,uint _birth) public {
s = Student(_name,_sex,_number,_birth);
}
function getStudent() public view returns(Student memory) {
return s;
}
}
student 라는 구조체를 선언하고 2개의 문자값과 정수를 받는다.
그리고 student 형 변수를 s 라고 선언하고,
값을 설정하고 받아올 수 있다.
다음은 배열에 push 하는 부분이다. 다른 언어와 헷갈리는 건 여기이다.
배열명.push(구조체명(구조체 정보들))
이렇게 코드를 적어주어야 구조체와 구조체 정보들을 인식하고, input 값도 정상적으로 push 된다는 것.
function pushStudent(string memory _name, string memory _gender, uint _number, uint _birth) public {
students.push(Student(_name, _gender, _number, _birth));
}
보통의 언어들은 같은 함수명이 있다면, 에러가 난다.
하지만, 솔리디티에서는 함수명이 같아도 Input 갯수가 다르다면 에러가 나지 않는다.
아래와 같은 함수가 같은 컨트랙트 안에 담겨있어도 다른 함수 취급된다.
function Add(uint _a, uint _b) public returns (uint) {
return _a+_b;
}
function Add(uint _a, uint _b, uint _c) public returns (uint) {
return _a+_b+_c;
}
EVM 으로 컴파일링할때 다른 함수 취급하기 때문..