投稿

11月, 2022の投稿を表示しています

[資格] Oracle Certified Java Programmer, Bronze, Silver, Goldを取得した話

イメージ
Oracle認定JavaプログラマのBronze、Silver、Goldをすべて取得してきました。 Oracle認定Javaプログラマについて 概要 Oracle認定Javaプログラマは、日本Oracle社が主催するJavaプログラマ向けのベンダー資格です。 Javaのバージョンアップに合わせて試験の内容もバージョンアップされており、2022年12月現在はJava SE 8とJava SE 11が配信されています。今から取得を考えている人は、特に理由がない限りJava SE 11の取得を目指したほうが良いでしょう。 試験のグレードとしてはBronze(初級)、Silver(中級)、Gold(上級)の3段階あります。3段階ですがそれぞれで範囲が違ってくるので、試験に合わせた準備が必要です。 Bronze SE 概要 この試験はいわゆる入門向けの資格で、プログラミング言語(Java)を初めて学ぶ人を対象とした資格です。変数や制御構文の基礎、クラスやオブジェクト指向の基礎について出題されます。 なお以前はJava SE 7/8 Bronzeが配信されていましたが、現在はバージョンに依存しない構成でリニューアルされています。 試験情報 1. Bronze SE試験情報 資格名 Oracle Certified Java Programmer, Bronze SE 試験番号 1Z0-818(-JPN) 問題数 60 試験時間 65分 合格ライン 60% 受験料(税込み) ¥12,540 前提条件 無し、誰でも受験・認定可能 参考書 所感 実はこの試験が一番危なかったです。理由は試験時間に対して問題数がやや多く、1問1分程度で解かなくてはならないためじっくりと考えていると時間が足りなくなります。 問題としてはプログラムのロジックを理解する問題が多いですが、テンポよく解いていく必要があります。とにかくスピード重視です。 参考書に挙げた問題集を使って慣れておくとよいです。 Silver SE 11

[Java] JDBCのAPIでデータ検索・更新

イメージ
JDBCのAPIを使用してDB操作をする方法について、いくつかまとめていきます。 JDBCを介してSQLを発行する場合、Statementインターフェースを使用します。Statementインターフェースには以下の種類があります。 1. Statementの種類 Statement パラメータなしのSQL文を実行する。コンパイルせずに文字列のままSQL文を発行するので、DBMSがSQL文を解析する。 PreparedStatement Statementインターフェースのサブインターフェースで、パラメータ付きのSQL文を実行することが出来る。SQL文はDBMSが理解できるようにあらかじめコンパイルして発行する。 CallableStatement Statementインターフェースのサブインターフェースで、ストアドプロシージャを実行することが出来る。 なお、この記事で使用するテーブルとして、以下のようなデータを用意しています。 テーブル名はarticles、idを主キーにtitle、bodyといったフィールドを保持したテーブルです。 Statementを利用してSQLを実行 Statementインスタンスを取得 Connectionオブジェクトから生成 Statementインターフェースのインスタンスは、ConnectionクラスのcreateStatementメソッドで生成します。 Connection conn = DriverManager.getConnection(url, user, password); Statement statement = conn.createStatement(); Statementインスタンスの主なメソッド Statementインターフェースの主なメソッドは以下の通りです。なお、これらのメソッドはサブインターフェースである、PreparedStatement、CallableStatementにもそれぞれ引き継がれます。 2. Statementインスタンスの主なメソッド ResultSet executeQuery(String) 引数で指定されたデータ検

[Java] JDBCドライバでMySQL接続するまでの手順

イメージ
JavaでJDBCドライバを利用して、データベース接続をするまでの手順です。ここではJDBCドライバのインストール、jarファイルのセットアップまでの手順をまとめます。 なお、今回使用するデータベースはMySQLを使用しますが、1からサーバーを立てるのは大変なので、以前Laravel環境を構築したときに使用したdocker上のMySQLを使用します。これについては以下の記事を参照してください。 https://www.s-watanabe.work/2020/12/laravel-mysqldocker.html 1. 環境情報 OS Windows10 データベース MySQL JDBCドライバ Connector/J 8.0.31 IDE IntelliJ JDBCドライバのセットアップ インストーラのダウンロード 以下のMySQL公式サイトのダウンロードページからConnector/Jという、JDBCドライバをダウンロードします。なお、現在単体でのダウンロードは見つからなく、MySQL Installerに含まれているようなので、MySQL Installerをダウンロードします。 https://dev.mysql.com/downloads/connector/j/ インストーラを実行 ダウンロードしたインストーラを実行し、Setup TypeにCustomを選択してNextをクリックします。 インストールするプロダクトを選択 インストールするプロダクトは最小構成にしたいので、Connector/Jのみを選択します。 ダウンロード対象のプロダクトを確認 Connector/Jが入っていればOKです。Executeをクリックするとダウンロードとインストールが開始されます。 セットアップ完了 Show Detailをクリックすると、セットアップのログが確認できます。ここにライブラリがインストールされたディレクトリが確認できるので控えておきます。 Next → Finishをクリックし、MySQL JDBCドライバのセットアップは完了です。 ライブラリ設定 次にインス

[Java] シリアライズとデシリアライズ

入出力ストリームを利用してインスタンスをファイルに書き出すことをシリアライズ、ファイルから読み込むことをデシリアライズと言います。 Serializableインターフェース Serializableインターフェースはシリアライズ、デシリアライズさせたいクラスに実装させるインターフェースです。 このインターフェースは、マーカーインターフェースといい、シリアライズするクラスであるということをJVMへ示すためだけのものです。メソッドは何も持っていません。 コード例 ここではidとnameというフィールドを保持するPersonクラスを定義し、Serializableインターフェースを実装しています。 import java.io.Serializable; public class Person implements Serializable { private int id; private String name; public Person(int id, String name) { this.id = id; this.name = name; } @Override public String toString() { return "id:" + id + ", name:" + name; } } Serializableインターフェースはマーカーインターフェースであり、JVMがシリアライズ可能と判別するためのもの。メソッドは持たない。 シリアライズ ObjectOutputStreamクラス オブジェクトをシリアライズしてファイルに書き出すにはObjectOutputStreamクラスを使用します。 ObjectOutputStreamクラスのインスタンスを取得 ObjectOutputStreamクラスのコンストラクタは、FileOutputStreamクラスのオブジェクトを引数に取ります。 FileOutputStream fstream = new FileOutputStream("output/test.ser"); ObjectOutp

[Java] バイト入出力ストリーム

画像ファイルなどのバイナリーデータの入出力については、バイトストリームを扱うクラスが用意されています。ここでは、バイトストリームの入出力についてまとめていきます。 バイト入出力ストリーム FileInputStreamクラス ファイルからバイトストリームを読み込みます。 1. FileInputStreamクラスの主なメソッド byte read() ファイルから1バイト読み込むで返す。 byte[] readNBytes(int) ファイルから指定バイト数を読み込んで配列を返す。 byte[] readAllBytes() ファイルから全バイトを一度に取り出して配列で返す。大きなサイズのファイルの場合メモリを大量に使用するので、一般的にはreadNBytes(int)を使用する。 FileOutputStreamクラス バイトストリームをファイルへ出力します。 2. FileOutStreamクラスの主なメソッド void write(int) ファイルへ1バイト出力する。 void write(byte[]) ファイルへ複数バイトを出力する。 コードサンプル 以下の例はsample1.pngファイルを1024バイトずつ読み込んで、sample2.pngへコピーする例です。 FileInputStream fileInputStream = new FileInputStream("test/sample1.png"); FileOutputStream fileOutputStream = new FileOutputStream("test/sample2.png"); try ( fileInputStream; fileOutputStream; ) { byte[] data = null; while ((data = fileInputStream.readNBytes(1024)).length > 0) { fileOutputStream.write

[Java] 入出力ストリーム

Javaの入出力ストリームについてまとめていきます。 Fileクラス Fileクラスは、Java1.0の最初期からあるAPIで、ファイルやディレクトリのパスを表すクラスです。 あくまでパスを扱っているだけで、ファイルやディレクトリそのものを扱っているわけではない。 Fileオブジェクトの取得 コード例 File file = new File("output/data.txt"); この時オブジェクトはファイルパスを扱っているだけなので、output/data.txtの存在有無や書き込み権限にかかわらず、インスタンスを生成することが可能です。 Fileオブジェクトの主なメソッド boolean isFile() ファイルの場合にTrueを返す。 boolean isDirectory() ディレクトリの場合にTrueを返す。 long lastModified() ファイルの更新日付をUNIXタイムで返す。 String getAbsolutePath() ファイルの絶対パスを取得する。 String getCanonicalPath() ファイルの相対パスを取得する。 File[] listFiles() ディレクトリ配下のFileオブジェクトの配列を生成する。 File[] listFiles(FileFilter) FileFilter関数型インターフェースを引数に取り、条件に一致したFileオブジェクトの配列を生成する。 サンプル コード例 output配下の拡張子が「.txt」のファイル一覧を取得 ファイル名と最終更新日時を出力する File file = new File("output"); FileFilter filter = pathname -> pathname.getName().endsWith(".txt"); File[] files = file.listFiles(filter); Ar

[Java] ストリームAPI

ListやSetといったコレクションを扱う際に、すべての要素に処理を行う際、for文を使って順に要素を取り出していましたが、このような逐次処理を簡潔に記述できるようにしたStream<T>型がJava8で導入されました。 ここではStream API(以下ストリームAPI)の使い方についてまとめていきます。 ストリームAPIを使用する目的 ストリームAPIを使用する目的としては以下の通りです。 コレクションや配列の全要素に対して同じように変換する。 コレクションや配列の要素の合計や平均といった統計を取る。 コレクションや配列の要素に対して特定の条件でグルーピングやフィルターを行う。 コレクションや配列から特定の条件に合ったデータを検索する。 ストリームAPIは従来のfor文や拡張for文を置き換えるために用意されたAPIではない。 ストリームオブジェクトの取得 Iterableインターフェースから取得 java.lang.Iterableインターフェースのstream()メソッドで取得します。 コード例 List<String> list = new ArrayList<>(); list.add("Apple"); list.add("Melon"); list.add("Orange"); Stream<String> stream = list.stream(); Streamインターフェースから取得 コード例 Streamインターフェースのofメソッドからも可変長引数で取得することが出来ます。 Stream<String> stream = Stream.of("Apple", "Melon", "Orange"); Arraysクラスから生成 コード例 String[] arrays = {"Apple", "Melon", "Orange"}; Stream<String> stream = Arrays.stream(arrays

[Java] 並列処理 (Thread, Runnable)

Javaで並列処理(マルチスレッド)の実装についてのまとめです。 Javaで並列処理を実装するにはいくつか方法がありますが、ここではThreadクラスを継承する方法と、Runnableインターフェイスを実装したクラスを用意して、Threadクラスのインスタンスを生成する方法についてまとめます。 基本的な並列処理の実装 Threadクラスを継承する 実装 import java.lang.Thread; public class ThreadTest { public static void main(String[] args) { Thread t = new Thread() { @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println("sub:" + i); } } }; t.start(); for (int i = 0; i < 5; i++) { System.out.println("main:" + i); } } } 実行結果 実行結果は順不同で出力され、並列に処理されているのが分かります。 java ThreadTest.java main:0 sub:0 main:1 sub:1 main:2 sub:2 main:3 sub:3 main:4 sub:4 Runnableインターフェースを実装する 実装 import java.lang.Runnable; import java.lang.Thread; public class ThreadTest { public static void main(String[] args) { Runnable r = new Runnable() { @Override

[java] Optional<T>について

Optionalクラスは何らかの処理の結果を格納・保持するクラスです。 これまでは取得した値が空ではないか、またはnullではないかなど、取得結果について確認したうえで後続の処理を行っている場合があり、これが冗長・可読性低下の原因でした。 Java8から導入されたOptionalクラスを使うと、こういったケースが簡潔に記述できるようになりました。 ここではインスタンスの生成と、値を使用するにあたって利用する主なメソッドについてまとめておきます。 インスタンスの生成 OptionalのインスタンスはOptionalインターフェースに定義されたファクトリメソッドを使用して生成します。 1. Optionalインスタンスを生成するメソッド empty() 空のOptionalのインスタンスを生成する。 of(T value) nullを許容しない値を持ったOptionalのインスタンスを生成する。 nullを指定するとNullPointerExceptionが発生する。 ofNullable(T value) nullを許容し、nullを指定した場合は空のOptionalインスタンスを生成する。 emptyメソッド コード例 Optional<String> optional = Optional.empty(); System.out.println(optional); 実行結果 Optional.empty ofメソッド コード例 Optional<String> optional = Optional.of("test"); System.out.println(optional); 実行結果 Optional[test] ofメソッドにnullを指定するとNullPointerExceptionが発生する。 ofNullableメソッド コード Optional<String> optional = Optional.ofNullable(null); System.out.println(optional); 実行結果 Optional.e

[Java] Enum(列挙型)についてまとめ

Enum(列挙型)について 概要 Enumは同じカテゴリの定数をまとめて管理するためのもので、クラスのように扱うことができます。 なお、JVM上はクラスとして扱われるため、メソッドやコンストラクタを定義することもできます。 構文 アクセス修飾子 enum 列挙名 { 列挙子, 列挙子, 列挙子... } Enumの基本的な使い方 定義例 public enum Status { DISABLED, APPROVED, ENABLED } Enumを使った分岐処理 Status status = Status.APPROVED; switch (status) { case DISABLED: System.out.println("無効"); break; case APPROVED: System.out.println("承認"); break; case ENABLED: System.out.println("有効"); break; } 配列で列挙子をすべて取得する Status[] statuses = Status.values(); 列挙子を文字列で取得する Status status = Status.valueOf("APPROVED"); 存在しない列挙子を指定すると IllegalArgumentException が発生します。 列挙子に値を持たせる 構文 アクセス修飾子 enum 列挙名 { 列挙子(値), 列挙子(値), 列挙子(値)... private 型 フィールド; private コンストラクタ {} } 定義例 enum Status { DISABLED("無効"), APPROVED("承認"), ENABLED("有効"); private String value; Status(String

[Java] ラムダ式と関数型インターフェース

ラムダ式とは前述の匿名クラスの記述をより簡潔に書くことが出来る記述法で、Java8から導入されました。 また、それに合わせてラムダ式で記述できるいくつかの関数型インターフェースが用意されているので、主要な部分についてまとめていきます。 ラムダ式 構文 インターフェース 変数 = (引数) -> {処理}; 定義例 例えば匿名クラスの説明で利用した次のサンプルコードがあります。 https://www.s-watanabe.work/2022/10/java.html#3 interface Itest { public void doTest(); } public class AnonymousTest { public static void main(String[] args) { Itest itest = new Itest() { @Override public void doTest() { System.out.println("Itest.doTest"); } }; itest.doTest(); } } このコードはラムダ式によって次のように置き換えることが出来ます。 interface Itest { public void doTest(); } public class AnonymousTest { public static void main(String[] args) { Itest itest = () -> { System.out.print("Itest.doTest"); }; itest.doTest(); } } 処理内容が1行の場合、中カッコ{}を省略することができます。 Itest itest = () -> System.out.print("Itest.doTest"); ラムダ式は関数型インター