検索

キーワード

【Java】サーブレット(Java Servlet)

こんにちは。エンジニアの新田です!ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。今回は、主にJavaサーブレット/JSPについて触れていきます。Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!関連記事:【Java】サーブレットの作成(基本的なコーディング)サーブレット(Java Servlet)とは?「サーブレット」とは、どのようなものでしょうか?Webサーバ上(バックエンド)で動く、Javaで書かれたプログラムのことです。(単にサーブレットと呼ばれることが多い)ユーザーが検索フォームでキーワードを入力して検索ボタンをクリックする等、クライアント側からリクエストを送ると、その要求をサーブレットが受けてデータの処理をしたり動的なWebページを生成したりします。動的なWebページとは、同じURLをリクエストされた場合でもリクエスト(入力内容など)に応じてページの見え方が変わるようにWebサーバー側で何らかの処理(プログラム)を実行して、HTMLテキストを生成して提供するページのことです。(静的なWebページは、Webサーバーにあらかじめ保管してあるHTMLファイルをそのまま返す)動的なWebページを提供する方法はいくつかありますが、そのうちの1つの方法としてサーブレットが利用できます。【動作イメージ】①. Webブラウザから、リクエストが送信される。※リクエストの種類によって、処理を分岐する。A-①. 動的な処理の場合、サーブレットコンテナに処理(サーブレットの実行)を依頼(動的なWebページ)A-②. データベースアクセスが必要な場合は、データベースへの問い合わせA-③. データベースが結果を返却A-④. サーブレットにより生成された結果(HTML)を返却B-①. 静的な処理の場合、Webサーバー上の対象リソース(HTML、画像ファイルなど)を参照B-②. 対象リソース(HTML、画像ファイルなど)を返却②. 実行結果をWebブラウザに送信。Webブラウザに実行結果が表示される。Java Servletの実態はJavaのクラスです。つまり、.javaファイルをコンパイルした.classファイルであり、通常のJavaファイルと同じです。Servlet実行に必要な要素(ミドルウェア、ソフトウェア)Servletの実行には以下の要素が必要になります。JRE(JavaSE)Javaそのものの実行環境Webサーバ(Apacheなど)リクエストを受信するために必要Servletコンテナ(Tomcatなど)Servletの実行環境Webブラウザ (Chrome,IE,Firefoxなど)Webアプリケーションのクライアントサーブレットのメリットサーブレットには以下のようなメリットがあり、大規模なWebアプリケーションにも対応できるものになっています。メモリ上に常駐するので、実行する度に新しいプロセスを生成する必要が無い一度実行されたServletは、1つのスレッドとして実行環境のメモリ上に常駐するため、2回目以降の実行においては、新たなプロセスを生成せずに、すでにあるものを実行できるため、応答速度に優れている。マルチスレッドで動作することができる複数のクライアントから同時にリクエストがあっても、片方を待たせることなく並行して処理を行うことができるため、応答速度に優れている(ただし、複数スレッドを考慮した実装をする必要はある)。Javaのメリットをそのまま享受することができるServletはJavaで書かれているため、プラットフォームに依存しない。それ以外にもJavaのメリットとなる点についてはServletでも同様のメリットがある。Servletコンテナ(Webコンテナ)サーブレットはJavaプログラムなので、Java実行環境が必要になります。通常のJavaアプレットであればJVMを直接利用しますが、サーブレットの場合は、サーブレットコンテナを経由してJVM上で実行されます。HTTPリクエストをWebサーバー経由でサーブレットコンテナが受け取り、サーブレットコンテナがサーブレットに対して処理の命令を出す流れになります。Servletコンテナを搭載する製品■ オープンソースTomcat (Apache Tomcat Project)Geronimo(Apache Geronimo Project)など■商用アプリケーションサーバWebSphere Application Server (IBM)WebLogic Server (Oracle)などServletコンテナによるServletの制御サーブレットの初回起動時には、サーブレットをローディングし、サーブレットの初期化(initメソッド)を実行します。その後、サーブレットをServletコンテナ上に常駐化(インスタンス化)し、Webブラウザからの呼び出しを待ちます。常駐(インスタンス化)しているサーブレットがWebブラウザから呼び出されたときは、そのままサービスの実行(serviceメソッド)を行います。サーブレットの停止は、Servletコンテナの停止と同時に行います。このとき、サーブレットの消滅(destroyメソッド)を処理します。【動作イメージ】①. Webサーバ経由で受け取ったクライアントからのリクエスト(URL)を解析し、サーブレットの起動と呼び出しを行う。※指定されたサーブレットの状態によって処理が分岐する②. まだコンテナ内にインスタンス化されていなければ、サーブレットをロードする(※すでにインスタンス化されている場合は、インスタンス化さ れているサーブレットを再利用する。)③. インスタンス化したサーブレットはコンテナのメモリ上に常駐する(次のリク エストを待つ)④. リクエストされたサーブレットを実行⑤. サーブレット実行結果を返却する⑥. 出力結果(HTML)を、Webサーバを経由でWebブラウザに返却する。次回以降の記事では、サーブレットを実際に動かすための動作環境と、簡単なJavaコードについて紹介していきたいと思います。関連記事:【Java】サーブレットの作成(基本的なコーディング)おまけプログラミングの学習やエンジニアへのキャリアチェンジをお考えの方へ『東京ITカレッジ』、『フォワードソフト株式会社』ぜひチェックしてみてください!

【Java】Webアプリケーションとは?

こんにちは。エンジニアの新田です!ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。今回は、主にJavaサーブレット/JSPについて触れていきます。Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!関連記事:【Java】サーブレット(Java Servlet) 【Java】WebアプリケーションにおけるMVCモデルWebアプリケーションとは?「Webアプリケーション」とは、どのようなものでしょうか?その名の通り、「Webの仕組みと機能を使ったインターネット経由で提供されるアプリケーション」のことです。Webサーバに配置されたアプリケーションを、Webブラウザ(Webクライアント)などから操作して利用します。例えば、以下に挙げたものもWebアプリケーションです。ポータル/検索サイト:「Yahoo!」や「Google」などショッピングサイト:「Amazon」や「楽天」など掲示板:「2ちゃんねる」などブログ、SNS、 etc…などなど、皆さんも使ったことがあると思います。身近なものを含め様々な用途で使用されています。皆さんが見ているこのサイトもWebアプリケーションの一つです。Webアプリケーションの処理の流れ基本的な処理の流れは以下のようになります。ブラウザでの入力等の操作(リクエスト)がWeb経由でサーバに送信されるリクエストを受けたWebサーバで処理が実行され、結果としてHTMLが生成されるWebサーバから呼び出し元(Webクライアント)に処理結果(HTML)を送信する処理結果(HTML)を受け取ったブラウザは、HTMLを表示する(このような手順を繰り返していく)一般的なWebサイトへログインする流れを例にすると以下の図のようになります。①.Webブラウザを立ち上げ、URLを入力してWebサーバ上に配置されたアプリケーションへアクセスする②.Webブラウザに、ログインページが表示される③.Webブラウザ上に表示されたログインフォームにIDとパスワードを入力し、「ログイン」ボタンをクリックする④.WebサーバーはシステムがIDとパスワードを受け取り、データベースにIDとパスワードを照会する⑤.データベースは照会結果をWebサーバに返す⑥.Webサーバーは照会結果(「正常」、「異常」)をWebブラウザに返すWebブラウザが結果を受け取り、HTMLをブラウザで表示するWebクライアント(ブラウザ)とWebサーバ間でのデータの送受信にはHTTPというプロトコルが使われています。プロトコルとは、簡単にいうとコンピュータ同士がやりとりする際のルールと手順のようなもので、共通の通信プロトコル(ルール)を使うことで、データのやり取りができるようになっています。なぜ、Webアプリケーションを使うのか?Webアプリケーションには以下ようなメリットがあります。更新が容易であるWebサーバ上のファイルを更新するだけで、クライアントはHTTPアクセスするだけで最新のウェブアプリケーションを利用できる。クライアント側にアプリケーションのインストールが不要Webサーバで処理を行って出力結果のファイルをクライアント側(ウェブブラウザ)で表示するだけなのでクライアントはウェブアプリケーションをインストールする必要がない。ウェブブラウザがあれば環境に依存しない各クライアント側の環境が違っていてもウェブブラウザがあればクロスプラットフォームに対応できる。Webアプリケーションを実現する方法(開発言語など)Webクライアントからのリクエストに対して、適切な処理を実行し結果を生成する部分には、様々な仕組み(開発言語)が用いられます。それぞれに特徴があり、用途に合わせて最適なものを選択して利用します。代表的なものをいくつか紹介します。CGI現在稼動されているほとんどのWebサーバにCGIという仕組みが実装されている。開発言語としてよく使われるものには、Perl(パール)、Python(パイソン)、Ruby(ルビー)などがある。リクエストの度に実行環境が起動するため処理速度が遅いとされ、大量のリクエストを処理する必要があるアプリケーションには向かない。(※最近では、プロセスの起動後一定時間はプロセスを終了せずに起動し続け、処理速度の向上を図るFastCGIという方式が登場している)PHPCGIの仕組みを使って動作させることができるが、CGIと同様の特徴を持つことになるWebサーバがモジュール機構を提供していれば、モジュール方式としてWebサーバの一部として動作させることができる。(現在ではほとんどのWebサーバは、モジュール機構を提供している)モジュール方式で動作する場合は、Webサーバーの一部として動作することになり、その中で複数のリクエストを処理することができる。(CGIより処理速度が速いとされ、大量のリクエストを処理することが可能となる)オブジェクト指向のプログラミング言語で、文字列操作やデータベースとの連携も容易。ASP.NET(Active Server Pages NET)Microsoftが開発・提供しているWebアプリケーションフレームワーク。MicrosoftのIIS(InternetInformationServices:Webサーバ)をWebサーバとしてプログラムが実行される。動作環境はWindows(Windows2000以降)に限られる。複数のリクエストをひとつの実行環境で処理でき、大規模なWebアプリケーションにも対応できる。使用できる言語はVisualBasic(ビジュアル・ベーシック)、C#(シー・シャープ)、などの.NETに対応したもの。VisualBasicやC#はオブジェクト指向のプログラミング言語。開発環境は、MicrosoftVisualStudioに限られ、.NETフレームワークに向けてコンパイルされるため、高速に動作する。サーブレット/JSP(Java Server Pages)オブジェクト指向の言語であるJavaで記述される。サーブレット/JSPは、Webコンテナ、サーブレット・コンテナと呼ばれるもので実行される。Webコンテナ、サーブレットコンテナには、さまざまなプラットフォームに対応したさまざまな製品があるが、オープンソースのアプリケーションサーバであるTomcatが高いシェアを誇っている。複数のリクエストをひとつの実行環境で処理でき、大規模なWebアプリケーションにも対応できる。サーブレット・コンテナに向けてコンパイルされたものが実行されるため、高速に動作する。次回以降の記事では、JavaのServlet/JSPを使った実現方法について紹介していきたいと思います。関連記事:【Java】サーブレット(Java Servlet) 【Java】WebアプリケーションにおけるMVCモデルおまけプログラミングの学習やエンジニアへのキャリアチェンジをお考えの方へ『東京ITカレッジ』、『フォワードソフト株式会社』ぜひチェックしてみてください!

【Java】java.io.Fileクラスの使い方(ファイル一覧の取得、フィルタ)

こんにちは。駆け出しプログラマーの松倉です!ここでは、java.io.Fileクラスの使い方の紹介・解説を行います。プログラミング未経験の方、Javaについて勉強している方、これから勉強したいと思っている方の参考になれば幸いです! 関連記事リンク:【Java】java.io.Fileクラスの使い方(ファイル・ディレクトリ操作、パス、ファイル名、拡張子)java.io.File「java.ioパッケージ」には、データストリーム、直列化、ファイルシステムによるシステム入出力用などの様々なクラスが含まれます。java.ioパッケージの一つである「java.io.File」は、Javaでファイルやディレクトリ(フォルダ)の一覧取得、フィルタリングなどの操作を行うことができます。ファイル操作はこの Fileを通して行いますので、全ては Fileのインスタンスを生成したり取得するところから始まります。この記事では java.io.Fileの以下のことについて紹介・解説を行います。ファイル一覧取得フィルタ(FileFileter, FilenameFilter)ファイル一覧取得Fileクラスの「listFilesメソッド」は、指定したディレクトリに含まれるファイルやディレクトリを配列として返します。主に指定したディレクトリの中身を調べたいときに使用します。listFilesメソッドは、指定したパス名がディレクトリを示さない場合や、入出力エラーが発生した場合は nullを返します。listFilesメソッドの使い方File 変数名 = new File(調べたいディレクトリのパス); File[] 一覧 = 変数名.listFiles();listFilesメソッドで一覧を取得するとファイルとディレクトリの判別ができません。そのためファイルとディレクトリを判別するには、Fileクラスの「isFileメソッド」と「isDirectoryメソッド」を使用します。isFileメソッドは対象がファイル、isDirectoryメソッドは対象がディレクトリだった場合 trueを返します。isFileメソッドの使い方File 変数名 = new File(調べたいオブジェクト); boolean 判断結果 = 変数名.isFile();isDirectoryメソッドの使い方File 変数名 = new File(調べたいオブジェクト); boolean 判断結果 = 変数名.isDirectory();listFilesメソッドでディレクトリの中身の一覧を取得し、取得したオブジェクトを「isFileメソッド」と「isDirectoryメソッド」で判別したサンプルコードを確認しましょう。import java.io.File; class Sample1 { public static void main(String[] args) { File file = new File("D:\\Sample"); File[] list = file.listFiles(); if (list != null) { for (int i = 0; i

【Java】java.io.Fileクラスの使い方(ファイル・ディレクトリ操作、パス、ファイル名、拡張子)

こんにちは。駆け出しプログラマーの松倉です!ここでは、java.io.Fileクラスの使い方の紹介・解説を行います。プログラミング未経験の方、Javaについて勉強している方、これから勉強したいと思っている方の参考になれば幸いです! 関連記事リンク:【Java】java.io.Fileクラスの使い方(ファイル一覧の取得、フィルタ)、【Java】例外の概要、例外クラスについてjava.io.File「java.ioパッケージ」には、データストリーム、直列化、ファイルシステムによるシステム入出力用などの様々なクラスが含まれます。java.ioパッケージの一つである「java.io.File」は、Javaでファイルやディレクトリ(フォルダ)の作成、削除、存在確認など、プログラム上で必要な操作を行うことができます。ファイル操作はこの Fileを通して行いますので、全ては Fileのインスタンスを生成したり取得するところから始まります。この記事では java.io.Fileの以下のことについて紹介・解説を行います。ファイル、ディレクトリ操作(新規作成、名称変更、削除)パス、ファイル名、ファイル拡張子ファイル、ディレクトリ操作(新規作成、名称変更、削除)Javaではファイルもディレクトリも同じものとして扱います。つまりディレクトリも 1つの Fileクラスのオブジェクトとして扱うことが出来ます。ファイルとディレクトリの操作の違いについて以下の表にまとめましたファイル操作とディレクトリ操作は基本的に同じ方法で実行することができますが、方法が異なるものもあります。ここではファイルとディレクトリの新規作成、名称変更、削除の操作方法について紹介します。新規作成Javaでは新規に空のファイル、ディレクトリを作成することができます。ファイル操作とディレクトリ操作では新規作成で扱うメソッドが異なります。ファイル操作新規に空のファイルを作成するには、Fileクラスの「createNewFileメソッド」を使用しますcreateNewFileメソッドは Fileオブジェクトが参照するパスに空のファイルを新規で作成します。作成できたかどうかは戻り値の booleanで判断します。指定のファイルが存在していない場合にのみ空のファイルを作成し、trueを返します。ファイルが存在している場合は作成せず、falseを返します。createNewFileメソッドの使い方File 変数名 = new File(新規で作成するファイル); boolean 結果 = 変数名.createNewFile();createNewFileメソッドを使う場合、「IOException」という例外が発生する可能性があります。そのため、必ず例外処理を記述しましょう。createNewFileメソッドを使ってファイルを新規作成するサンプルコードを確認しましょう。import java.io.File; import java.io.IOException; public class Sample1_1 { public static void main(String[] args) { File newfile = new File("d:\\Sample\\test00.txt"); try { if (newfile.createNewFile()) { System.out.println("ファイルの作成に成功しました"); } else { System.out.println("ファイルの作成に失敗しました"); } } catch (IOException e) { System.out.println(e); } } }実行結果:ファイルの作成に成功しました作成する時点ではファイル「d:\\Sample\\test00.txt」存在しないためファイルの作成ができました。ではこのプログラムをもう一度実行してみましょう。 実行結果:ファイルの作成に失敗しましたファイル「d:\\Sample\\test00.txt」が既に存在するため、ファイルの作成ができませんでした。ディレクトリ操作新規でディレクトリを作成する場合、「mkdirメソッド」を使うことで作成することができます。mkdirメソッドは生成した Fileオブジェクトが参照するディレクトリを新規に作成します。mkdirメソッドは親ディレクトリが存在していない場合、または既に指定のディレクトリが存在していた場合、このメソッドは falseを返してディレクトリを作成しません。作成できたかどうかは戻り値の booleanで判断します。mkdirメソッドの使い方File 変数名 = new File(ディレクトリ名); boolean 結果 = 変数名.mkdir();親ディレクトリを含めて必要なディレクトリ階層を全て作成する場合は、「mkdirsメソッド」を使用します。mkdirメソッドでは親ディレクトリがまだ存在しないディレクトリを作成する場合、ディレクトリを作成することはできません。そのため親ディレクトリから1つ1つ作成しなければなりません。しかし、mkdirsメソッドは親ディレクトリが存在しない場合、必要なディレクトリを全て作成しますmkdirsメソッドの使い方File 変数名 = new File(ディレクトリ名); boolean 結果 = 変数名.mkdirs();新規でディレクトリを作成するサンプルコードを確認しましょう。import java.io.File; public class Sample1_2 { public static void main(String[] args) { File newfile = new File("d:\\Sample\\sub"); if (newfile.mkdir()) { System.out.println("ディレクトリの作成に成功しました"); } else { System.out.println("ディレクトリの作成に失敗しました"); } } } 実行結果:ディレクトリの作成に成功しました作成時点でディレクトリ「d:\\Sample(親ディレクトリ)」が存在し、「sub」が存在しないため、ディレクトリの作成に成功しています。ではこのプログラムをもう一度実行してみましょう。実行結果:ディレクトリの作成に失敗しました ディレクトリ「d:\\Sample\\sub」が存在しているため、ディレクトリの作成ができませんでした。存在確認ファイルを操作する前に操作対象のファイルが存在するかを確認します。指定のファイルまたはディレクトリが存在するかどうかを確認するには、Fileクラスの「existsメソッド」を使用します。existsメソッドは生成した Fileオブジェクトが参照するファイルもしくはディレクトリが存在するかを調べます。存在確認ができたかどうかは戻り値の booleanで判断します。存在する場合は trueを、存在しない場合は falseを返します。対象のディレクトリにアクセス権限がない場合は、ファイルが存在していても falseを返します。existsメソッドの使い方File 変数名 = new File(確認するファイル名); boolean 結果 = 変数名.exists();新規作成で作成したファイル「d:\\Sample\\test00.txt」を existsメソッドで調べるサンプルコードを確認しましょう。import java.io.File; public class Sample2 { public static void main(String[] args) { File file = new File("d:\\Sample\\test00.txt"); if (file.exists()) { System.out.println("ファイルは存在します"); } else { System.out.println("ファイルは存在しません"); } } }実行結果:ファイルは存在します ファイル「d:\\Sample\\test00.txt」が存在することが確認できました。名称変更(リネーム)ファイルまたはディレクトリをリネームまたは移動するには、Fileクラスの「renameToメソッド」を使用します。renameToメソッドは生成した Fileオブジェクトが参照するファイル(またはディレクトリ)を、引数で指定した Fileオブジェクトが参照するファイル(ディレクトリ)へリネームします。同名のファイル名でパスを変更した場合は移動となります。移動できたかどうかは戻り値の booleanで判断します。renameToメソッドの使い方File 変数名1 = new File(移動前のファイル名); File 変数名2 = new File(移動後のファイル名); boolean 結果 = 変数名1.renameTo(変数名2);ファイル操作の新規作成で新たに作成したファイル「d:\\Sample\\test00.txt」を renameToメソッドを使って移動させたサンプルコードを確認しましょう。import java.io.File; class Sample3 { public static void main(String[] args) { File newfile = new File("d:\\Sample\\test00.txt"); File renamefile = new File("d:\\Sample\\test01.txt"); if (newfile.exists()) { if (newfile.renameTo(renamefile)) { System.out.println("ファイルの移動に成功しました"); } else { System.out.println("ファイルの移動に失敗しました"); } } else { System.out.println("ファイルが存在しません"); } } } 実行結果:ファイルの移動に成功しましたファイル「d:\\Sample\\test00.txt」がファイル「d:\\Sample\\test01.txt」に移動したことが確認出来ました。削除指定のファイルまたはディレクトリを削除するには、Fileクラスの「deleteメソッド」を使用します。deleteメソッドは生成した Fileオブジェクトが参照するファイル(またはディレクトリ)を削除します。削除できたかどうかは戻り値の booleanで判断します。※ディレクトリを削除する場合は、あらかじめ対象のディレクトリを空にしておく必要があります。そのため対象ディレクトリが空ではない場合は削除に失敗します。deleteメソッドの使い方File 変数名 = new File(削除するファイル名); boolean 結果 = 変数名.delete();ファイル操作のリネームで移動したファイル「d:\\Sample\\test01.txt」を deleteメソッドで削除するサンプルコードを確認しましょう。import java.io.File; public class Sample4 { public static void main(String[] args) { File file = new File("d:\\Sample\\test01.txt"); if (file.exists()) { if (file.delete()) { System.out.println("ファイルを削除しました"); } else { System.out.println("ファイルの削除に失敗しました"); } } else { System.out.println("ファイルが存在しません"); } } } 実行結果:ファイルを削除しましたファイル「d:\\Sample\\test01.txt」の削除に成功したことが確認出来ました。パス、ファイル名、ファイル拡張子Javaでファイル操作をする上で、ファイルパスを指定したりパスを取得するといった操作が必要になることがあります。パスとは目的のファイルがどこのフォルダに保存されているのかを示すものです。ウェブサイトのアドレスもこのパスの一種です。パスには「絶対パス」と「相対パス」の 2種類があります。絶対パスとはルートディレクトリと呼ばれる階層構造の頂点から目的地までの経路を表しています。そのためユーザが現在どのフォルダで作業中であっても、常に同じスタート地点から一つ経路の表示となります。相対パスとは基準となる現在のファイルから見て、任意のファイルがどこにあるかを指定します。そのため現在作業中のフォルダによってこの経路は異なります。ファイルのパスを取得ファイルのパスを取得する場合は、Systemクラスの「getAbsolutePathメソッド」を使用します。getAbsolutePathメソッドは絶対パスによるファイルの位置と名前を取得できます。getAbsolutePathメソッドの使い方File 変数名 = new File(相対パスで指定したファイル名); String 絶対パス = 変数名.getAbsolutePath();Fileクラスを使い相対パスで指定したファイルから、絶対パスを取得したいファイルのオブジェクトを作成します。作成したオブジェクトから getAbsolutePathメソッドを呼び出すことでファイルの絶対パスを取得できます。getAbsolutePathメソッドを使った絶対パスによるファイルの位置と名前を取得したサンプルコードを確認しましょう。import java.io.File; class Sample5 { public static void main(String[] args) { File file = new File("test01"); String str = file.getAbsolutePath(); System.out.println("pass : " + str); } } 実行結果:pass : D:\PleadesDownload\pleiades\workspace\sample\test01絶対パスを取得することが出来ました。ファイル名ファイル名やディレクトリは一覧を文字列としてではなく Fileクラスのオブジェクトの配列として取得しています。「getNameメソッド」はファイルパスからファイル名を、 「getParentメソッド」ファイルパスからディレクトリ名を取得することができます。getNameメソッドの使い方File 変数名 = new File(ファイル名を取得したいファイルパス); String 名前 = 変数名.getName();getParentメソッドの使い方File 変数名 = new File(ディレクトリ名を取得したいファイルパス); String パス名 = 変数名.getParent();※ getParent() は文字列で取得しますが getParentFile() は結果を File クラスで取得できます。ファイル名を取得するサンプルコードを確認しましょう。import java.io.File; public class Sample6 { public static void main(String[] args) { File fileName = new File("d:\\PleadesDownload\\pleiades\\workspace\\sample\\test01"); String file = fileName.getName(); System.out.println("ファイル名 : " + file); File dirName = new File("d:\\PleadesDownload\\pleiades\\workspace\\sample\\test01"); String dir = dirName.getParent(); System.out.println("ディレクトリ名 : " + dir); } }実行結果:ファイル名 : test01 ディレクトリ名 : \PleadesDownload\pleiades\workspace\sampleファイル拡張子拡張子はファイルの種類を示すのに使われます。プログラムでファイルの入出力を伴う処理を実装する際、ファイルの拡張子を取得することが多々あります。「lastIndexOfメソッド」は指定された文字を文字列の後ろから検索して、最初に見つかった位置を取得することができます。拡張子はファイル名の最後の( . )ピリオド以降の文字で表現されます。ファイル「d:\\Sample\\test01.txt」であれば「.txt」が拡張子に当たります。lastIndexOfメソッドを使って、ファイル名の後ろから( . )ピリオドを検索する事でファイルの拡張子を取得することができます。lastIndexOfメソッドを使って措定したファイルから拡張子を取得するサンプルコードを確認しましょう。import java.io.File; public class Sample7 { public static void main(String[] args) { File file = new File("d:\\Sample\\test01.txt"); String fileName = file.getName(); String ext = fileName.substring(fileName.lastIndexOf(".") + 1); System.out.println("ファイル名 : " + fileName); System.out.println("拡張子 : " + ext); } }実行結果:ファイル名 : test01.txt 拡張子 : txt拡張子を判別して取得できていることが確認できました。まとめこの記事では java.io.Fileクラスの使い方について解説しました。Fileクラスは、ファイルやディレクトリを作成したり、ファイルのチェック処理、読み込み・書き込み処理といった、ファイルシステムの操作全般で使用します。Javaの開発では何かしらのファイルを扱う機会は多いため、この記事でファイル操作の基本を覚えましょう。ファイル・ディレクトリ操作で気を付ける点として、自分が行っている操作が何に対して行っているかをしっかりと理解していなければなりません。ディレクトリに対して操作を行いたいのに、ファイルに対して操作を行っていたり、またその逆もあります。Fileクラスにはこの記事で紹介したメソッドの他にも多くのメソッドが用意されています。例えば、親ディレクトリパスの取得、ファイルの一覧の取得、ファイル名の取得などがあります。この記事では紹介しきれなかったことを【Java】java.io.Fileクラスの使い方(ファイル一覧の取得、フィルタ)で記述しています。興味のある方はこちらの記事も読んでみてください。おまけプログラミングの学習やエンジニアへのキャリアチェンジをお考えの方へ『東京ITカレッジ』、『フォワードソフト株式会社』ぜひチェックしてみてください!関連記事リンク:【Java】java.io.Fileクラスの使い方(ファイル一覧の取得、フィルタ)、【Java】例外の概要、例外クラスについて

【Java】列挙型についての紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!列挙(Enumeration)列挙型(Enum型)複数の定数をひとつにまとめてグループ化することができる型です。列挙型で定義された値のことを列挙子と呼びます。Javaにおいて列挙型はクラスです。java.lang.Enumクラスが継承されています。クラスには勿論フィールドや定義した値を操作することができるメソッドが実装されています。列挙型はプリミティブ型やクラスと同じように型として扱えますので、変数の宣言や代入、制御構文での論理式、メソッドへの引数や戻り値としても使用することができます。一般的なクラスと異なる大きな点は、新しいインスタンス生成が外部からできないことです。列挙型で定義された列挙子はプログラムの中で1つしかない「定数」として扱われます。列挙型は上手く利用すればプログラムの保守性や可読性の向上につながる便利な機能です。関連記事リンク:【Java】変数、定数の宣言と変数の列挙型、代入、型変換、型推論の使い方列挙型(Enum型)の宣言アクセス修飾子 enum 列挙名 {列挙子,列挙子2...};列挙子はすべて大文字で宣言し、単語間の区切りを『_』(アンダースコア)で表すのが一般的です。例:COLOR_RED, COLOR_BLUE等 宣言のサンプルコードを確認しましょう。public class Test { //列挙型(Enum型)の宣言 protected enum Color { COLOR_PINK, COLOR_LIGHT_BLUE, COLOR_INDIGO, COLOR_YELLOW }; }これで列挙型(Enum型)の宣言と列挙子を格納することができました。関連記事リンク;【Java】 アクセス修飾子について紹介列挙型の使用方法型の宣言が出来たら定義した値(列挙子)を操作しましょう。列挙子は以下のような構文で使用することができます。列挙名.列挙子名ex)Color.COLOR_PINK宣言のサンプルコードに追記して実装してみます。public class Test { //列挙型(Enum型)の宣言 protected enum Color { COLOR_PINK, COLOR_LIGHT_BLUE, COLOR_INDIGO, COLOR_YELLOW }; //列挙子の操作 public static void main(String[] args) { System.out.println(Color.COLOR_PINK); } }出力結果COLOR_PINKフィールド/メソッド/コンストラクタの定義の仕方列挙型はEnumクラスを継承しているので、フィールドやメソッド、コンストラクタを定義することができます。フィールドとコンストラクタを定義することで列挙子へ独自を値を持たせることが可能になります。またメソッドを使用し列挙子を操作することができます。関連記事リンク:【Java】 メソッドについて紹介!/【Java】 コンストラクタの紹介!列挙子への値の付与フィールドとコンストラクタを定義することで列挙子へ独自の値を付与することが可能になります。これにより、数値や別の識別子で列挙子を管理することができるメリットがあります。値を付与した列挙子の書き方は以下のようになります。列挙名.列挙子名(値)ex)Color.COLOR_PINK(1) Color.COLOR_PINK("桃色")列挙子の後に値を「( )」で囲み付与します。数値や文字列を値として付与することが可能です。列挙子へ付与された値は以下のような構文で使用することができます。列挙名.列挙子名.値のフィールド名ex)Color.COLOR_PINK.levelサンプルコードで確認しましょう。public class Test { //列挙型(Enum型)の宣言 protected enum Color { COLOR_PINK(128), COLOR_LIGHT_BLUE(100), COLOR_INDIGO(50), COLOR_YELLOW(0); // フィールドの定義 private final int level; // コンストラクタの定義 private Color(int level) { this.level = level; } } //列挙子の操作 public static void main(String[] args) { System.out.println(Color.COLOR_PINK.level); } }出力結果128文字列(String型)でも同様に実装することができます。コンストラクタのアクセス修飾子はprivateのみ使用可能となっています。フィールド定義の修飾子finalはTestクラス内からの操作を防いでいます。コンストラクタを記述しない場合、エラーが発生しますので注意しましょう。関連記事リンク:【Java】final 修飾子について紹介!/【Java】 アクセス修飾子について紹介int型とString型の両方の値付与二つの値を同時に付与することも可能です。サンプルコードで確認しましょう。public class Test { //列挙型(Enum型)の宣言 protected enum Color { COLOR_PINK("桃色",128), COLOR_LIGHT_BLUE("水色",100), COLOR_INDIGO("紺色",50), COLOR_YELLOW("黄色",0); // フィールドの定義 private final String japanese; private final int level; // コンストラクタの定義 private Color(String japanese,int level) { this.level = level; this.japanese=japanese; } } //列挙子の操作 public static void main(String[] args) { System.out.println(Color.COLOR_PINK); System.out.println(Color.COLOR_PINK.japanese); System.out.println(Color.COLOR_PINK.level); } }出力結果COLOR_PINK 桃色 128メソッドの紹介Enumクラスにはいくつかのメソッドが実装されています。Enum型の配下にメソッドを定義して列挙子を操作できます。ここでは基本的な5つのメソッドを紹介します。String name()Enum定数(列挙子)の名前を取得します。オーバーライドができないのがtoStringメソッドと異なる点です。参照:javadoc-Enumint ordinal()列挙子の順序を取得します。順序は0始め。String toString()Enum定数(列挙子)の名前を取得します。通常はnameメソッドと同じ結果を返しますが、オーバーライドする事で実装者が振る舞いを決めることができます。public static 列挙型 valueOf(String 列挙子名)指定された文字列と一致するEnum型の列挙子を取得します。nullを指定した場合、IllegalArgumentException例外が発生します。public static 列挙型配列 values()対象の列挙型のすべての列挙子を取得します。サンプルコードで確認しましょう。import java.util.Arrays; public class Test { //列挙型(Enum型)の宣言 protected enum Color { COLOR_PINK, COLOR_LIGHT_BLUE, COLOR_INDIGO, COLOR_YELLOW; @Override public String toString() { return ""; } } //列挙子の操作 public static void main(String[] args) { //nameメソッド System.out.println(Color.COLOR_PINK.name()); //ordinalメソッド System.out.println(Color.COLOR_LIGHT_BLUE.ordinal()); //toStringメソッド System.out.println(Color.COLOR_INDIGO.toString()); //valueOfメソッド System.out.println(Color.valueOf("COLOR_YELLOW")); //valuesメソッド Color[] list=Color.values(); System.out.println(Arrays.toString(list)); } }出力結果COLOR_PINK 1 [, , , ]※valueOfメソッドとvaluesメソッドは出力した際に内部でtoStringメソッドを呼んでいます。列挙子を利用した条件分岐の操作Enumクラスにメソッドが実装されているおかげで、列挙子を条件分岐などの操作で使用することが可能になっています。if文の分岐処理列挙子と文字列の比較を条件にして処理を分けます。『Color.COLOR_PINK=="COLOR_PINK"』のようにそのままの値に==演算子を使用するとif文の処理が正しく行えずエラーが発生してしまいますが、メソッドを以下の様に使用することで条件分岐が可能になります。toStringメソッドを使った条件(Stringの比較はequalsメソッドを使いましょう。)※サンプルコードでは可読性を考慮して定数lbに格納しています。Color.COLOR_LIGHT_BLUE.toString().equals("COLOR_LIGHT_BLUE")valueOfメソッドを使った条件Color.COLOR_PINK == Color.valueOf("COLOR_PINK")サンプルコードを確認しましょう。public class Test { //列挙型(Enum型)の宣言 protected enum Color { COLOR_PINK, COLOR_LIGHT_BLUE, COLOR_INDIGO, COLOR_YELLOW; } //列挙子の操作 public static void main(String[] args) { final String lb= Color.COLOR_LIGHT_BLUE.toString(); if (lb.equals("COLOR_LIGHT_BLUE")) { System.out.println("列挙子と文字列の一致"); }else{ System.out.println("列挙子と文字列の不一致"); } if (Color.COLOR_INDIGO == Color.valueOf("COLOR_YELLOW")) { System.out.println("列挙子と文字列の一致"); }else{ System.out.println("列挙子と文字列の不一致"); } } }出力結果列挙子と文字列の一致 列挙子と文字列の不一致switch文の分岐処理Java7以降の環境ではswitch文でString型を指定できるようになりましたが、列挙型の列挙子でもString値と同じようにSwitch文で値を指定することができます。分岐が多くなったときはif文の代わりにswitch-case文を使うと、可読性が高い実装ができます。以下のような記述でcaseに列挙子をセットすることができます。Enum型名は必要ありません。case COLOR_PINK:サンプルコードを確認しましょう。public class Test { //列挙型(Enum型)の宣言 protected enum Color { COLOR_PINK, COLOR_LIGHT_BLUE, COLOR_INDIGO, COLOR_YELLOW; } //列挙子の操作 public static void main(String[] args) { Color c = Color.COLOR_PINK; switch (c) { case COLOR_PINK: case COLOR_YELLOW: System.out.println("暖色"); break; case COLOR_LIGHT_BLUE: case COLOR_INDIGO: System.out.println("寒色"); break; default: System.out.println("無色"); break; } } }出力結果暖色【補足】列挙型と定数(final修飾子を使って宣言された変数)の使い分け列挙型で定義された列挙子はプログラムの中で1つしかない「定数」として扱われます。一方で、final修飾子を使って宣言された変数も定数として扱うことができます。◆列挙型public class Test { //列挙型(Enum型)の宣言 protected enum Color { COLOR_PINK, COLOR_LIGHT_BLUE, COLOR_INDIGO, COLOR_YELLOW; } }◆定数(final修飾子を使って宣言された変数)public class Test { //定数の宣言 public static final int COLOR_PINK = 0x0001; public static final int COLOR_LIGHT_BLUE = 0x0002; public static final int COLOR_INDIGO = 0x0003; public static final int COLOR_YELLOW = 0x0004; }列挙型を拡張して独自の値を持たせるなどしない場合は同じような使い方ができるのでどちらを使う方が良いのかを迷う時があると思います。判断基準の一つとして、両者の特徴の違いを意識して使用選択することをお勧めします。列挙型決められた値以外は取り扱えないため、定数の種類・数が明確である。また複数人が関わるプログラムでは認識の疎通を図れる。⇒定数そのものに意味がある場合の使用を推薦定数取り得る値・種類が豊富であるため、表現できる範囲が広い。⇒値そのものに意味がある場合の使用を推薦これらを上手く利用してプログラムの保守性や可読性の向上につながることを願っています!関連記事リンク:【Java】変数、定数の宣言と変数の列挙型、代入、型変換、型推論の使い方        【Java】final 修飾子について紹介!/【Java】 アクセス修飾子について紹介あとがき私が働いているフォワードソフト株式会社では成長意欲旺盛なエンジニアが多く在籍しております。また東京ITカレッジでは他にも多様なプログラミング情報を掲載しています。まずは一度サイトを覗いてみてください!お待ちしています!

【Java】ラッパークラスについての紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!ラッパークラス(Wrapper class )Javaのデータ操作プログラムでやり取りする情報を値(データ)と呼びます。そのデータを一時的に記憶するために用意されているものが変数です。Javaでは変数の種類や範囲が決められており、この形式を型と呼びます。型は基本データ型(別名:値型/プリミティブ型)とクラス型(別名:参照型/リファレンス型)の二つに大きく分けることができます。※変数についての詳細は以下の記事で紹介しています。参考記事リンク:【Java】変数、定数の宣言と変数の列挙型、代入、型変換、型推論の使い方基本データ型とクラス型基本データ型はJavaに元から定義されています。数値や文字などの値を格納することができます。演算子と組み合わせる場合であれば基本データ型を使えば十分です。ですが、基本データ型のままでは加工処理機能(メソッドなど)を有してないという点があります。一方でクラス型は直接値を格納せずに参照先(値が格納されている場所の情報)を保持しています。インスタンス化することができ、メソッド等オブジェクトを呼び出して変数を操作することができます。この基本データ型のままでは足りないところや不便なところを補ったものが今回紹介するラッパークラスになります。データ型について詳しくは以下の記事で紹介しています。参考記事リンク:【Java】データ型(基本データ型とクラス型)についての紹介!ラッパークラス(Wrapper class )ラッパークラスとは、基本データ型をオブジェクトとして扱えるようにクラスとして定義したものです。int型などの基本データ型に対応するラッパークラスが用意されています。基本データ型の値をオブジェクト内に保持する事ができ、値を加工するための処理(メソッド)も用意されています。ラッパークラスの初期化ラッパークラスはNew演算子を使って以下のように初期化することができます。Boolean b_W = new Boolean(true);//論理型 Integer i_W = new Integer(100);//整数型 Double d_W = new Double(1.00);//浮動小数点型引数にはラッパークラスに対応する基本データ型を指定できるほかに、対応する基本データ型の値を表せるString文字列を指定することができます。Boolean b_W = new Boolean("true");//論理型 Integer i_W = new Integer("100");//整数型 Double d_W = new Double("1.00");//浮動小数点型コンストラクタによる初期化(インスタンス化)は非推奨となっています。ラッパークラスのインスタンス化においては下記で紹介するvalueOf メソッドが推奨されています。また下記で紹介するオートボクシング機能の実装によってJava5.0では値のみをそのまま記述した初期化ができるようになりました。Boolean b_W = true;//論理型 Integer i_W = 100;//整数型 Double d_W = 1.00;//浮動小数点型該当目次では詳しく紹介します。【見出しジャンプ:オートボクシング】基本データ型とラッパークラスの変換Java5.0以降ではラッパークラスの変換において下記で紹介するオートボクシング機能が実装されました。オートボクシングによって実装者は特に意識することなく、基本データ型⇒ラッパークラスへの変換を行うことができるようになっています。基本データ型からラッパークラスオブジェクトへ変換今回はラッパークラスの変換を明示的に記述するとどうなるかを最初にご紹介します。- オブジェクト生成時に代入ラッパークラスオブジェクトを生成したときに対応する基本データ型の値を引数に指定することで、基本データ型⇒ラッパークラスの変換をすることができます。boolean b =true; Boolean b_W = new Boolean(b);//論理型 int i =100; Integer i_W = new Integer(i);//整数型 double d =1.00; Double d_W = new Double(d);//浮動小数点型- valueOfメソッドラッパークラスにはvalueOfメソッドが実装してあり、このメソッドを使用して変換することも可能です。対応する基本データ型の値を引数に指定します。サンプルコードpublic class Test { public static void main(String args[]) { boolean b = true; Boolean b_Wv = Boolean.valueOf(b);//論理型 int i = 100; Integer i_Wv = Integer.valueOf(i);//整数型 double d = 1.00; Double d_Wv = Double.valueOf(d);//浮動小数点型 System.out.println(b_Wv); System.out.println(i_Wv); System.out.println(d_Wv); } }出力結果true 100 1.0◆引数にString文字列を指定またvalueOfメソッドは引数にString文字列を指定することができます。指定された文字列によって表される値を対応する基本データ型の値で返します。基本データ型に扱えない値が入った場合は実行時にエラーが生じます。サンプルコードpublic class Test { public static void main(String args[]) { Boolean b_Wv = Boolean.valueOf("true");//論理型 Integer i_Wv = Integer.valueOf("100");//整数型 Double d_Wv = Double.valueOf("1.00");//浮動小数点型 System.out.println(b_Wv); System.out.println(i_Wv);      System.out.println(d_Wv); } }出力結果true 100 1.0ラッパークラスオブジェクトから基本データ型へ変換ラッパークラスオブジェクトから基本データ型への変換の明示的な記述も紹介します。- ○○Valueメソッドラッパークラスオブジェクトから基本データ型への変換は○○Valueメソッドを使います。○○には基本データ型の名前が入ります。(ex. byteValue/floatValue)サンプルコードpublic class Test { public static void main(String args[]) { Boolean b_W = new Boolean(true);//論理型 boolean b =b_W.booleanValue(); Integer i_W = new Integer(100);//整数型 int i = i_W.intValue(); Double d_W = new Double(1.00);//浮動小数点型 double d =d_W.doubleValue(); System.out.println(b); System.out.println(i); System.out.println(d); } }出力結果true 100 1.0オートボクシングJava5.0からラッパークラスオブジェクトと基本データ型の変換が自動的に行われる機能が実装されました。その機能がオートボクシングです。この機能によって特に意識することなく基本データ型とラッパーオブジェクトを相互に変換することができるようになりました!- Java5.0以降に可能になった初期化基本データ型とラッパークラスオブジェクトが自動変換できるようになったおかげで、より簡単なコードでラッパークラスオブジェクトの生成ができるようになりました。Java5.0以前はvalueOfメソッドを使用したオブジェクト生成が主流でしたが、以下のように値をそのまま代入する記述で簡単にオブジェクト生成ができます。Boolean b_W = true;//論理型 Integer i_W = 100;//整数型 Double d_W = 1.00;//浮動小数点型※以降のサンプルコードはこの初期化を使っています。- ボクシング基本データ型からラッパークラスへの自動変換をボクシング(そのまま「オートボクシング」とも)と言います。変換メソッドを用いることなく、基本データ型の変数やリテラル(データそのもの)をラッパークラスの変数に直接代入する事ができるようになっています。サンプルコードpublic class Test { public static void main(String args[]) { boolean b = true; Boolean b_Wv = b;//論理型 int i = 100; Integer i_Wv = i;//整数型 double d = 1.00; Double d_Wv = d;//浮動小数点型 System.out.println(b_Wv); System.out.println(i_Wv); System.out.println(d_Wv); } }出力結果true 100 1.0- アンボクシングラッパークラスから基本データ型への自動変換をアンボクシングと言います。ボクシングと同様にラッパークラスのオブジェクトを、基本データ型の変数に直接代入する事ができるようになっています。サンプルコードpublic class Test { public static void main(String args[]) { Boolean b_W = true;//論理型 boolean b =b_W; Integer i_W = 100;//整数型 int i = i_W; Double d_W = 1.00;//浮動小数点型 double d =d_W; System.out.println(b); System.out.println(i); System.out.println(d); } }出力結果true 100 1.00◆アンボクシングの例外ラッパークラスオブジェクトにnullが代入されている際、アンボクシングを行うと基本データ型にはnullを代入することができないので例外が発生してしまいます。例外サンプルコードpublic class Test { public static void main(String args[]) { Boolean b_W = null;//論理型 boolean b =b_W; Integer i_W = null;//整数型 int i = i_W; Double d_W = null;//浮動小数点型 double d =d_W; System.out.println(b); System.out.println(i); System.out.println(d); } }出力結果Exception in thread "main" java.lang.NullPointerException【おまけ】文字列・データ型間の変換方法今回紹介したvalueOfメソッドは文字列・データ型間の変換にも使用されます。String型(文字列)とデータ型の変換はメソッドの引数やデータ比較、データベースへの登録などにおいて、お互いの整合性を合わせる場合などに必要となります。以下のようなメソッドがあります。 valueOfメソッド :文字列からデータ型、データ型から文字列の両方で使うことができます。 parse○○メソッド:文字列からデータ型へ変換する際に使います。○○にはデータ型の名前が入ります。 toStringメソッド  :データ型から文字列へ変換する際に使います。詳しくは以下の記事で紹介してるので是非参考にしましょう!参考記事リンク:【Java】 文字列・データ型間の変換方法ラッパークラスオブジェクトの比較ラッパークラスオブジェクトの比較は、Stingクラスの比較と同じように記述の仕方を注意しなければなりません。クラス型は値そのものではなく参照先(値が格納されている場所の情報)を保持しています。プログラム内部の処理で異なる場所に格納されることがあるので値は同じでも==演算子を使用した場合、結果が異なってしまうことがあります。ラッパークラスオブジェクトが生成(インスタンス化)されるたびに新しい参照先が生成されるため、同じ値を持った同じ型のオブジェクトでも参照先が異なっていれば==演算子では等しいと判断されません。そこで、ラッパークラスでの値の比較にはequalsメソッドを使いましょう!equalsメソッドでは、オブジェクトが保持している値を比較しますので、参照先(値が格納されている場所の情報)が異なっていても、保持している値が同一であればtrueを返します。サンプルコードpublic class Test { public static void main(String args[]) { Boolean b_W = true;//論理型 Boolean b_W1 = true; Integer i_W = 100;//整数型 Integer i_W1 = 128; Double d_W = 1.00;//浮動小数点型 Double d_W1 = 1.28; System.out.println(b_W.equals(b_W1)); System.out.println(i_W.equals(i_W1)); System.out.println(d_W.equals(d_W1)); } }出力結果true false false同じ参照型のデータであるStringオブジェクトの比較に関しては以下の記事で紹介しているので参考にどうぞ!参考記事リンク:【Java】Stringクラスの文字列比較・判定・検索あとがき私が働いているフォワードソフト株式会社では成長意欲旺盛なエンジニアが多く在籍しております。また東京ITカレッジでは他にも多様なプログラミング情報を掲載しています。まずは一度サイトを覗いてみてください!お待ちしています!

【Java】データ型(プリミティブ型と参照型)についての紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!プリミティブ型と参照型プログラム開発では型を持った変数を使ってデータのやり取りをしますが、データ型によって仕様が異なるので注意が必要です!今回はデータ型の違いについてしっかりと説明していこうと思います!データ型を理解するうえで大切な『変数・オブジェクト指向』が理解できていない方は、この記事の最後『【学習前の事前知識】値の取り扱い』で確認できます。リンクになっていますので飛びましょう!プリミティブ型プリミティブ型は数値や文字などの値をそのまま格納することが可能なデータ型です。このプリミティブ型にはいつくかの種類があり、それぞれ格納できるデータと範囲が決まっているので確認しましょう。- プリミティブ型変数の宣言(初期化)と操作プリミティブ型にはそのまま値を代入することができ、演算子( = + - * / ? 等 )と組み合わせて操作することが可能です。◆サンプルコードpublic class Test { public static void main(String args[]) { //booleanの宣言(初期化)と操作 boolean b = true; if(b==true) { System.out.println("等しい"); }else { System.out.println("等しくない"); } //intの宣言(初期化)と操作 int i = 100; int j = 50; int k = i+j; System.out.println(k); //doubleの宣言(初期化)と操作 double d = 1.00; double e = 0.5; double f = d+e; System.out.println(f); } }◆出力結果等しい 150 1.5演算子と組み合わせる操作であればプリミティブ型で十分です。しかしながら、そのままではインスタンス化できないので、メンバ変数(フィールド)の参照や加工処理機能(メソッド)を実行することができません。そこを補うために実装された『ラッパークラス』というものが用意されています。詳しい説明は、【Java】ラッパークラスについての紹介!の記事で紹介しています。参照型参照型変数は値そのものを保持しているのではなく格納場所(アドレス)をデータとして持っています。値のアドレスを参照して値を取得します。参照型は「クラス型」とも呼ばれています。また、参照先のアドレスのことを「ポインタ」と呼びます。Javaで参照型変数を宣言して初期化するには代入するためのインスタンス(オブジェクト)を用意する必要があります。- 参照型の宣言(初期化)と操作インスタンス生成にはnew演算子を使用するのが基本的なやり方です。(参照:例外『特殊な参照型』)参照型 変数 = new クラス名(); 参照型 変数 = new クラス名(引数);ex)Tokyo t = new Tokyo(); Tokyo t = new Tokyo("TOKYO");クラスオブジェクトについては以下の記事から確認できます。参考記事リンク:【Java】 クラスの基本を紹介!- 特殊な参照型(クラス型[String型、ラッパークラス]、配列型)上記の説明では、参照型変数にnew演算子を使用して生成したインスタンスを代入する方法を説明しましたが、それ以外にもインスタンスを生成して参照型変数に代入できるものがいくつかあります。例えば、String型ではnew演算子を使わずに文字列(文字列リテラル)を直接代入することができたり、独自の記述によって初期化ができる参照型変数がいつくか存在します。これは追加機能の実装により便宜的な機能が追加されたなど理由は様々です。new演算子以外にも参照型変数に代入するインスタンスの生成方法がいくつかありますので確認していきましょう。String型String 変数名 = "文字列";ex.) String s = "HelloWorld";""(ダブルクォーテーション)で囲われた文字列を「文字列リテラル」と呼びます。Stringオブジェクトはこの文字列リテラルを書くだけで作成することができるのです!ソースの中で、"文字列"を書くだけでString型のオブジェクトがメモリ上に自動的に作られる様、機能が施されています。ラッパークラスプリミティブ型に対応するラッパークラスを用いた変数は参照型の変数になります。new演算子を使ったインスタンス化をすることはできますが、推奨されていません。Java5.0からプリミティブ型とラッパークラス型の自動変換機能『オートボクシング』が実装され、値をそのまま代入して初期化する記述ができるようになっています。ラッパークラス型名 変数名 = 値;ex.) Boolean b =true; Integer i =123; Double d =1.00;ラッパークラスの詳細は以下の記事で紹介しています!参考記事リンク:【Java】ラッパークラスについての紹介!配列型配列型変数も参照型変数です。new演算子を使ったインスタンス生成をすることもできますが、初期化の記述がいくつかあります。◆要素の個数を指定する初期化要素の型名 配列変数名 = new 要素の型名[要素の個数];ex.)boolean[] b=new boolean[2]; int[] i = new int[3]; double[] d =new double[5];◆配列を指定する初期化要素の型名[] 配列変数名 = new 要素の型名[]{要素1,要素2,要素3,要素4.....};ex.)boolean[] b=new boolean[] {true,false}; int[] i =new int[] {1,12,123}; double[] d =new double[] {1,1.0,1.00,1.000,1.0000}; ※『new 要素の型名』は省略可能 boolean[] b_e={true,false}; int[] i_e ={1,12,123}; double[] d_e ={1,1.0,1.00,1.000,1.0000};- 参照型の比較参照型の比較を行う場合は、equalsメソッドを使います。値そのものではなく格納場所(アドレス)をデータとして持っているので、==演算子を使用すると正しい比較ができません。そのため参照型ではクラスの中に比較用のメソッドが実装されています。Stringクラスのequalsメソッドは以下の記事で紹介しています。参考記事リンク:【Java】Stringクラスの文字列比較・判定・検索データ渡しの違いプリミティブ型変数と参照型変数では、データ保持の仕様が異なるので値を渡すときには注意が必要です。変数での取り扱いプリミティブ型の変数の場合は、値を変数間でやり取りする際に持っている値をコピーして渡します。よって元の変数に格納されている値は、渡した先で変更を加えても影響はでません。⇒これを『値渡し』と呼んでいます!参照型の変数の場合は、値をそのまま保持しているのではなく、メモリ上のポインタ(アドレス)の情報を持っています。値をやり取りする際にそのポインタ(アドレス)の情報を渡すので、渡した先で値の変更が為された場合は、元の値も同じように変更されます。⇒これは『参照渡し』と呼ばれています!この違いを以下で確認しましょう。◆サンプルコードpublic class Test { public static void main(String[] args) { //値渡しの例 int i = 123; int i1 = i; //値の変更 i1 = 0; System.out.println("【プリミティブ型】"); System.out.println("元の値:"+i); System.out.println("渡した先の値"+i1); //参照渡しの例 int[] il = { 1, 12, 123 }; int[] il_1 = il; //値の変更 il_1[2] = 0; System.out.println("【参照型】"); System.out.println("元の値:"+il[2]); System.out.println("渡した先の値"+il_1[2]); } }◆出力結果【プリミティブ型】 元の値:123 渡した先の値0 【参照型】 元の値:0 渡した先の値0引数での取り扱いメソッドの引数として値を渡す場合も、プリミティブ型では『値渡し』、参照型では『参照渡し』とデータ型によって違いがあります。具体的な例は『【Java】 メソッドについて紹介!~メソッド引数(値渡し・参照渡し)~』で紹介しています!確認しましょう!!【学習前の事前知識】値の取り扱いJavaのデータ型を理解するうえで、値の取り扱い方や、変数についての知識が必要になります。また、オブジェクト指向の知識も必要な要素になります。この見出しで説明していますので、学習前の方は確認してみてください。① 値(データ)プログラムでやり取りする情報を値(データ)と呼びます。そのデータを一時的に記憶するために用意されているものが変数です。Javaでは変数の種類や範囲が決められており、データ型という形式で記述します。変数の宣言Javaで変数を使用するには変数の宣言を行う必要があります。宣言することで一時的にデータを記憶する領域が用意されます。型名と変数名を合わせて一つの変数を表します。型名 変数名;ex.)int i String s変数名は命名規則がありますので注意しましょう。命名規約を遵守し、わかりやすく命名することでプログラムの可読性につながります。データ型変数はデータ型によって種類や範囲が決められています。データ型は二つに大きく分けると、プリミティブ型(別名:値型/基本データ型)と参照型(別名:クラス型/リファレンス型)があります。② オブジェクト指向プログラミングデータ型の詳しい説明に入る前にオブジェクト指向について紹介しましょう。オブジェクト指向プログラミングはJavaのデータ型を理解するうえで必要な要素です。オブジェクト指向とはオブジェクト指向というのは、プログラムを開発するときに用いる考え方の一つであり、物や事柄すべてをオブジェクト(部品)として捉えることによって効率的なプログラム開発の実現を目的として生まれたものです。Javaはオブジェクト指向の考え方に沿ってプログラムを作りやすいように配慮がなされています。(これを『オブジェクト指向言語』と呼びます。)Javaには開発者がより便利に、より効率的に作業ができる様、継承 インターフェース インスタンス カプセル化ポリモーフィズムなどの基本概念を持っていて、プログラムの柔軟性や保守性、再利用性の向上に繋がっています!その中のインスタンスについて少し紹介をします。インスタンスオブジェクト指向プログラミングにおいて、クラスの定義に基づきメモリ上に実体化されたオブジェクトをインスタンスと言います。わかりやすく言えば「クラスというオブジェクトを複製したもの(部品)」です。Javaのようなオブジェクト指向言語のプログラミングではクラスのインスタンス化(オブジェクト生成)によって、そのクラス内のフィールド(メンバ変数)の参照やメソッド(加工処理)を実行することができます。またクラスからインスタンスを生成することを「インスタンス化」(instantiation)と言います。Tokyoクラスのインスタンス化をして、Testクラスでメンバ変数の参照やメソッドの実行をしてみましょう。◆サンプルコードclass Tokyo { int population = 14000000; String name() { return "東京都"; } } public class Test { public static void main(String[] args) { Tokyo t = new Tokyo(); //インスタンス化 System.out.println(t.population); System.out.println(t.name()); } }◆出力結果14000000 東京都サンプルコードのようにクラスのインスタンスを生成することによって、そのクラスのメンバ変数やメソッドを操作することができるので、オブジェクト指向に沿ったインスタンス生成は非常に便利です。参照型の変数は、インスタンス(クラスオブジェクト)を代入する事ができる変数で、この変数を使ってメンバ変数(フィールド)を参照したり加工処理(メソッド)を実行することが可能になります。また、メソッド呼び出し時の引数に指定する事や、戻り値を代入する事ができます。一方でプリミティブ型の変数は数値などの値をそのまま保持するための変数です。メソッドの引数に使う事や戻り値の格納もできますが、参照型の変数とは少し扱いが異なるので注意しましょう。オブジェクト指向・インスタンスをについてしっかりと理解することは、プリミティブ型/参照型の違いを知る上で非常に大切なのです!『値の取り扱い』で扱った内容の参考記事は以下です。参考記事リンク:【Java】 命名規約                【Java】変数、定数の宣言と変数の列挙型、代入、型変換、型推論の使い方                      【Java】インスタンスについて紹介あとがき私が働いているフォワードソフト株式会社では成長意欲旺盛なエンジニアが多く在籍しております。また東京ITカレッジでは他にも多様なプログラミング情報を掲載しています。まずは一度サイトを覗いてみてください!お待ちしています!

【Java】インスタンスのコピーの紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!インスタンスのコピーJavaでインスタンスをコピーするにはディープコピー(深いコピー)シャローコピー(浅いコピー)の二つの方法を検討する必要があります。配列のコピーについては【Java】配列のコピーで紹介しています。- シャローコピーシャローコピーは、実体のコピーを行わずにインスタンスをコピーする方法です。コピーしたインスタンス自体は、元のインスタンスとは別の扱いであるものの、参照先は同じになります。ですのでインスタンスのメンバ変数を変更した場合は、もう一方のインスタンスにも影響が及びます。- 方法「=演算子」を使ってインスタンスを代入する事で、シャローコピーを行う事ができます。シャローコピーを下記のサンプルコードで確認しましょう。サンプルコードimport java.util.ArrayList; //インスタンス用クラス class DuplicateObject { public int value = 0; public String source = "あいさつ"; public ArrayList list = new ArrayList(); //出力メソッドの定義 public void dump(String name) { System.out.println("----[" + name + "]----"); System.out.println("value:" + value); System.out.println("source:" + source); System.out.println("list:" + list.toString()); } } public class Test { public static void main(String[] args) { //インスタンスを生成 DuplicateObject origin = new DuplicateObject(); origin.value = 1; origin.source = "おはよう"; origin.list.add(10); //インスタンスのシャローコピー DuplicateObject copy = origin; copy.value = 2; copy.source = "おやすみ"; copy.list.add(20); //出力メソッド実行 origin.dump("コピー元"); copy.dump("コピー先"); } }出力結果----[コピー元]---- value:2 source:おやすみ list:[10, 20] ----[コピー先]---- value:2 source:おやすみ list:[10, 20]copyのフィールドを変更しただけですが、出力結果ではoriginのフィールドも変更されています。これが同じ実体(データ)を参照しているということです。- ディープコピーディープコピーとは、実体も含めてインスタンスをコピーする方法です。参照先の実体も含めてコピーし新しいインスタンスを生成するので、一方に変更を加えても、もう一方に影響を与えません。- 方法ディープコピーを行うには、cloneメソッドを利用した方法とシリアライズオブジェクトを使った方法の二通りの仕方があります。次の項で確認していきましょう!ディープコピー使用の詳細- cloneメソッドcloneメソッドはオブジェクト(インスタンス)のコピー(クローン)を作るメソッドとしてObjectクラスに実装されています。protected Object clone()Object.cloneの特徴・protected修飾子が付いている・戻り値がObject型である・インスタンスをコピーする際はClonableインターフェイスを実装する必要がある⇒Clonableインターフェイスは、マーカーインターフェイスであり、複製可能ということを表しています。cloneメソッドを使ってディープコピーする場合は、対象のクラスでcloneメソッドが適切に実装されている必要があります。cloneメソッドを使ったディープコピーのサンプルコードを確認しましょう。サンプルコードimport java.util.ArrayList; /* * CloneableObjectクラス:説明用のためsetter/getter を省略 */ class CloneableObject implements Cloneable { public int value = 0; public String source = "あいさつ"; public ArrayList list = new ArrayList(); /* * cloneメソッドの定義 * public修飾子、自分自身の型を返り値とする * Objectクラスのcloneメソッドが、 * CloneNotSupportedExceptionを投げる可能性を考慮する */ public CloneableObject clone() throws CloneNotSupportedException { CloneableObject o = (CloneableObject)super.clone(); /* "super.clone()"の戻り値はObject型なので継承クラスの型に変更 * ⇒(CloneableObject)を付ける! */ return o; } //出力メソッドの定義 public void dump(String name) { System.out.println("----[" + name + "]----"); System.out.println("value:" + value); System.out.println("source:" + source); System.out.println("list:" + list.toString()); } } public class Test { public static void main(String[] args) throws CloneNotSupportedException { //インスタンスを生成 CloneableObject origin = new CloneableObject(); origin.value = 1; origin.source = "おはよう"; origin.list.add(10); //インスタンスのディープコピー CloneableObject copy = origin.clone(); copy.value = 2; copy.source = "おやすみ"; copy.list.add(20); //出力メソッド実行 origin.dump("コピー元"); copy.dump("コピー先"); } }出力結果----[コピー元]---- value:1 source:おはよう list:[10, 20] ----[コピー先]---- value:2 source:おやすみ list:[10, 20]※listだけがシャローコピー- cloneメソッド(参照型変数のディープコピーの注意)前項のcloneメソッドを使用したサンプルコードでの出力結果で、おかしいなと思ったところがあったと思います。◆前項の出力結果----[コピー元]---- value:1 source:おはよう list:[10, 20] ----[コピー先]---- value:2 source:おやすみ list:[10, 20]前項の実装ではArrayList型(参照型)の変数がディープコピーされていません。実はインスタンス元のクラスにcloneメソッドを定義しただけでは、参照型変数はシャローコピーされてしまいます。colonメソッドで参照型変数をディープコピーするには、個別実装が必要になります。※プリミティブ型、イミュータブルオブジェクト(String,Number)は個別実装不要インスタンス元クラスのcloneメソッド内に以下のような個別実装を行い、ディープコピーをします。 - 参照型変数それぞれにcloneメソッドを実装する // cloneメソッドの定義 public CloneableObject clone() throws CloneNotSupportedException { CloneableObject o = (CloneableObject)super.clone(); //個別実装 o.list = (ArrayList)list.clone(); return o; } 上記の個別実装を前項のサンプルコードに含めれば、参照型の変数もディープコピーすることができるようになります。◆個別実装後の出力結果----[コピー元]---- value:1 source:おはよう list:[10] ----[コピー先]---- value:2 source:おやすみ list:[10, 20]- シリアライズオブジェクトを使ったコピーシリアライズの概要については以下の記事で紹介しています。参考:【Java】 シリアライズの紹介!シリアライズ化した後、オブジェクトを再定義することでディープコピーができます。以下のサンプルコードでシリアライズ後に変更を加えたメンバ変数を確認してみましょう。サンプルコードimport java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.ArrayList; class SerializeObject implements Serializable { public int value = 0; public String source = "あいさつ"; public ArrayList list = new ArrayList(); //出力メソッドの定義 public void dump(String name) { System.out.println("----[" + name + "]----"); System.out.println("value:" + value); System.out.println("source:" + source); System.out.println("list:" + list.toString()); } } public class Test { public static void main(String[] args) throws Exception { // シリアライズ対象クラスをインスタンス化 SerializeObject o1 = new SerializeObject(); o1.value = 1; o1.source = "おはよう"; o1.list.add(10); // ObjectOutputStream でシリアライズ ByteArrayOutputStream stream= new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(stream); out.writeObject(o1); //ObjectInputStream でデシリアライズ ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(stream.toByteArray())); //メンバ変数を変更 SerializeObject o2 = (SerializeObject) in.readObject(); o2.value = 2; o2.source = "おやすみ"; o2.list.add(20); //出力メソッド実行 o1.dump("シリアライズ実行前"); o2.dump("シリアライズ実行後"); } }出力結果----[シリアライズ実行前]---- value:1 source:おはよう list:[10] ----[シリアライズ実行後]---- value:2 source:おやすみ list:[10, 20]シリアライズ化することで、ディープコピーをすることが出来ました。あとがき私が働いているフォワードソフト株式会社では成長意欲旺盛なエンジニアが多く在籍しております。また東京ITカレッジでは他にも多様なプログラミング情報を掲載しています。まずは一度サイトを覗いてみてください!お待ちしています!

【Java】"サロゲートペア"を包含する文字列の操作

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!サロゲートペアに関しての理解操作の紹介の前にサロゲートペアについて概要を学びましょう。Unicode世界中の文字に通し番号を割り当て同じコード体系のもとに文字の処理をコンピュータ上で使用可能にするために考案されたものが、『Unicode』という国際的な業界規格です。Unix、Windows、macOS、Javaなど多くのシステムで利用され、世界で使われる全ての文字を共通の文字集合で利用することを可能にしてくれています。標準規格があるからこそ、私たちは様々なコンピュータシステムで多くの文字を同じように処理することができるようになっています。Unicodeにはコンピュータで文字を処理するために様々なことが規定されています。以下で紹介する「コードポイント」、「UTF-16」、「サロゲートペア」もUnicodeで規定されているものです。確認していきましょう!コードポイント文字を互いに区別するために、数値(0x0000から0x10FFFFまでの数値)が割り振られています。この数値をコードポイントと言います。例えば、'あ'のコードポイントは’0x3042’という数値が割り振られています。コートポイントによって世界中の文字を同じコード体系のもとで扱うことができるようになります。UTF-16”コードポイント”を”Javaの内部処理(CPU)で使用できる2進数で表現する符号化方式です。一文字を2バイト(16ビット)のコードで表しています。Javaプログラムのchar値や文字列(String)の内部処理ではUTF-16を使っており、これによってJavaプログラムが文字を理解し処理することができます。一つの文字を 16 ビット(2 バイト)のコードで表すと65,536 個(2の16乗個)の文字を表現できるので、当初は世界中の文字を網羅できると考えられていました。しかし世界中の文字は想像以上に多かったため、16 ビットのコードを 2 つ使って新しい 1 つの文字を定義するという手法が導入されることになります。それが今回紹介するサロゲートペアです。サロゲートペアUTF-16方式で16ビットには収まりきらなかった文字を表現するための拡張機能を総称して”サロゲートペア”と呼ばれています。通常2バイト一文字で表すところを、4バイト一文字で表現することで扱える文字数を増やすように考案されました。サロゲートペアの導入により多くの文字を表せるようになった反面、一文字を、2バイトで表せる文字と4バイトで表せる文字に分かれることになります。↓この拡張によってサロゲートペアを包含する文字列の文字数表示の操作に注意が必要になりました。サロゲートペアを包含する文字列の文字数String クラスlengthメソッドは2 バイトで 1 文字として計算するので文字列の中にサロゲートペアを含む場合、正しい結果を返せません。そのような場合はcodePointCountメソッドを使う必要があります。codePointCountメソッドint codePointCount(int beginIndex, int endIndex)第一引数に開始位置インデックス()、第二引数に終了インデックス()を取ります。Unicodeのコードポイントの数を結果として返します。よってサロゲートペアでも対応することができるのです。lengthメソッドと比較して、codePointCountメソッドの実装例を見てみましょう。※Works ブログの都合上、文字化けで 『????』が 表示されていますが、『叱』の環境依存文字です。public class Test { public static void main(String[] args) { String s ="????"; System.out.println("lengthtメソッド:"+s.length()); System.out.println("codePointCountメソッド:"+s.codePointCount(0,s.length())); } }出力結果lengthtメソッド:2 codePointCountメソッド:1結果で出力された二つのint値が異なることが確認できると思います。このようにサロゲートペアが包含された文字列ではlengthメソッドが正しく動作しません。なぜならlengthメソッドは2バイトを1文字と判断するからです。サロゲートペアを含む文字列の文字数を取得する場合は、Unicodeコード・ポイントの数を結果として返すcodePointCountメソッドが正しい文字数を出力してくれます。サロゲートペアが含まれていない通常の文字列の場合、どちらのメソッドでも同じ結果を出しますが、lengthメソッドの方が速い処理を行います!public class Test { public static void main(String[] args) { String s ="Hello World!"; System.out.println("lengthtメソッド:"+s.length()); System.out.println("codePointCountメソッド:"+s.codePointCount(0,s.length())); } }出力結果lengthtメソッド:12 codePointCountメソッド:12 あとがき私が働いているフォワードソフト株式会社では成長意欲旺盛なエンジニアが多く在籍しております。また東京ITカレッジでは他にも多様なプログラミング情報を掲載しています。まずは一度サイトを覗いてみてください!お待ちしています!

【Java】文字列・正規表現

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!『正規表現』へ足を踏み入れよう正規表現(Regular expression)特定の要素を持つ複数の文字列や数値を一つのパターンで表す記述法を正規表現といいます。引数に正規表現のパターンを指定することによって、パターンの要素を持つ文字列をまとめて操作するといった処理を行うことができるようになります。正規表現を使うことによって、文字列検索や文字列操作の作業効率が非常に向上します。正規表現の情報量は膨大で全てを完璧に習得するにはかなりの時間かかりますが、Javaに限らず他のプログラミング言語でも同じように使うことができるためしっかりと身につければ大いに役立つことは間違いありません。先ず正規表現の仕様についてしっかりと理解をすることが重要になってきます。パターンの仕様正規表現によるパターンは通常の文字とメタ文字(特殊文字)という特殊な記号を組み合わせて記述します。メタ文字とは、 .  +  *  ^  $  などの記号です。以下の5つのパターンはすべて正規表現の例です、正規表現パターンのイメージを掴みましょう。a...o     ^abc     xyz$     ^123\d     \d{5}     等 例えば「.(ピリオド)」は正規表現において”任意の一文字”を表しています。ですので a...o は最初がa最後がoで終わり間に3つの任意の文字が続く5つの文字を表しています。aiueo    axyzo    a123o    aいうえo    などがこのパターンにマッチするということになります。以下の表が基本的な正規表現で使用する記号です。これらを組み合わせて、様々なパターンを表すことができます。これらの記号を組み合わせて、よく表される正規表現の表記の例を以下の図で確認しましょう!正規表現のパターンにおいて、意義のあるメタ文字 .  *  +  ()  ^  $  は記号そのままの表記では表すことができません。表記したい場合はエスケープシークエンスのように、先頭にバックスラッシュ(『/』の左右反対記号)、または『\』マークをつけることで、そのままの記号を使うことができるようになります。覚えておきましょう!参考:【Java】Stringクラスformatメソッドの文字列整形とエスケープシーケンスPatternクラスとMatcherクラスJavaの正規表現は、java.util.regex.Patternクラスで定義されています。javaで使用可能な正規表現が、javadoc-Patternクラスに載っているので是非確認してください。またこのクラスには正規表現を格納したオブジェクト(Patternオブジェクト&Macherオブジェクト)を生成するメソッドが実装されています。参考リンク:javadoc-Pattern 正規表現のパターンを解釈し、文字列とのマッチング操作を行うメソッドがMatcherクラスに実装されています。参考リンク:Javadoc-Matcherここではこの二つのクラスを利用した正規表現の使い方について紹介していきます。正規表現のオブジェクト生成Patternクラスに実装されているメソッドを利用して正規表現のオブジェクトを生成していきます。- Patternオブジェクト生成/complieメソッドPatternクラスのcomplieメソッドは、正規表現をパターンオブジェクトに格納します。引数に正規表現を指定します。Pattern compile(String regex)- Macherオブジェクト生成/matcherメソッドPatternクラスのmacherメソッドでMatcherオブジェクトを生成することができます。引数にパターンとマッチさせる文字列を指定して文字列と正規表現のパターンを格納したオブジェクトが生成されます。このMacherオブジェクトは、Macherクラスのメソッドを使ってマッチング操作を行うことができます。Matcher matcher(文字列)- 上記のサンプルコード上記の二つのメソッドを使用して、Macherオブジェクトを生成するまで流れを実際のコードで確認しましょう。サンプルコードimport java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { public static void main(String[] args) { String s = "東京都千代田区"; String s1 = "東京都台東区"; String t = "自然保護区"; //正規表現 String regex="東京都.{1,3}区"; //Patternオブジェクトに正規表現をコンパイル Pattern p = Pattern.compile(regex); //Matcherオブジェクトを生成 Matcher m = p.matcher(s); Matcher m1 = p.matcher(s1); Matcher m2 = p.matcher(t); } }文字列と正規表現パターンが格納(コンパイル)されたMacherオブジェクトの生成までを行うことが出来ました。(サンプルコードでは、Macherオブジェクトm,m1,m2の3つが生成!)このオブジェクトを次の項で実際に使っていきます!!マッチング操作前項で生成したMatcherオブジェクトにMacherクラスのメソッドを使用して、文字列と正規表現パターンのマッチング操作をすることができます。- 文字列とパターンのマッチングを確認する操作Macherクラスには三種類のマッチング確認用メソッドが実装されています。matchesメソッド 文字列がパターンにすべてマッチする場合にtrueを返す。boolean matches()lookingAtメソッド 文字列の先頭部分(接頭辞)がパターンとマッチする場合にtrueを返す。boolean lookingAt()findメソッド 文字列の中にマッチするパターンがある場合にtrueを返す。boolean find()findメソッドには、前回のマッチ成功時の終了インデックスから走査するという仕様があります。最初からマッチング操作をし直す時にはresetメソッドを使用しましょう。Matcher reset()サンプルコードで使い方を確認します。◆サンプルコードimport java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { public static void main(String[] args) { String s = "東京都千代田区"; String s1 = "東京都台東区上野"; String t = "自然保護区"; //正規表現 String regex = "東京都.{1,3}区"; //Patternオブジェクトに正規表現をコンパイル Pattern p = Pattern.compile(regex); //Matcherオブジェクトを生成 Matcher m = p.matcher(s); Matcher m1 = p.matcher(s1); Matcher m2 = p.matcher(t); //Matcherクラスのmatchesメソッド System.out.println("----matches----"); System.out.println(m.matches()); System.out.println(m1.matches()); System.out.println(m2.matches()); //MatcherクラスのlookingAtメソッド System.out.println("----lookingAt----"); System.out.println(m.lookingAt()); System.out.println(m1.lookingAt()); System.out.println(m2.lookingAt()); //リセット(findメソッドを正常に使うため) m.reset(); m1.reset(); m2.reset(); //Matcherクラスのfindメソッド System.out.println("----find----"); System.out.println(m.find()); System.out.println(m1.find()); System.out.println(m2.find()); } }◆出力結果----matches---- true false false ----lookingAt---- true true false ----find---- true true false - マッチした詳細情報を調べる操作文字列がパターンとマッチしているかどうか調べた後に、マッチした文字列の詳細情報を得たい場合は以下のメソッドが使えます。ここでは三種類紹介します。startメソッド パターンとマッチした文字列の開始インデックス(begin index)を戻り値として返す。int start()endメソッド パターンとマッチした文字列の末尾インデックス(end index)を戻り値として返す。int end()groupメソッド パターンにマッチした文字列を返す。String group()サンプルコードで確認しましょう。ここではfindメソッドを実行後に詳細情報を取得します!import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { public static void main(String[] args) { String s = "東京都千代田区"; String s1 = "東京都台東区上野"; //正規表現 String regex = "東京都.{1,3}区"; //Patternオブジェクトに正規表現をコンパイル Pattern p = Pattern.compile(regex); //Matcherオブジェクトを生成 Matcher m = p.matcher(s); Matcher m1 = p.matcher(s1); System.out.println("----findメソッド----"); System.out.println("m:"+m.find()); System.out.println("m1:"+m1.find()); System.out.println("----startメソッドとendメソッド----"); System.out.println("m:begin["+m.start()+"]end["+m.end()+"]"); System.out.println("m1:begin["+m1.start()+"]end["+m1.end()+"]"); System.out.println("----groupメソッド----"); System.out.println("m:"+m.group()); System.out.println("m1:"+m1.group()); } }出力結果----findメソッド---- m:true m1:true ----startメソッドとendメソッド---- m:begin[0]end[7] m1:begin[0]end[6] ----groupメソッド---- m:東京都千代田区 m1:東京都台東区- マッチする文字列の複数取得(while文の使用)検索対象の文字列内にマッチするパターンが二つ以上存在する場合に、繰り返し文(while文)でfindメソッドを使用することにより、文字列内のマッチする文字列をすべて検索することができます。マッチする文字列が複数入った文字列を使って、while文の中でfindメソッドを使ったサンプルコードを確認しましょう。サンプルコードimport java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { public static void main(String[] args) { //マッチする文字列が複数入った文字列の用意 String u = "東京都千代田区,東京都台東区,東京都港区"; //Matcherオブジェクトを生成まで String regex = "東京都.{1,3}区"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher(u); //繰り返し文 while(m.find()){ System.out.println(m.group()); } } }出力結果東京都千代田区 東京都台東区 東京都港区正規表現が使えるStringクラスメソッドStringクラスの文字列を操作するメソッドの中には引数に正規表現のパターンを指定できるものがあります。以下のような操作が例に挙げられます。比較(matches)分割(split)置換(replaceAll,replaceFirst)メソッドの詳細な使い方については以下の記事で紹介しています。【Java】Stringクラスについての理解と基本的な文字列操作【Java】Stringクラスの文字列比較・判定・検索ここでは置換(replaceAll)操作のサンプルコードを確認してみましょう。- replaceAllメソッドのサンプルコードString replaceAll(文字列or正規表現, 置換する文字列)サンプルコードpublic class Test { public static void main(String[] args) { String format = "東京都千代田区"; String change = "台東区"; String str =format.replaceAll(".{1,3}区", change); System.out.println(str); } } 出力結果東京都台東区第一引数で指定した正規表現のパターンとマッチした変数format文字列内の部分文字が、第二引数で指定した文字列に置き換わっています。   ・・・・     ・・・東京都千代田区 ⇒東京都台東区これが正規表現を使った置換です。他のString操作もリンク記事を参考に実際にコードを書いて動かすと面白いと思います!あとがき私が働いているフォワードソフト株式会社では成長意欲旺盛なエンジニアが多く在籍しております。また東京ITカレッジでは他にも多様なプログラミング情報を掲載しています。まずは一度サイトを覗いてみてください!お待ちしています!