対話型AIにアドバイスを受けながら進めるJavaプログラミングの入門連載。今回は、プログラミングの基本と言える変数、データ型、演算子を学習します。Javaでどのようなデータの種類があるのか、どのようにデータを保持するか、どのように計算するのかといった基本中の基本を理解しましょう。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
本連載のサンプルコードをGitHubで公開しています。こちらからダウンロードしてみてください。
対話型AIにアドバイスを受けながら進めるJavaプログラミングの入門連載「AIアシスト時代のJavaプログラミング入門」。前回は、AIの力を借りるのに「Microsoft Copilot」を使いました。何も準備のない状態では、ブラウザから使えるMicrosoft Copilotはとても便利です。しかしながら、前回で「Visual Studio Code」(以下、VS Code)を導入したのもあり、今回からは「GitHub Copilot」を使っていくことにします。
GitHub Copilotはプログラミングに特化されたAIですし、VS Codeとの連携にも優れているので、より的確な回答やアシストを期待できるでしょう。本記事では、Javaの学習を通じてGitHub Copilotの使い方も簡単に紹介していきます。GitHub Copilotには、幾つかの利用プランがありますが、本連載では利用回数に制約のあるものの無料で利用できる、Freeプランを使っていきます。
GitHub Copilotの利用に当たっては、あらかじめGitHubアカウントを用意しておく必要があります。持っていない方はここからサインアップを済ませておいてください。続けて、GitHub Copilotの利用登録も必要になるので、ここからサインアップを済ませてください。
また、VS Codeを最新版にアップデートしておいてください。VS CodeのキャプションバーにGitHub Copilotのかわいいアイコンが表示されていれば問題ありません(図1)。
なお、本記事執筆時点(2025年4月)における最新版1.99では、エージェント機能(ワークスペースやターミナルなど質問の対象を限定する機能)がサポートされており、よりインタラクティブなコーディングがサポートされています(参考)。これを機会に、最新版にアップデートしておくといいでしょう。
前回はAIの助けを借りながら、Javaの学習環境を構築して、簡単なプロジェクトを作成してみました。今回からいよいよJavaの学習に入るわけですが、いざ始めるとなるとどこから手を付けてよいか分からないのではないでしょうか? では、このあたりからGitHub Copilot(以降、Copilot)のお世話になることにしましょう。
VS CodeでCopilotアイコンをクリックすると、「チャット」パネルがオープンします(図2)。「GitHub Copilot Chat」という名前の通り、Copilotの中核となる機能です。
ここに、最初の質問である「Javaを勉強しようと思うんだけど、何から学べばよい?」と投げてみましょう。Copilotは、このようなくだけた文体でも大丈夫です。質問は、チャットパネル下部にある「Coplilot に質問します」と表示されたところに記入します。Copilotにはコード補完をはじめとして便利な機能がたくさんありますが、それらについてはおいおい慣れていくとして、今のところはCopilotへの質問に専念しましょう。
最初は分からないことばかりだと思うので、このように大ざっぱな質問で構いません。質問を投げると、サインインされていない場合にはサインインを求めてきます(図3)。
[Sign in]をクリックすると、ブラウザが開いてCopilotへのサインインを求められるので、GitHubアカウントとパスワードを指定してサインインを済ませてください。
サインインが済めばVS Codeに戻ってきて、サインイン前に投げた質問が送信されます。図4のような回答が得られました。
「1.Javaの基本文法」「2.オブジェクト指向プログラミング(OOP)」などが提示されました。この当たりは、定番をしっかり押さえていますね。Javaの特徴といえばオブジェクト指向であるのは第1回で解説した通りですが、まずは基本文法から学ぼうというわけです。「3.Javaの標準ライブラリ」「4.実践的なプログラミング」も基本文法ありきですから、まずはここをしっかりやることにしましょう。なお、本連載では4.あたりまでを学習する予定です。
チャットパネル下部の小窓の上を見ると、「どの教材がオススメですか?」と青い文字で表示されています。これは、Copilotが用意してくれた関連質問です。クリックすると、この質問を投げたものとして回答してくれます。市販書籍やオンライン学習プラットフォームがリストアップされるので、興味があればクリックしてみればよいでしょう。
図4「1.Javaの基本文法」では、細かく4つのテーマが提示されました。
いずれもJavaプログラミングの根幹となる、他のプログラミング言語にも通じるテーマです。次の質問にいきたいところですが、Copilotに限らず対話型AIに聞くコツは、最初は漠然とした質問でも、回答中に登場したキーワードなどを指定して、より具体的な質問に切り替えていくことです。今回は、「変数とデータ型」というキーワードが登場したので、これについて聞いてみることで、さらに詳しい回答を得ることにしましょう。
「変数の基本中の基本を教えて!」と投げてみました。既にJavaについて聞いていることが分かっているので、「Javaの変数〜」といった、くどい質問にしなくてよいのです。また、キーワードは複数にしないことと、「基本中の基本」などと入れることでレベル付けしてあげた方が、期待に近い回答を得られやすくなります(図5)。
コンパクトに要所を押さえた回答が得られました。「変数とは名前付きの箱」であると説明されており、「宣言」「代入」「使用」という3つの段階で使い方が示されています。これを掘り下げてみます。
1.変数の宣言
「変数は名前付きの箱」とあるように、「変数」とはデータを入れておく名前の付いた箱のようなものです。演算した途中経過を一時的に保管したり、やりとりをしたりするために利用できます(図6)。
「変数の宣言」とあるように、Javaでは変数を使うに当たり、「宣言」が必要です。宣言とは、「変数を作る」ことです。ある変数を使いたいとき、必ず変数を宣言しなければなりません。
2.変数への代入
「変数に値を入れる。」ことを「代入」といいます。変数は、宣言しただけでは中に何が入っているか分からないので、何かしらの値を代入してあげる必要があります。なお、回答にはありませんでしたが、宣言した変数に最初の値を入れることを特に「初期化」といいます。代入を再び実行して、別の値を入れることもできます。
3.変数の使用
値が入った変数は、「使用」することができます。値を読み取って表示したり、別の変数に入れたりといった操作が可能になります。
上記を理解するために、図5の「例: 変数の基本的な使い方」にある場所に書かれているコードを実際にVS Codeで入力して試してみましょう。前回の手順で、新しいプロジェクト「basic」を作ります。手順を忘れてしまった人は、第1回を参照してください。プロジェクトを作ったら、App.javaファイルを開きます(図7)。
コピペではなく、図5のCopilotの回答を見ながら、mainメソッドの内部、「System.out.println("Hello, World!");」の下に「int number;」と入力してみます。ここで、「int 」(最後はスペース)まで入力すると、うっすらと「a = 5;」などと表示されることに気付くでしょう(図8)。これが、Copilotの機能である「コード補完」です(「GitHub Copilot Suggestion」といいます)。
コード補完の機能は、前回導入したJavaの拡張機能でも提供されます。これらが、主にメソッドや引数の候補を出す定型の機能であるのに対し、Copilotのコード補完は「次に入力すべきコード」を提示してくれます。この場合は、「int 」まで入力したことで、「これはおそらく変数を宣言しようとしているので、その基本形を提示しよう」としてくれています。提示で問題なければ、[Tab]キーを入力することで提示内容が確定し、実際に入力されます。これを元に、変数名や数値を望むものに書き換えればよいでしょう。[Esc]キーを入力すれば、提案自体を取り消せます。
なお、「int a = 5;」を確定させると、「次はbじゃないの?」と「int b = 10;」といった文を提示してくれます。これも問題なければ[Tab]キーで確定できるので、変数宣言を続けたい場合には便利です。
今回は、「int number;」が欲しい内容なので、Copilot提示の内容を修正するか、無視して終わりまで手入力します。ここで、次の行を入力しようとすると、同様に「number = 5;」などの候補が、それを確定させると今度は「System.out.println(…);」などの候補が、といった具合に次々と提示されます(図9)。「Copilotの回答に沿った内容を入れているのだから当たり前では?」と言われるとそれまでなのですが、次に入力すべきコードを次々と提示してくれるのは便利です。
最終的なコードは図10の通りです。実行させると、App.javaに最初から入っていたコードによる表示に加え、今回入力したコードで「10」と表示されていることが分かりますね。
プロジェクトを作ってソースファイルを開くと、それはCopilotに「関連ファイル」として認識されます。図7において、質問を入力するボックスに「App.java Current file」と表示され、現在開かれているファイルが関連ファイルとなっていることが分かります。関連ファイルは、[コンテキストを追加する...]で表示されるポップアップメニューから「関連ファイル」かファイルそのものを選択するか、「#file: 」の入力で指定することができます(図11)。
関連ファイルは、図12のようにCopilotが「あなたのコードでの例」といった認識を示すようになるなど、コンテキスト(文脈)の理解に利用されます。
「ポイント」欄には、変数の名前について「わかりやすい名前を付けるのがコツです。」とあります。「わかりやすい名前ってナニ?」と聞いてみると、面白い回答が得られるかもしれませんよ!
図13には「ポイント」欄があり、「変数には《型》を指定します。」と説明されています。「型は、変数にどんなデータを入れるかを決めます。」とあるように、Javaでは変数には「型」というものがあり、それは宣言時に決めなければなりません。「型」はデータの型であることから、「データ型」とも呼ばれますが意味は同じです。
先ほど入力したコードには、「int」と記述しました。図13の「型の例」によると、これがデータ型です。このように、変数について聞けば必ず一緒になって返ってくるのがデータ型で、切っても切り離せない関係です。
「型の例」とありますし、ずいぶんとシンプルなので、実はもっとありそうです。そこで、「データ型についてもっと詳しく!」と投げてみました(図14)。
これによると、データ型には大きく分けて、「プリミティブ型」(基本型)と「参照型」があるようです。
プリミティブ(「原始的な」などの意味)の名の通り、数値や文字など基本となる値を表すデータ型です。図15の回答によると、プリミティブ型には大きく分けて4種類、8個のデータ型があります。
データ型によって表せる値の範囲や、必要なメモリの大きさなどが決まっているので、用途に応じて適切なデータ型を選ぶ必要があります。図15を基に、表1〜4にまとめてみました。サイズとは必要なメモリの大きさです。また、long型の数値にはサフィックス(接尾辞)としてLまたはlを、float型の数値にはFまたはfを、それぞれ指定する必要があります。
型 | サイズ | 範囲 | 例 |
---|---|---|---|
byte | 1バイト | -128〜127 | byte b = 10; |
short | 2バイト | -32,768〜32,767 | short s = 100; |
int | 4バイト | -2,147,483,648 〜 2,147,483,647 | int i = 1000; |
long | 8バイト | -9,223,372,036,854,775,808 〜 9,223,372,036,854,775,807 | long l = 100000L; ※Lまたはlを付ける |
表1 Javaの整数型 |
型 | サイズ | 精度 | 例 |
---|---|---|---|
float | 4バイト | 約7桁(単精度) | float f = 3.14F; ※Fまたはfを付ける |
double | 8バイト | 約15桁(倍精度) | double d = 3.14159; |
表2 Javaの浮動小数点型(小数) |
型 | サイズ | 説明 | 例 |
---|---|---|---|
char | 2バイト | 単一文字(UTF-16でエンコード) | char c = 'A'; |
表3 Javaの文字型 |
型 | サイズ | 説明 | 例 |
---|---|---|---|
boolean | JVM依存(1ビット程度) | 真偽値(trueまたはfalse) | boolean isActive = true; |
表4 Javaの論理型 |
このようにたくさんのデータ型があります。先ほどApp.javaに入力した「int number;」の「int」は、4バイトの整数型ということが分かります。
参照って何だろうということですが、値そのものを表すのではなく、値の「場所」を表すデータ型です。プリミティブ型では種類によって必要なメモリの大きさが決まっていましたが、参照型は長さの決まっていない値を扱う場合に使用します。それらが、図16にある「オブジェクト」や「配列」です。です。回答には「オブジェクト」や「メモリの参照先」を扱うなどとありますが、現時点ではそれについての理解は不要です(後続の回で明らかになります)。
ここには、「(1)文字列型」「(2)配列型」「(3)クラス型」の3種類が登場します。
文字列型とはString型ともいい、文字型とは異なり複数の文字を保持します。文字数は0文字から何文字でもOKです(実際には上限がありますが、現実的な利用でということです)。
配列型はArray型ともいい、複数の同じデータ型の値をまとめて保持します。図16にあるように、配列型の変数はちょっと変わった形式で宣言します。また、配列型の変数を使うときにも、普通の変数とは違った形式となります。
最後のクラス型は、ユーザー定義のデータ型です。標準ライブラリのクラスも、これに含まれます(文字列型のStringもクラスですが、Javaでは特別扱いされています)。
いろいろなデータ型が登場したので、サンプルをCopilotに作成してもらいましょう。これには、「インラインチャット」を使います。ソースファイル中でコードを挿入したい箇所で、macOSの場合は[Command]+[I]キー、Windowsの場合は[Ctrl]+[I]キーを入力します。質問文「ここに、いろんなデータ型のサンプルを入れて。」を入力して送信すると、コードの候補が薄い文字で表示されるので、[同意する]を入力するとコードが確定します(図17)。
確定したコードはもちろん有効なので、すぐに実行して結果を確認できます。
変数とデータ型を学んだので、ここで少し高度な内容に踏み込んでみます。変数の宣言の方法に、もっと新しいものがないかどうか聞いてみましょう。「変数宣言の最新の方法は?」と投げてみました。回答として、関連ファイル(App.java)をその方法で書き換えたものが提示されます(図18)。
変数宣言は、「int number;」のような形式の他に「var number = 10;」といった形式が可能です。これを「型の推論」といいます。この場合、「10」からデータ型を推論するので、初期化が必須となります。タイピング量を減らしたり、コードの読みやすさをアップさせたりする効果がありますが、intのようなシンプルなデータ型ではあまりありがたみを感じないかもしれません。後続の回で登場する、何回もタイピングするのが苦痛になるような複雑なデータ型だと、その恩恵が理解できるでしょう。
データ型には整数型だけでも4種類もありました。「整数型に4種類もあるのはなぜ?」と聞いてみると、単純にlong型があればよいわけではない理由が分かるもしれませんよ!
変数への代入では「=」という記号を使っていました。これの意味することは何でしょうか? もちろん、「代入」ということなのでしょうが、それも含めて聞いてみましょう。「「=」の意味を教えて。他にもあればそれについても。」と投げてみました(図19)。かなり口語的ですが、これでも大丈夫です。
回答によると、「=」は代入演算子です。代入する演算子ということですね。このように、演算子とは演算の種類を表す記号です。「他の関連する演算子」に4種類に分けてくれたので、データ型と同様に表5〜7にまとめてみました。
演算子 | 役割 | 例 | 結果 |
---|---|---|---|
+ | 加算(a + b) | 5 + 3 | 8 |
- | 減算(a - b) | 8 - 5 | 3 |
* | 乗算(a * b) | 2 * 7 | 14 |
/ | 除算(a / b) | 6 / 3 | 2 |
% | 剰余算(余り、a % b) | 7 % 3 | 1 |
表5 Javaの主な算術演算子 |
演算子 | 役割 | 例 | 結果 |
---|---|---|---|
== | 等しい(a == b) | 3 == 3 | true |
!= | 等しくない(a != b) | 8 != 5 | true |
< | 小さい(a < b) | 2 < 7 | true |
> | 大きい(a > b) | 6 > 3 | true |
<= | 等しいか小さい(以下、a <= b) | 3 <= 3 | true |
>= | 等しいか大きい(以上、a >= b) | 5 >= 3 | true |
表6 Javaの主な比較演算子 |
演算子 | 役割 | 例 | 結果 |
---|---|---|---|
&& | 論理積(AND、a & b) | true && true | true |
| | 論理和(OR、a | b) | true || false | true |
! | 否定(NOT、!a) | !true | false |
表7 Javaの主な論理演算子 |
たくさんの演算子があり、使い方がイメージできるもの、そうでないものがあると思います。算術演算子は計算に使うものと想像できそうですが、比較演算子や論理演算子はいつどのように使うのか? という疑問も沸くでしょう。これらの演算子は、後続の回で「制御構文」など一緒に使うので、その際に改めて紹介します。ここでは、算術演算子のサンプルをインラインチャットで作ってみます。「算術演算子のサンプルを日本語で入れて。」と投げてみました(図20)。
算数や数学では計算の順序がありました。「演算子に計算の順番はあるの?」と聞いてみると、Javaではどのような計算順序があるか分かると思いますよ!
ここまでで、「int number;」とか「number = 10;」の意味をCopilotの力を借りながら解説してきました。ここで、分かっているようで分かっていないものに、「10」があります。「それって数字の10では?」と即答されそうですが、おそらくはきちんとした意味があるのではないでしょうか? 最後に、この質問を投げてみます。これまで出てきた回答から「10とか'A'とか"Java"って何?」という質問を作ってみました(図21)。
10とか'A'は、「リテラル」です。リテラルには、「書いたまま」のような意味があるので、まさに数値や文字そのものを表すもの、と理解しておけばよいでしょう。Copilotの回答を基に、表8のようにまとめてみました。longにLまたはl、floatにFまたはfを付けるのは、データ型の説明のときと同じです。
種類 | データ型 | 表すもの | 例 |
---|---|---|---|
整数リテラル | int、long | 整数値(longの場合は末尾にLかl) | 10 100000L |
浮動小数点リテラル | double、float | 小数値(floatの場合は末尾にFかf) | 3.14 0.5f |
文字リテラル | char | 1文字(「'」で囲む) | 'A' '1' '@' |
文字列リテラル | String | 複数の文字(「"」で囲む) | "Java" "Hello, World!" |
論理リテラル | boolean | 真偽値 | true false |
表8 Javaの主なリテラル |
ちょっとしたルールはありますが、リテラルは直感的に分かりやすいですね。
例えば文字リテラルや文字列リテラルの中で「'」とか「"」を入れたいときはどうすればいいでしょうか? 「リテラルに'とか"を使いたい!」と質問してみましょう!
今回は、GitHub Copilotを利用できるようにして、プログラミングの基本と言える変数、データ型、演算子、リテラルをCopilotに聞きながら学習しました。
次回は、条件分岐という構文を学習します。いよいよプログラミングらしくなってきますので、お楽しみに。
WINGSプロジェクト 山内直
WINGSプロジェクト所属のテクニカルライター。出版社秀和システムを経てフリーランスとして独立。ライター、エディター、デベロッパー、講師業に従事。屋号は「たまデジ。」。
・たまデジ。 | たまプラーザで生活、仕事する。(https://naosan.jp/)
WINGSプロジェクト
有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティー(代表山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手掛ける。2021年10月時点での登録メンバーは55人で、現在も執筆メンバーを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。
・サーバーサイド技術の学び舎 - WINGS(https://wings.msn.to/)
・RSS(https://wings.msn.to/contents/rss.php)
・X: @WingsPro_info(https://x.com/WingsPro_info)
・Facebook(https://www.facebook.com/WINGSProject)
Copyright © ITmedia, Inc. All Rights Reserved.