プログラミング言語における所有権とは?|3分でわかりやすく解説

【用語解説】プログラミング言語関連

こんちには。キノコードです。
このレッスンでは、 所有権について説明をします。

▼ YouTube動画はこちらからどうぞ。

この記事の執筆・監修

キノコード
キノコード

テクノロジーアンドデザインカンパニー株式会社のCEO。
日本最大級のプログラミング教育のYouTubeチャンネル「キノコード」や、プログラミング学習サービス「キノクエスト」を運営。
書籍「あなたの仕事が一瞬で片付くPythonによる自動化仕事術」の著者や、雑誌「日経ソフトウエア」の寄稿などの実績も多数。

所有権とは?

例えば、プログラミング言語のRustでは、メモリ管理について、所有権・借用・ライフタイムという独特な仕組みを採用しています。
この仕組みがあるため、プログラマがメモリ管理をコントロールすることができます。
そのため、開発する上で制約の多いOSやコンパイラなどのソフトウェアを開発することができますし、高速に動作するプログラムも書くこともできます。
この独特なメモリ管理の所有権について説明します。
変数の場合で考えてみましょう。
所有権とは、変数の中身を所有する権利です。
変数の中身とはなんでしょう?
変数は、イメージでいうと箱のことです。
変数の中身は、箱に入っているデータのことです。
Rustでは変数から変数に代入すると、変数の中身の所有権ごと相手に渡します。
これをムーブと言います。
一方、JavaやC#などの他の言語の場合は、値や参照のコピーになります。

JavaとRustの比較

RustとJavaのコードを比較して、Rustの特徴を見てみましょう。
まずJavaの場合で書いてみます。

public static void main(String[] args) {

    String a = new String("hello");

    String b = a;

    System.out.println(a);

    System.out.println(b);

}

このところで、変数bに変数aを代入しています。
コンパイルして実行してみましょう。
結果はこうなります。

hello

hello

Rustで書いてみます。

main(){

    let a = "hello".to_string();

    let b = a; //★

    println!("{}", a);

    println!("{}", b);

このコードは、Javaと同じく、このところで変数bに変数aを代入して、最後にaとbを順番に表示させるコードです。
コンパイルして実行してみましょう。

error[E0382]: borrow of moved value: a 

Rustではエラーになっています。
一体なぜなのでしょうか?
これは、変数aのデータの所有権がなくなってしまっているからです。
変数aの所有権は変数bに移動(ムーブ)してしまっているので、aはもう参照できませんと言われています。
b = a は、JavaやC#など、他の言語の場合は値や参照のコピーであり、Rustの場合は所有権のムーブになるのです。
この所有権の概念があることにより、確保したメモリ領域が解放されず、メモリが確保されたままになることが起きにくくなるメリットがあります。
また、メモリ管理のガベージコレクションを採用しないことにより、メモリに対する処理や負荷を減らすメリットもあります。

KinoCode チャンネル

YouTubeで毎日動画配信しています。
動画は3分間なので、
 ・通勤時間
 ・お昼休み
 ・お手すきのとき
 ・寝る前
など手軽に視聴できます。
 
ちょっとしたインプットにどうぞ!
 
▼チャンネル登録はこちらからどうぞ。