プログラミングの変数とは?わかりやすく基礎から徹底解説!
プログラミングの勉強で「変数」が出てきた。
値を出し入れするための「箱」と解説されてわかったような気もするけど、なんだかスッキリしない。
こんな悩みを解決します。
僕も最初は変数などから覚えていきましたが、「わかった気もするけどなんだかスッキリしない」状態が続きました。
当時を振り返って、自分がつまづいていたポイントなども考慮しつつ、徹底的にわかりやすく変数の解説しています。
この記事で学べること
変数についての基本的な知識・使い方
変数が理解できない原因
変数の仕組み
この記事の内容をおさえておけば、変数について知識が不足することはありません。
どのプログラミング言語でも通用する知識・概念を習得できるはずです。
プログラミングにでてくる変数とは?
変数をとても簡単に説明すると、値の出し入れができる「箱」のこと。
プログラミングでいう値とは「数値」や「文字列」のことを言います。
また、変数に値を入れるときに値の種類(数値とか文字列とか)を決めておく必要があるのですが、この値の種類のことを「データ型」や、短く「型」と呼んだりします。
なので一言で表すと、変数とは
「最初に決めた型の値を出し入れできる箱」
のこと言うことができます。
そして変数を使う目的は、「値の保持」です。
プログラミングを初めて間もない方は、値を保持するためと言っても「?」となるかもしれませんが、この記事を最後まで読み終えた頃には理解できるようになるかと思います。
ここではなんとなくのイメージで結構で問題ありません。
ひとつずつ丁寧に解説していくので、読み進めていきましょう!
重要なワード
「変数」:値の入れ物。「箱」に例えて説明していきます。
「値」:データのこと。「1」「3.14」などの数値や「あいうえお」「hello」などの文字列。
「データ型」:値の種類のこと。数値や文字列などさまざま
変数が理解できない主な原因3つ
実際、変数はそんなに難しいものではありません。
先程もイメージしやすいように変数のことを「箱」と解説しましたが、これだけでも変数の7割くらいの説明は終わったようなものです。
しかし、それでも理解できないのには原因があります。
実際に僕が陥っていた状況を振り返り、考えられる下記の3つの原因について解説していきます。
変数が理解できない原因
知らない単語が多すぎて整理できていない
具体的な使い方や便利さの体験ができていない
仕組みを理解しないと納得できない性格
知らない単語が多すぎて整理できていない
今までプログラミングに触れたことがない人にとっては、初めて聞く単語がとても多いはずです。
関数、定数、引数、戻り値、返り値、クラス、メソッド、オブジェクト…
他にもたくさん!
そのため、「変数」が理解できないのではなく、実は他の単語との区別ができていなかったり、機能を勘違いしていたりすることが考えられます。
僕の場合はまさにこれでして、プロゲートなどで学習中も、どれが変数でどれが関数なのかサッパリわからないという状況でした。
こちらの対策として、変数とそれ以外の要素の違い・見分け方についても後から解説しています。
解説内容
変数と定数の違い
変数と配列の違い
変数と関数の違い(引数と戻り値も一緒に解説)
具体的な使い方や便利さの体験ができていない
理屈はわかっているはずなんだけど、簡単な例でしか変数を使ったことがないから腹落ちしていないケースです。
簡単な例とは以下のような感じですね。
int a = 1;
int b = 2;
int c = a + b;
// 変数 c には 3 が入っています。
「値の出し入れや計算ができることはなんとなくわかった。……で?」ってなりませんでしたか?
少なくとも僕はこうなりました。
何かしらアプリなどを作る過程で覚えていくのが1番理解が深まる方法ではありますが、この記事中でも具体的な目的や使い方についてかなり噛み砕いて解説しているのでイメージが伝わればと思います。
例え話じゃなく仕組みまで理解しないと納得いかない性格
ほとんどの解説サイトでは変数は「箱」だと説明されますし、当ブログでも漏れなく「箱」に例えて解説をしていますが、人によっては「仕組みを知らないとスッキリしない・納得いかない」性格の場合もあると思います。
その場合は「箱」だと説明されたままイメージだけの説明で終わってしまっては納得できずに終わってしまいますよね。
この記事の後半で、「箱」のような例え話ではなく、実際の変数の仕組みについても解説しています。
初心者向けの解説から少しずれていて難しい内容になりますが、読んでもらえると理解は深まるはずです。
変数でできること・使い方
変数とは「決めた型の値を出し入れできる箱」だと説明しました。
ここではもう少し具体的な変数の使い方を解説しています。
まずは変数にどういった機能があって、どういった使い方ができるのかを把握しましょう。
変数を使うときに覚えておくことは次の3つです。
変数の使い方
「宣言」:作る
「代入」:値を入れる
「参照」:値を取り出す
それぞれ詳しく見ていきましょう。
【宣言】変数を「作る」
変数を使うために、まず変数を「作る」必要があり、これを「宣言」と言います。
使い方としては、「変数を宣言する」みたいな感じですね。
まずは変数の宣言がどんなものなのか実際のプログラムを見てみましょう。
int age;
「int」が変数の型で、「age」が変数の名前です。
上記のプログラムのように型と名前を決めることで変数を宣言することができるのです。
型と名前については後ほど詳しく説明しているので、変数を使うにはまず宣言が必要だと覚えておきましょう。
【代入】変数に「値を入れる」
変数には値を入れることができ、これを「代入」と言います。
使い方としては「変数に値を代入する」みたいな感じですね。
値を代入する実際のプログラムは以下のようになります。
int age;
age = 20; // この行で値を代入している
まずは1行目で変数を宣言して、2行目でageという名前の変数に「20」を代入しています。
【参照】変数から「値を取り出す」
変数に入っている値は取り出すことができ、これを「参照」と言います。
使い方としては「変数の値を参照する」のような感じです。
値を参照する実際のプログラムは以下のようになります。
int age;
age = 20;
int age2;
age2 = age; // この行で値を参照している
まずはageという名前の変数を宣言し、「20」を代入しました。
もう1つage2という名前の変数を宣言して、ageの値を参照しています。
ここまで説明しておいて申し訳ないのですが、「取り出す」といった表現は誤解を招く可能性があるので補足しておきます。
注意ポイント
「値の出し入れができる箱」という例えになぞって「取り出す」という表現にしていますが、変数の値を取り出しても、その変数の中身が無くなるわけではありません。
上記の例でいうと、ageという名前の変数を参照しても、中身は20のままです。なので「取り出す」というよりも「見てからコピーする」みたいなイメージの方が実際の動きに近いです。
変数には名前を付ける
変数を宣言するときは、必ず名前をつける必要があります。
これは箱にラベルを貼るようなイメージですね。
もう少し具体的な話をすると、値の入った箱はパソコン内の一時的な保管場所に置かれているのですが、「003A90F5」のように人間にはとてもわかりにくい番号(16進数と呼ばれるもの)で管理されています。
ですが、プログラムを書くのは人間なので、「003A90F5 = age」と管理番号と名前を紐づけることで人間にもわかりやすいように
なっているのです。
基本的には自由な名前をつけることができますが、プログラミング言語自体が使っている単語(予約語と呼ばれます)が使えないことを覚えておきましょう。
例えば以下のような単語です。
if / for / while / return
など、他にもたくさん
また、変数名を付けるときのマナーとして「わかりやすい変数名」にすることが大切です。
あくまでもマナーなので、適当な名前を付けることもできるのですが
int abc = 20;
abcだけではこの変数が何を表しているのかわからないですよね?
なるべくわかりやすい変数名にすることが大事です。
変数はそれぞれデータ型を持っている
変数を宣言するときには、名前と同様にデータ型も決める必要があります。
データ型はその値の種類のようなもので、代表的なものとしては以下です。
整数:int
浮動小数:decimal
文字列:string
ブーリアン:bool
※言語によって名称や種類の数が異なる場合もあります。
データ型を決めることで
・箱はどのサイズで用意すればいいか?
・何の種類の箱か?
が明確になります。
例えば、Sサイズの箱にはSサイズのもの、Lサイズの箱にはLサイズのものを入れるのは現実世界でも普通のことですよね。
また、Sサイズの箱にLサイズのものは入りませんし、Lサイズの箱にSサイズのものを入れるのは無駄なスペースができてもったいないです。
そのため、「データ型を決める = 箱のサイズを決める」ことで、コンピュータ内で無駄な容量を使わずにすむのです。
基本的には最初に決めたデータ型以外の値を変数に代入することはできませんが、プログラミング言語によっては可能な場合もあります。
変数は初期化が必要
ここまで順に読み進めていれば決して難しいものではありません。
初期化とは「変数が宣言されてから初めて値を代入すること」です。
int age;
age = 20;
これはageという名前の変数を、数値の20で初期化しています。
また、宣言と代入を同時に行うことでも初期化することができます。
int age = 30;
変数を使うときは、宣言と代入を同時に行って必ず初期化しましょう!
注意ポイント
プログラミング言語によって初期化しない場合の動きは異なりますが、そもそも動かすことができなかったり、C言語などでは思わぬ値を参照したりする場合があるので、とりあえず初期化しておくことをおすすめします。
変数とそれ以外の違いを理解しましょう
プログラミングを始めたばかりだと、初めて聞く単語や概念が多すぎて頭が混乱していることと思います。
基本的なものだけでも一般的ではない単語が多数あります。
定数、配列、関数、引数、戻り値、クラス、メソッド
など、他にもたくさん!
初めのうちは見分けるだけでも大変ですが、それぞれの違いを知っておくことでより早く見分けがつくようになります。
これが理解できれば確実にプログラミングスキルが高まっている証拠です!
見分けのポイントと一緒にそれぞれの違いをおさえておきましょう。
変数と似てるけど違うもの
・定数
変数とは全く違うもの
・配列
・関数
・引数(関数のパーツ)
・戻り値(関数のパーツ)
※クラスやメソッドについては「オブジェクト指向」の概念になるのでここでは説明しません。また別の記事で解説しようと思います。
変数と定数の違い
「定数」とは一度入れた値が変更できない箱のことです。
変数と同じように宣言・初期化が必要で、値を参照することもできますが、初期化以外で値の代入ができないことが特徴です。
const float PI = 3.14; // 定数の宣言・初期化
printf("%d", PI); // 定数の参照
PI = 6.55; // 定数に再代入しようとするとエラー
上記のプログラムのように一度初期化した定数に再度代入しようとするとエラーとなります。
変数よりも使い勝手が悪いので「なんで不便なものを使うの?」と疑問を持たれるかもしれませんが、値の再代入をしてほしくない場合があるのです。
例えば、円周率のように変わることがありえない値などですね。
「変数を書き換えなければいいじゃん」とも思われるかもしれません。
これはもっともな話でもあり、僕も最初のころはそう思いました。
ですが、システム開発は複数人で行うことの方がほとんどで、自分が書いたプログラムを後から別の人が書き加える場合もありますし、自分が書き直す場合でも時間がたてば書いた当時のことなど忘れています。
定数として宣言されていれば、「変更してはいけないもの」だというメッセージになる上、プログラム側でも変更されることを防止してくるので無駄なミスを起こらないようにしてくれるのです。
結局は人間がミスしないように用意されているようなものですね。
今後変更される予定が無い値には積極的に定数を使っていきましょう。
変数と定数の見分け方
宣言部分に「const」とついていれば定数
ちなみに、慣習的に全て大文字で書かれることが多いですが、小文字で書いてもプログラム上は問題ありません。
変数と配列の違い
「配列」とは値の入った箱が連結されたものです。
決めたデータ型の値を複数個入れることができ、連結する箱のデータ型と何個連結するのかを決めて宣言します。
int a[4] = {10, 101, 30, 7};
printf("%d", a[0]); // 10
printf("%d", a[1]); // 101
printf("%d", a[2]); // 30
printf("%d", a[3]); // 7
基本的には最初に決めたデータ型の値しか入れることができず、要素の数(連結した箱の数)も変えることはできませんが、プログラミング言語によってはデータ型がバラバラでもよかったり、要素の数を変えることもできます。
まずは値を複数個入れることができるものが「配列」だという理解でも最初は十分だと思います。
変数と配列の見分け方
宣言部分に [] がついている
変数名の後ろに [数字] のように使われている
変数と関数の違い(引数と戻り値も一緒に解説)
「関数」とは数学の関数のように、与えられた値を元に計算や加工を行い、何らかの値を返す一連の処理のまとまりのことを言います。
そして、関数に対して与えられる値のことを「引数」、返される値のことを「戻り値(返り値)」と言います。
※人によって呼び方が違うだけで、戻り値と返り値は全く同じ意味です。
言葉だけではわかりづらいので、まずは実際のプログラムを見てみましょう。
int sum(int a, int b) {
return a + b;
}
int result = sum(10, 20);
まず上から3行目までで「関数」を作っています。
関数のを作るための構成要素は「戻り値(返り値)のデータ型」「関数名」「引数の名前とデータ型」「関数の処理」です。
1行目を構成要素に当てはめると
先頭の「int」=「戻り値(返り値)のデータ型」
「sum」=「関数名」
「(int a, int b)」 = 「引数の名前とデータ型」
引数が何を表しているかというと、このsum関数を使うときにはint型の値を2つ与えてくださいということになります。
そして { で1行目が終わっていますね。
この { は、ここから「関数の処理」が始まりますよという合図の記号でして、{ 関数の処理 } のように中括弧で挟むことで、その区間が「関数の処理」として扱われます。
変数は値の出し入れだけですが、関数は値を加工したり計算したりすることができます。
変数と関数の見分け方
関数は名前の後ろに () がついている
※プログラミング言語によっては () を省略できる場合もあるので注意が必要です(Rubyなど)。
変数の正体はメモリの番地
ここでは「例えだけの解説だけではいまいち納得できない人」のために、実際の変数に仕組みについて少しだけ掘り下げてみたいと思います。
ここまでに「変数」=「箱」として説明してきましたが、箱の正体は「メモリ上に確保された領域」です。
変数が宣言されると、指定されたデータ型のサイズの分だけメモリ上に領域が確保されます。
各データ型のサイズ例
char:1バイト
int:4バイト
double:8バイト
変数はポインタというメモリのアドレス(番地)の情報を持っており、データ型のサイズと組み合わせることで、メモリ上のここからここまでがその変数自身の領域だとわかるのです。
変数に値を代入した場合は、その変数のポインタをたどってメモリに値を入れます。
反対に変数の値を参照する場合は、その変数のポインタが示すメモリの位置から値を読み取ります。
以上、駆け足ですが簡単に変数の仕組みについて解説しました。
この記事の主旨からそれてしまうため、これ以上の詳しい説明はしませんが、今後変数を使っていく上でなんとなく覚えておいてもらえたらと思います。
まとめ:基本がわかったら手を動かそう!
「変数とは?」から始まり、使い方や他の要素との違いなど、変数について網羅的に解説してきました。
また、例えだけでは腑に落ちない方のためにも、変数の仕組みについて簡単に解説しました。
それでは重要なポイントをおさらいしましょう。
・変数は値の出し入れができる「箱」のようなもの
・変数が理解できない原因3つ
→知らない単語が多すぎて整理できていない
→具体的な使い方や便利さの体験ができていない
→仕組みを理解しないと納得できない性格
・変数はメモリ上に領域を確保して値を保持する仕組み
僕も最初は変数や関数の違いもわからないまま、なんとなくプログラムを書いていました。
当然エラーも多発しましたが、なぜエラーが発生したのか頭を悩ませながらなんとか動くプログラムを作ることを繰り返すうちに自然と変数や関数を使えるようになっていました。
Discussion