More Related Content
PDF
PDF
PPTX
OpenModelica tutorials_6 Tips(超初級チュートリアル6.便利技 Tableモデルの使い方) PPTX
PPTX
The Startup2014AWスタートアップトレンド PPTX
PPT
PDF
BuzzFeed、Upworthyのこれまでと現在からみるバイラル/キュレーションメディア Similar to Java班講義資料第3回
PDF
PDF
PPTX
PPTX
PHP, JavaScriptプログラマのためのC#入門 PPTX
2歩目 プレゼン資料 初歩から始めるjava勉強会 PPTX
PDF
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„ PDF
Processingによるプログラミング入門 第4回 PDF
PDF
PDF
PDF
programming camp 2008, introduction of programming, algorithm PDF
PDF
PDF
PPTX
PPTX
PPTX
PDF
More from XMLProJ2014
PPTX
PPTX
PPTX
PPTX
PPTX
PPTX
PPTX
PPTX
PPTX
PPTX
PPTX
PPTX
PPTX
PPTX
PPTX
PPTX
PPTX
PPTX
PPTX
PPTX
Java班講義資料第3回
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
int x =10;
A
B
C
a b c d e f g
10
33
- 35.
int x =10; int y = x;
A
B
C
a b c d e f g
10 10
34
- 36.
int[] nums1 =new int[4];
A
B
C
a b c d e f g
10 10
[0] [1] [2] [3]
35
- 37.
int[] nums1 =new int[4]; int[] nums2 = nums1;
A
B
C
a b c d e f g
10 10
[0] [1] [2] [3]
36
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
Editor's Notes
- #5 噛み砕くと、「同じ型のデータをいくつかまとめて、順番に管理できるもの」という感じ。
「同じ型」というところが大事。0番目の箱にint、1番目の箱にStringとかは無理。
番号がわざわざ「0」から始まっていることがポイント、ここの説明はまた後で。
ところで、「データ構造」とは?
- #6 ほとんどのプログラミング言語に用意されている。これの代表的なものが配列。
配列は同じ型の変数しか扱えなかったが、違う型の変数でも扱えるデータ構造も存在する。
まとめて扱う具体例:「Aクラス40人ぶんの、数学のテストの点数」を40個の変数で扱うよりも1つの配列にまとめた方が何かと楽。「S君の『名前』『電話番号』『メールアドレス』」をバラバラに扱うよりも「S君」でまとめた方が何かと楽。
- #7 使い方を知る前に、配列に関する用語を説明。
- #8 配列は同じ型の変数しかまとめられないって話をしたので「int」ってのは省略。
さらに、番号の書き方を変えた。この書き方は後に繋がってくるので、とりあえず番号なんだな、と認識しておく。
何か同じ型の変数が5つまとまっている。このまとまりが、1つの配列。
- #9 並んでいる箱の一つ一つを「要素」と言う。
一番左から、「0番目の要素」「1番目の要素」・・・といった感じ。
今まで使ってきたような変数と同じように、計算したり、代入したりできる。
もちろん、同じ配列に属する要素は全て同じ型になる。
- #10 配列は複数データを並び順で格納するため、それぞれのデータを区別するために番号を付ける。この番号が添え字。
ゼロから始まることに注意。0~4の5つという考え方。1~5ではない!
「配列とは」で0番目から始めていたのは、ここで矛盾を発生させないため。
- #12 箱を用意するには、「配列の宣言」と「要素の作成」という2つの手順を踏む。
「要素の作成」にはnew演算子というものを使う。「新しく作るからnew」くらいの認識で大丈夫。多分。
どちらの手順でも、使うカッコは「{}」ではなく「[]」であることに注意。
要素数というのは、まとめて格納したいデータの数。
つまり、配列を作成する時点で、その配列にいくつのデータを入れたいのか、決めておく必要がある。
- #13 今まで使ってきた変数は宣言しただけで箱を作成することができた。
しかし配列は、宣言したうえで、要素を作成しなければならない。
要素を作成して初めて、データを格納できる。
- #15 今まで使ってきた変数で「まとめて書く」と言えば初期化のことだったが、配列の場合は「配列の作成」に必要な2つの手順をまとめたというだけであり、初期化ではない。配列の初期化は、また後で。
- #16 先ほど説明した手順で配列を作成したら、その配列名に「[]」で括った添え字をつけることで要素を指定し、そこにデータを代入することができる。0番目の要素にデータを入れたかったら、添え字の部分に0を入れる。
- #17 2つの方法がある。new演算子を使う方法と使わない方法。
どちらも、「{}」の中で、要素に代入したいデータを直接入力している。
この場合、入力したデータの数がそのまま要素数となる。
下の方が明らかに打つ量が少ないから上なんて必要ないのかと言うと、そうでもない。
- #18 2つの方法を、あえて配列の宣言と分けてやってみた。
new演算子を使う方は、宣言と分けても問題なく動く。
しかし使わない方は、エラーが出る。
もしnew演算子を使わないで初期化をしたいなら、宣言と分けてはいけない。
- #19 3人分の点数を格納する配列scoresを作成。
0番目、1番目には点数を代入するが、2番目にはあえて代入しない。
(※要素数は3つだが、0~2の3つであることに注意。1~3ではない!)
それぞれのデータを出力してみる。
- #20 データを代入しなかった2番目の要素にはゼロが入っていた模様。
このように、配列の要素にはあらかじめ値が入っている。
intやdoubleのような数値を入れる型にはゼロ、他の型にも何かしら決まった値が入れられている。
- #21 今まで使ってきたような普通の変数はきちんと値を代入しないと使えない。
配列とごちゃごちゃにならないように注意。
- #23 これは見た方が早い。
- #24 5人分のテストの点数をまとめた配列scores
点数を出力したいけれど、ひとつずつ、sysoutで出力するのは面倒
そこでforの出番!
「i」が添え字の代わりになってくれる
もう少し詳しく説明
- #25 繰り返しの基準となる「i」を添え字と同じくゼロから始まるようして、
条件式は出力したいデータが5つあるので「i < 5」としておき、
処理が終わると「i」が1増えるようにしておけば、
繰り返しのなかで「i」が添え字の代わりとなってくれる。
- #26 きちんと出力されている。
- #27 配列のデータを途中で増やしたり減らしたりしたとき、そこに対応する部分を全て書き換えるのは面倒
配列名に「.length」をつけたものが、その配列の要素数を示すものになる
配列のデータを増やそうと減らそうと、きちんと変化してくれる
今までになかった書き方だけど、後で意味がわかるようになる。はず。
- #28 さっきのソースを少し書き換えたもの
scores.lengthを使って要素数を出力する部分を加えて
forの条件式にscores.lengthを用いている
scores.lengthは配列scoresの要素数、この場合は5を意味する
- #29 きちんと出力されている。
- #30 配列は今まで使ってきた変数とは挙動が違う部分がある
- #31 配列nums1を作成し、それをnums2に代入
その後、nums2の0番目の要素に100を代入
最後に、nums1の0番目の要素を出力
結果はどうなる?「1」?
- #32 100が出力される。
nums1の0番目の要素を出力したはずなのに、nums2の0番目の要素に代入した100が出力された
nums1の0番目の要素は最初、1だったはず
この現象を理解するには、多少ハードな部分に入り込むことになるが、ここを理解しておかないと後々躓いてしまうかもしれないので頑張る
- #33 まずはメモリについて軽く説明。
推奨機ならたぶん4GB、増築してると8GBとかかもしれない。
HDDやSSDが長期的にデータを保存できるのに対し、メモリは一時的にしか保存できない
さらに、容量もHDDやSSDと比べて格段に小さい
その代わり、比べものにならないくらい読み書きが速い
普通にプログラミングするぶんには、変数や配列はここに作られている。多分。
CPUが脳、メモリが机の上、HDDやSSDが机の引き出しなんかによく例えられる。
- #34 メモリは碁盤の目のように区画整理されており、各区画にはアドレスが割り振られている
アドレスとは、住所と同じようなもの。その区画がメモリのどこにあるのかを示す。
今回は仮に、縦と横に大文字と小文字のアルファベットを割り当て、その区画がどのアルファベットに属しているかでアドレスを決めることにする。
- #35 まずは今まで使ってきたような変数について考える
変数を作成すると、メモリの空いてる場所を確保し、そこにデータを保存する
なので、今まで「箱」と言っていたものは、メモリに確保された区画のこと。と言いつつ、メモリの中にさらに箱があるような図になってしまっているけれど、これは見た目を優先した結果ということで、あまり深くは考えないでくれるとありがたいです。
- #36 新たに変数yを作成し、xを代入する
そうすると、「x」が確保している区画Abに保存されているデータが、「y」が確保した区画にコピー・保存される
『その区画に保存されているデータ』が、コピー・保存される。ここが重要。
- #37 次に配列だとどうなるか、見てみる。
配列を作成すると、要素数ぶんの区画を確保する
この時点で既にゼロが代入されているって話はさっきした。ただし、配列の要素ってことがわかりやすいように、箱にはデータではなく添え字を書いている。
ここで最も重要なのは、「nums1」には「Bc」というアドレスが入っているということ。
もう少し詳しく言うと、「配列名[添え字]」という書き方は、その配列に属する特定の要素を意味しており、「配列名」のみだと、「その配列の最初の要素のアドレス」を意味する。
「その配列の最初の要素のアドレス」とはつまり、配列がどの区画から始まるかを示すアドレス、ということ。
- #38 そうすると、配列nums2に代入されるデータは、「nums1」が示すアドレス、つまり「Bc」ということになる
よって、「nums1」と「nums2」は、どちらもスタート地点が同じ配列ということになり、「nums1[0]」と[nums2[0]」が同じ要素を示すことになる
今まで使ってきた普通の変数の場合は、『その区画に保存されているデータ』がコピー・保存されていたのに対して、配列は「配列名」で代入を行うと、『その配列の最初の要素のアドレス」がコピー・保存される。書き方は似ていても、実際に起きていることは全く違う。
- #39 配列nums1を作成し、それをnums2に代入
その後、nums2の0番目の要素に100を代入
最後に、nums1の0番目の要素を出力
結果はどうなる?
- #40 100が出力される。
nums1とnums2はどちらも同じアドレスを示しており、「nums1[0]」と「nums2[0]」は同じ意味となるから。
- #41 ちなみに、区画に保存されているデータそのものをやりとりする変数を「基本型変数」と言い、区画のアドレスをやりとりする変数を「参照型変数」と言う。
基本型変数は今まで使ってきたようなintやbooleanなどを型とする変数
参照型変数は配列の他にも色々あって、どれを扱うにしても、今回説明した考え方を理解しておく必要がある
- #42 さらにおまけ。
配列名だけを変数のように扱った場合、その配列の最初の要素のアドレスを指し示す
こういった「アドレスを指し示す」変数にnullを代入すると、「どこも指し示さない」変数にできる
- #43 配列numsを初期化した後、numsにnullを代入
最後にnums[0]を出力
エラーは出てないように見えるが・・・
- #44 実行するとエラーが出る
このエラーは要するに、「どこも参照していないからわからない」という感じの意味
配列numsの参照が、nullを代入することによって消え去ったので、nums[0]と書いても、どこの要素を示しているのかわからなくなっている
かの有名な「ぬるぽ」はここから来ているらしい
- #45 さらにさらにおまけ。
先ほどの配列numsにnullを入れると、アドレスを参照しなくなるけれど、メモリ上に要素は残ったままになってしまう
それらは事実上、全く使われることのないゴミになり、溜まり続けると無駄にメモリを消費してしまうので、Javaが勝手にお片付けしてくれる
この仕組みをガベージコレクションと呼ぶ。これのおかげで何かと楽できる。
この機能がないプログラミング言語では自分で後片付けをやることになる。
それがメリットにもデメリットにもなるので、どちらが良いとは一概に言えない。多分。
- #47 今までの配列は、これまで基本型の変数に入れてきたような値をまとめたものだったが、配列は複数の配列をまとめることもできる
forのネストみたいに多少複雑ではあるが、慣れれば大したことはない
ちなみに、3次元配列からはまとめて「多次元配列」と言う。らしい。
- #48 横に長くなってしまったので、2行にした。プログラムでは2行にする必要はない。
とりあえず2次元配列をやる
これがわかれば次元が増えても大丈夫
なんとなく、1次元配列と書き方が似ていることはわかるのではなかろうか
しかしこれだけだと、いまいち想像しにくいと思う
というわけで実際に見てみる
- #49 Aクラスの3人とBクラスの3人の点数をまとめた配列scoresを作成
まず、Aクラスの一郎、二郎、三郎の点数を代入
次に、Bクラスの四朗、五郎、六郎の点数を代入
- #50 図で示すとこんな感じ
scoresは2つの要素を持っていて、それぞれの要素がさらに3つの要素を持っている
- #51 考え方は一緒
複雑で面倒になるだけ
必要なときだけ使おう
- #55 「外側の配列」とか「内側の配列」っていう言い方は俺が勝手に考えたもので、いまいちわかりにくい日本語だと思うので具体例を挙げておきます。