> For the complete documentation index, see [llms.txt](https://my-organization-23.gitbook.io/solidity-basic/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://my-organization-23.gitbook.io/solidity-basic/noakusesu.md).

# 関数のアクセス修飾子

コントラク内の関数には実行可能なアクセス権限を設定できます。下記の\<visibility specifier>の部分に設定します。

```solidity
function myFunction() <visibility specifier> returns (bool) {
    return true;
}
```

* `public`: コントラクトの外部および内部から実行可能
  * ストレージ/ステート変数のためのgetter関数を作成します

```solidity
contract AMM {
    uint256 public totalShare; // シェアの総量
    
    // 手動で実装したgetter
    function totalShare() external view returns (uint256) {
        return _totalShare;
    }
}
```

* `private`: 現在のコントラクトからのみ実行可能、継承先の子コントラクトからは実行不可
* `external`: コントラクトの外部からのみ実行可能、thisを使うと内部から外部的に関数を呼び出すことが可能、externalな関数の場合は引数で渡された値はメモリに保存されることなく関数が処理されるのでgasがpublicよりも低く済みます
* `internal`: コントラクトの内部からとこのコントラクトを継承したコントラクトからのみ呼び出すことができます。

| アクセス権限   | 外部から呼び出し | 内部から呼び出し            | 継承先から呼び出し           |
| -------- | -------- | ------------------- | ------------------- |
| public   | ○        | ○                   | ○                   |
| private  | ×        | ○                   | ×                   |
| internal | ×        | ○                   | ○                   |
| external | ○        | thisを使えば可能だが、gasを消費 | thisを使えば可能だが、gasを消費 |

#### externalとpublicの違い

publicは引数の値をメモリに保存し、externalの場合は引数で渡された値はメモリに保存しないのでgasがpublicよりも低くすみます。

ベストプラクティスとしては、関数が外部からのみ呼び出されると予想される場合は「external」を使用し、関数を内部で呼び出す必要がある場合は「public」を使用するべきです。ほとんどの場合、「this.f()」パターンを使用するのはコストがかかります。また、このメソッドを介して配列を渡す方が、内部で渡すよりもずっとコストがかかります。
