[멋쟁이 사자처럼 블록체인 스쿨 3기] 23-05-04

임형석·2023년 5월 4일
0

Solidity


uintbytes

8 bit = 1 byte

1 byte 는 2자리 까지 표현이 가능.

16진수 2자리의 최대 표현값은 255 => ff

다음과 같이 변수 선언도 가능하다.

    uint a;
    uint8 b;
    uint16 c;
    uint256 d;

자릿수를 설정해주는 것 인데. 자릿수를 설정해주면 정적이 된다.

자릿수를 설정하지 않으면, 얼마나 큰 자릿수가 들어올지 모르기 때문에, 받을 수 있는 만큼의 최대 자릿수를 준비하므로 동적이다.

하지만 자릿수를 설정해주면 최댓값은 정해져 있기에 정적이다.


Array

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 는 적어주지 않는다.


Struct

솔리디티에서는 구조체 선언이 가능하다.

구조체는 서로 다른 자료형을 모을 수 있다. 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)); 
    }

EVM 과 함수명 에러

보통의 언어들은 같은 함수명이 있다면, 에러가 난다.

하지만, 솔리디티에서는 함수명이 같아도 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 으로 컴파일링할때 다른 함수 취급하기 때문..

0개의 댓글