VB.NETの動的配列とReDimの使い方を徹底解説!サイズ変更のコツ
生徒
「VB.NETで配列を作るとき、最初に入れるデータの数が決まっていない場合はどうすればいいですか?」
先生
「そんな時は『動的配列』というものを使います。後から箱の数を自由に変更できる便利な仕組みですよ。」
生徒
「後から変更できるんですね!具体的にどうやってサイズを変えるんですか?」
先生
「ReDimという命令を使います。データの守り方など、大切なポイントを一緒に学んでいきましょう!」
1. 動的配列とは?
VB.NETでデータをまとめて管理する「配列(はいれつ)」には、大きく分けて二つの種類があります。一つは、最初に「箱の数は5個です」と決めてしまい、後から変えられない「固定長配列(こていちょうはいれつ)」。もう一つが、プログラムの途中で箱の数を増やしたり減らしたりできる「動的配列(どうてきはいれつ)」です。
例えば、買い物リストを作るとき、最初に何個買うか決まっていれば固定の配列で良いですが、お店を回りながら「あ、これも買わなきゃ」とリストが増える場合は、柔軟に枠を広げられる動的配列が非常に役立ちます。このように、データの個数が予想できない場面でプログラミングの柔軟性を高めてくれるのが動的配列の大きなメリットです。
2. 動的配列の宣言方法
動的配列を作るための「宣言(せんげん)」は、固定長配列とほとんど同じですが、一点だけ決定的な違いがあります。それは、カッコの中に数字を書かないことです。宣言とは、コンピュータに対して「これからこの名前の変数を使いますよ」と予約することですが、動的配列の場合は「まだ数は決まっていないけれど、配列として使います」という合図を送ります。
実際のコードの書き方は以下のようになります。
' カッコの中を空にして宣言するのがポイントです
Dim memberList() As String
この一行を書くだけで、後からサイズを自由に決められる魔法の箱が準備されます。最初は中身が空っぽの状態なので、実際にデータを入れる前には、必ず「これから何個の箱を使います」と指定し直す必要があります。
3. ReDim文でサイズを決定・変更する
宣言しただけの空っぽの動的配列に対して、具体的な箱の数(要素数)を割り当てるために使うのが「ReDim(リディム)」という命令です。Reは「再び」、Dimは「宣言する」という意味を持っており、文字通り「サイズを再定義する」ためのコマンドです。
パソコンを触ったことがない方でも、机の上にトレイを並べる様子をイメージしてみてください。最初はトレイがありませんが、ReDimという命令を出すことで、机の上に指定した数だけトレイが並べられます。
' 最初に動的配列として宣言
Dim students() As String
' 後から3つの要素(インデックスは0~2)を確保する
ReDim students(2)
' 値を代入する
students(0) = "田中"
students(1) = "佐藤"
students(2) = "鈴木"
ここで注意したいのは、VB.NETの配列は「0」から数え始めるというルールです。ReDim students(2)と書いた場合、使える箱は「0番、1番、2番」の合計3つになります。これを間違えると、プログラムが「そんな番号の箱はありません!」と怒って止まってしまうので気をつけましょう。
4. データを消さずにサイズ変更する「Preserve」
ReDimを使う際に、最も重要と言っても過言ではないのが「Preserve(プリザーブ)」というキーワードです。実は、ただ ReDim とだけ書くと、それまで配列に入っていた中身がすべて消去(初期化)されてしまいます。せっかく「田中さん」や「佐藤さん」という名前を入れていても、箱の数を変えた瞬間に空っぽになってしまうのです。
中身を維持したまま、箱の数だけを増やしたい(または減らしたい)ときは、必ず ReDim Preserve と記述します。Preserveには「保存する」「維持する」という意味があります。
Dim colors() As String = {"赤", "青"}
' 中身を保持したまま、要素を3つ(0~2)に増やす
ReDim Preserve colors(2)
' 新しく増えた場所に値を入れる
colors(2) = "黄色"
' 実行結果を確認すると、「赤」「青」「黄色」がすべて入っています
このPreserveを忘れてしまうミスは、初心者だけでなく慣れた人でもやってしまいがちです。「配列を広げるときはセットで書く」と覚えておきましょう。
5. 配列のサイズを動的に増やす実践プログラム
では、実際に「ユーザーが入力した分だけ、配列をどんどん広げていく」という実践的なプログラムを見てみましょう。現実のアプリ開発でも、データの追加に合わせて配列を拡張する場面はよくあります。ここでは、果物の名前を入力して、それをすべて配列に保存していく例を紹介します。
Module Module1
Sub Main()
Dim fruits() As String
Dim count As Integer = 0
Console.WriteLine("果物の名前を入力してください(終了するにはexitと入力)")
Do
Dim input As String = Console.ReadLine()
If input = "exit" Then Exit Do
' 配列のサイズを現在の個数に合わせて再定義(中身は保持)
ReDim Preserve fruits(count)
fruits(count) = input
count += 1
Loop
Console.WriteLine("--- 入力されたリスト ---")
' 配列の中身を表示する
If fruits IsNot Nothing Then
For Each f As String In fruits
Console.WriteLine(f)
Next
End If
End Sub
End Module
このコードでは、入力されるたびに ReDim Preserve を呼び出し、配列の末尾を一つずつ広げています。Do...Loop というのは、特定の条件(ここではexitが打たれるまで)処理を繰り返すための命令です。未経験の方には少し難しく見えるかもしれませんが、「入力されたら箱を一つ追加する」という単純な作業をコンピュータが繰り返しているだけです。
6. 動的配列の注意点とメモリの話
動的配列は非常に便利ですが、使いすぎには注意が必要です。実は ReDim Preserve を実行するたびに、コンピュータの裏側では「新しいサイズの大きな土地(メモリ)を確保し、古い土地からデータをすべて引っ越しさせる」という大変な作業が行われています。これを数万回、数百万回と繰り返すと、パソコンの動作が少し重くなることがあります。
そのため、「何個必要かだいたい分かっている」ときは、少し余裕を持って大きめに確保しておくか、頻繁に ReDim をしすぎないような工夫をすることが、プロっぽいきれいなコードを書く秘訣です。とはいえ、学習を始めたばかりの方は、まずは「自由自在に箱の数を変えられるんだ!」という感動を大切に、たくさん使ってみてください。
7. 要素を減らす場合の挙動について
ReDimは増やすだけでなく、減らすことも可能です。例えば、ReDim Preserve students(1) とすれば、インデックス2番以降のデータは切り捨てられます。一度切り捨てられたデータは元に戻せませんので、サイズを小さくするときは注意が必要です。
パソコンのフォルダ整理と同じで、いらなくなったスペースを削ってスッキリさせるのは良いことですが、大事なファイルを一緒にゴミ箱へ捨てないように、今何番の箱に何が入っているかを意識しながら操作しましょう。