Solidity로 Smart Contract 구축하기3 - Function

2022. 8. 26. 16:55카테고리 없음

Solidity를 공부하면서 D_One님의 유투브를 참고하면서 공부하였습니다.

D_One님의 인프런 무료 강의도 있으니 참고하시면 좋을 것 같습니다.

 

D_One

솔리디티



이번 포스팅에서는 Solidity에서 함수(function)을 사용하는 방법에 대해 알아보겠습니다.

Function

function `functionName`(<parameter types> `parameterName`) {public|external|private|internal} [pure|constant|view|payable] [(modifiers)] [returns (<return types>) [`returnName`]]

 

Solidity 공식 문서를 참고하여 만든 function 문법입니다.

function은 contract 안에 있을 수도 있고, 밖에 있을 수도 있습니다. contract 밖에 있는 함수를 free functions 라고도 부릅니다.

Visibility

function의 visibility 다음 4가지와 같습니다.

  1. public : 모든 곳에서 접근 가능
  2. external : 함수가 정의된 해당 contract 외의 모든 곳에서 접근 가능
  3. private : 오직 함수가 정의된 해당 contract에서만 접근 가능
  4. internal : 함수가 정의된 해당 contract와 그 contract를 상속받는 contract에서 접근 가능(Java의 protected)
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.1 <0.9.0;

function sum(uint[] memory arr) pure returns (uint s) {
    for (uint i = 0; i < arr.length; i++)
        s += arr[i];
}

contract ArrayExample {
    bool found;
    function f(uint[] memory arr) public {
        // This calls the free function internally.
        // The compiler will add its code to the contract.
        uint s = sum(arr);
        require(s >= 10);
        found = true;
    }
}

 

위 코드는 Solidity 공식 문서에서 발췌한 것입니다.

free functions와 같은 경우 visibility를 생략하면 기본적으로 internal이 적용됩니다. 그러면 해당 코드 페이지에서만 함수에 접근할 수 있습니다.

free functions가 아닌 contract 안에 function을 사용할 경우 반드시 visibility를 적어줘야합니다.

Parameters와 Return Variables

Solidity의 function은 다른 언어들과 마찬가지로 여러개의 typed parameters를 받습니다. 하지만 C++과 같은 언어와 다르게 return varables는 여러 개가 될 수 있습니다.

pragma solidity >=0.4.16 <0.9.0;

contract Simple {
    function arithmetic(uint a, uint b)
        public
        pure
        returns (uint sum, uint product)
    {
        sum = a + b;
        product = a * b;
    }
    
    function arithmetic2(uint a, uint b)
        public
        pure
        returns (uint sum, uint product)
    {
        return (a + b, a * b);
    }
    
    function arithmetic3(uint a, uint b)
        public
        pure
        returns (uint, uint)
    {
        return (a + b, a * b);
    }
}

 

역시나 Solidity의 공식 문서에서 발췌한 것입니다.

위 3가지 모두 같은 역할을 하는 함수이지만, return하는 방법이 다양하게 만들어질 수 있습니다.

State Mutability

Solidity의 function에는 State Mutability를 제한할 수 있습니다. 그럼 State Mutability가 뭘까요?

State Mutability란 contract의 상태를 변경 가능한가 라는 말입니다. 더 쉽게 말하자면 해당 function 외부에 정의되어 있는 변수들에 대한 접근 권한이 어떻게 되느냐 입니다. 그리고 그런 State Mutability에는 3가지가 있습니다.

  1. default(아무것도 적지 않음) : function 밖의 변수들을 읽어서 변경해야합니다. 만약 function 밖의 변수를 읽지 않거나 변경하지 않는데 아무것도 적지 않는다면 warning이 발생합니다.
  2. view : function 밖의 변수들을 읽어오기만 합니다. 변경은 불가능합니다.
  3. pure : function 밖의 변수들을 읽지도, 쓰지도 못합니다.
contract test{
	
    uint256 public a = 1;
    
    //1. default
    function read_a1() public returns(uint256) {
        a = 13;
        return a;
    }
    //2. view
    function read_a() public view returns(uint256) {
        return a+2;
    }

    //3. pure
    function read_a2() public pure returns(uint256) {
        uint256 b = 1;
        return 4+2+b;
    }
}

 

 

이번에는 이렇게 함수를 사용하는 방법에 대해 알아봤습니다.

다음 포스팅에서는 Solidity의 메모리 구조와 Reference Types를 사용할 때 유의할 점에 대해 알아보도록 하겠습니다.

 

감사합니다.