1. Solidity 기초 - 변수 선언, 종류 / 함수 만들기

심재원·2023년 12월 19일
0

uint 256 : 용량, 표현할 수 있는 길이, 2의 256승

An Ethereum Virtual Machine Opcodes Interactive Reference

https://www.evm.codes/?fork=shanghai

1. Contract Basic 1

전역변수 : 함수 외부(Whole Chain), 전체 접근 가능 => 자기 영향력의 활동 범위가 전체에 해당

상태변수 : contract 안에서 선언된 변수 => 어디서든 따올 수도, 접근할 수도 있음.

지역변수보다 더 무겁고 비싸다(모든 함수가 사용하니까).
읽어오는 건 돈이 안 드는데, 변경하면 돈이 듦.

지역변수 : 함수 내부(function), 외부에서 접근 불가 => 자기 영향력의 활동 범위가 함수 안에만 해당. 변경 시 가격이 쌈.

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.15;

contract Basic {
    uint a; // 숫자형 변수 a
    uint b; // 숫자형 변수 b
    uint c = 2; // 숫자형 변수 c

    function setA(uint _a) public {
        a = _a;
    }

    function setB(uint _b) public {
        b = _b;
    }

    function setC(uint _c) public {
        c = _c;
    }

    function setAB(uint _a, uint _b) public {
        a = _a;
        b = _b;
    }

    function setAasFive() public {
        a = 5;
    }

    function setAasSeven() public {
        a = 7;
    }

    function setAasNine() public {
        a = 9;
    }

    function getA() public view returns(uint) {
        return a;
    }

    function getB() public view returns(uint) {
        return b;
    }

    function getC() public view returns(uint) {
        return c;
    }

    function getAB() public view returns(uint, uint) {
        return (a, b);
    }
} 

2. Contract Basic 2 (Calculation)

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.2 <0.9.0;

contract Basic2 {
    function add(uint _a, uint _b) public pure returns(uint) {
        return _a + _b;
    }
    
    function mul(uint _a, uint _b) public pure returns(uint) {
        return _a * _b;
    }

    function sub(uint _a, uint _b) public pure returns(uint) {
        return _a - _b;
    }

    function sub2(int _a, int _b) public pure returns(int) {
        return _a - _b;
    }
}

 function div(uint _a, uint _b) public pure returns(uint, uint) {
        return (_a / _b, _a % _b);
    }

EVM 수업 때 view, pure 설명 예정.

SmartContract은 불안정하고 불확실한 걸 싫어함

-> 소수를 쓸 수 없음 -> _a % _b를 통해 나머지도 표현 가능!

3. View and Pure

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.2 <0.9.0;

// view 와 pure  / 지역변수와 상태변수
contract Basic3 {
    uint a; // 상태변수

    function setA(uint _a) public { //상태변수를 변화 시킴 ->  view, pure (x)
        a = _a;
    }

    function getA() public view returns(uint) { // 상태변수 참조 -> view
        return a;
    }

    function getB(uint _a /*지역 변수*/) public pure returns(uint) { // 지역변수만을 사용 -> pure
        uint _b = _a**3; // 
        return (_a+_b);
    }

    function getAplusB(uint _b) public view/*상태변수를 참조함*/ returns(uint) {
        return a+_b;
    }
}

4. 문자형 변수 String

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.2 <0.9.0;

contract Basic4 {
    string a; // 문자형 변수 a, 상태변수
    uint b;

    function setA(string memory _a) public {
        a = _a;
    }

    function setAasABC() public {
        a = "abc";
    }

    function setAB() public {
        a = _a;
        b = _b;
    }

    function getA() public view returns(string memory) {
        return a;
    }

    function getAB() public view returns(string memory, uint) {
        return (a, b);
    }
}

5. Bytes

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.2 <0.9.0;

contract Basic5 {
    bytes a;

    function setA(bytes memory _a) public {
        a = _a;
    }

    function setB() public {
        a = "ab"; // 0x6162 -> ascii code 참고
    }

    function setC(string memory _a) public {
        a = bytes(_a); // string 형의 _a가 bytes형의 a로 저장됨
    }

    function setD() public {
        a = "12"; // 0x3132 -> ascii code 참고
    }

    function getA() public view returns(bytes memory) {
        return a;
    }
}

-> string이 bytes를 따라간다.

ascii code table

Extended-ASCII-Table-large

Standard-ASCII-Table-large

6. Array

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.2 <0.9.0;

/*
1. 값 넣기
2. 값 빼기
3. 값 보기
4. 값 바꾸기
*/

contract ARRAY {
    uint[] numbers; //자료형[] array_이름

    // 1. 값 넣기
    function push(uint _a) public {
        numbers.push(_a); // array_이름.push(넣고 싶은 값)
    }

    // 2. 값 빼기
    function pop() public {
        numbers.pop();
    }

    // 3. 값 보기
    function getNumber(uint _n) public view returns(uint) {
        return numbers[_n-1];
    }

    // 4. 값 바꾸기
    function setNumber(uint _n, uint _m) public {
        numbers[_n-1] = _m;
    }

    function deleteNumber(uint _n) public {
        delete numbers[_n-1];
    }

    function getLength() public view returns(uint) {
        return numbers.length;
    }

    // 전체 반환
    function returnArray() public view returns(uint[] memory) {
        return numbers;
    }
}

한 array 안에는 한 가지 종류의 자료형만 들어감.

View & Pure

  • view
    : function 밖 변수들 보기 가능 / 변경은 불가능

  • pure
    : function 밖 변수들 보기, 변경 불가능할 때 사용
    pure 사용 function은 순수하게 함수 내부에 선언된 변수들 만으로 구성

  • 아무 것도 없을 때는 function 밖 변수들 보기, 변경 가능.

7. Array String

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.2 <0.9.0;

/*
1. 값 넣기
2. 값 빼기
3. 값 보기
4. 값 바꾸기
*/

contract ARRAY_S {
    string[] letters;

    // 1. 값 넣기
    function push(string memory _a) public {
        letters.push(_a); // array_이름.push(넣고 싶은 값)
    }

    // 2. 값 빼기
    function pop() public {
        letters.pop();
    }

    // 3. 값 보기
    function getLetter(uint _n) public view returns(string memory) {
        return letters[_n-1];
    }

    // 4. 값 바꾸기
    function setLetter(uint _n, string memory _m) public {
        letters[_n-1] = _m;
    }

    function deleteLetter(uint _n) public {
        delete letters[_n-1];
    }

    function getLength() public view returns(uint) {
        return letters.length;
    }

    // 전체 반환
    function returnArray() public view returns(string[] memory) {
        return letters;
    }
}

8. array uint_static

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.2 <0.9.0;

/*
1. 값 넣기
2. 값 빼기
3. 값 보기
4. 값 바꾸기
*/

contract ARRAY_static {
    uint[6] numbers;

    function setNumber(uint _n, uint _m) public {
        numbers[_n] = _m;
    }

    function deleteNumber(uint _n) public {
        delete numbers[_n-1];
    }

    function getLength() public view returns(uint) {
        return numbers.length;
    }

    // 전체 반환
    function returnArray() public view returns(uint[6] memory) {
        return numbers;
    }
}

9. array string_static

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.2 <0.9.0;

/*
1. 값 넣기
2. 값 빼기
3. 값 보기
4. 값 바꾸기
*/

contract ARRAY_static {
    string[6] numbers;

    function setNumber(uint _n, string memory _m) public {
        numbers[_n] = _m;
    }

    function deleteNumber(uint _n) public {
        delete numbers[_n-1];
    }

    function getLength() public view returns(uint) {
        return numbers.length;
    }

    // 전체 반환
    function returnArray() public view returns(string[6] memory) {
        return numbers;
    }
}

10. FUNCTION_NAME

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.2 <0.9.0;


contract FUNCTION_NAME {
    uint a;
    uint b;
    uint c;

    function add(uint _a, uint _b) public pure returns(uint) {
        return _a+_b;
    }

    function add(uint _a, uint _b, uint _c) public pure returns(uint) {
        return _a+_b+_c;
    }

    function add(uint _a, string memory _b) public pure returns(string memory) {
        return _b;
    }

    function add() public view returns(uint) {
        return a+b;
    }
}

11. bool

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.2 <0.9.0;

contract BOOL {
    bool isFun;

    function Fun() public {
        isFun = true;
    }

    function notFun() public {
        isFun = false;
    }

    function reverse() public {
        isFun = !isFun;
    }

    function setFun(bool _a) public { // true, false를 넣어도 되지만, 1과 0을 넣어도 작동함
        isFun = _a;
    }

    function getFun() public view returns(bool) {
        return isFun; 
    }
}

0개의 댓글