<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Java &#8211; エンジニア見習い</title>
	<atom:link href="https://otonan-syusyoku.work/archives/category/learning/java/feed" rel="self" type="application/rss+xml" />
	<link>https://otonan-syusyoku.work</link>
	<description>三流プログラマー</description>
	<lastBuildDate>Sun, 06 Feb 2022 07:53:37 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://otonan-syusyoku.work/wp-content/uploads/2023/10/cropped-名称未設定のデザイン-16-32x32.png</url>
	<title>Java &#8211; エンジニア見習い</title>
	<link>https://otonan-syusyoku.work</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>JavaとOracleをつなぐ</title>
		<link>https://otonan-syusyoku.work/archives/1064</link>
					<comments>https://otonan-syusyoku.work/archives/1064#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Sun, 06 Feb 2022 07:53:37 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=1064</guid>

					<description><![CDATA[Contents 事前準備用意するものドライバの仕組み2つの方法があるから注意ね接続手順接続するための構文データを取得する構文事前準備 用意するもの 用意するものは以下の通りです。jarファイルとテストデータです。 今回 [&#8230;]]]></description>
										<content:encoded><![CDATA[<div id="rtoc-mokuji-wrapper" class="rtoc-mokuji-content frame4 preset3 animation-fade rtoc_open noto-sans" data-id="1064" data-theme="BlogArise">
			<div id="rtoc-mokuji-title" class=" rtoc_center">
			<button class="rtoc_open_close rtoc_open"></button>
			<span>Contents</span>
			</div><ol class="rtoc-mokuji decimal_ol level-1"><li class="rtoc-item"><a href="#rtoc-1">事前準備</a><ul class="rtoc-mokuji mokuji_ul level-2"><li class="rtoc-item"><a href="#rtoc-2">用意するもの</a></li><li class="rtoc-item"><a href="#rtoc-3">ドライバの仕組み</a></li></ul></li><li class="rtoc-item"><a href="#rtoc-4">2つの方法があるから注意ね</a></li><li class="rtoc-item"><a href="#rtoc-5">接続手順</a><ul class="rtoc-mokuji mokuji_ul level-2"><li class="rtoc-item"><a href="#rtoc-6">接続するための構文</a></li><li class="rtoc-item"><a href="#rtoc-7">データを取得する構文</a></li></ul></li></ol></div><h2 id="rtoc-1" >事前準備</h2>
<h3 id="rtoc-2" >用意するもの</h3>
<p>用意するものは以下の通りです。jarファイルとテストデータです。</p>
<p>今回はOracleDBに接続するので、jarファイルをOracleサイトからダウンロード後に「WEB-INF/lib」ディレクトリの直下に配置します。</p>
<p>注意してほしいのが<span class="sc_marker blue"><strong>DBのバージョンとJDKのバージョンにあったjarファイル</strong></span>でないと、接続が上手く行かないので注意してください。(僕は1日潰れました。泣)</p>
<p>&nbsp;</p>
<p>テストデータは、下記テーブルのデータとします。</p>
<pre class="line-numbers"><code class="language-other">SQL&gt; desc AAA;
 Name					   Null?    Type
 ----------------------------------------- -------- ----------------------------
 NO						    NUMBER
 NAME						    VARCHAR2(10)



SQL&gt; SELECT * FROM AAA;

	NO NAME
---------- ----------
	 1 aiueo
</code></pre>
<h3 id="rtoc-3" >ドライバの仕組み</h3>
<p>ここで言うドライバとは先程事前に準備すると書いたjarファイルのことを指します。</p>
<p>ドライバを使用することでDBごとの特色を可能な限り考えなくて済むようになり、プログラム(Java)とDBを連携しやすくする事が目的のファイルらしいです。。</p>
<p>あまり、<strong><span class="sc_marker blue">難しく考えすぎるとあれなのでJavaとDBを繋げる時には必要なファイル</span></strong>という事を覚えてもらえば良いです。</p>
<h2 id="rtoc-4" >2つの方法があるから注意ね</h2>
<p>JDBCドライバを使用して接続する方法は「OCI接続」と「Thin接続」があります。</p>
<p>両者にはOracle Clientがインストールされているかの違いがあります。</p>
<p>Thin接続ではOracle Clientがインストールされている必要がなく、現在の主流の接続方法らしいです。</p>
<h2 id="rtoc-5" >接続手順</h2>
<h3 id="rtoc-6" >接続するための構文</h3>
<p>今回はThin接続を行います。</p>
<p>以下が接続するために必要な構文の手順です。</p>
<ol>
<li>JDBCドライバの読み込み</li>
<li>データベース接続</li>
</ol>
<pre class="line-numbers"><code class="language-other">
//①の構文
final String path = "oracle.jdbc.driver.OracleDriver";
Class.forName(path);

//②の構文
final String URL = "jdbc:oracle:thin:usr1/mypassword@//localhost:1521/ORCLPDB1";
Connection con = DriverManager.getConnection(URL);</code></pre>
<h3 id="rtoc-7" >データを取得する構文</h3>
<p>以下がデータを取得する構文です。</p>
<ol>
<li>変数文字列にSQL文を格納</li>
<li>PreparedStatementに変数を格納</li>
<li>ResultSetに実行結果を格納</li>
<li>結果をループ処理で出力</li>
</ol>
<pre class="line-numbers"><code class="language-other">//①
String sql = "SELECT * FROM AAA";

//②
PreparedStatement ps = con.prepareStatement(sql);

//③
ResultSet rs = ps.executeQuery();

//④
while(rs.next()) {
System.out.println(rs.getInt("no"));
System.out.println(rs.getString("name"));
}</code></pre>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/1064/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>mainメソッドのないクラスのテスト方法</title>
		<link>https://otonan-syusyoku.work/archives/887</link>
					<comments>https://otonan-syusyoku.work/archives/887#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Sat, 02 Oct 2021 02:26:26 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=887</guid>

					<description><![CDATA[Contents テストの目的テストの考え方mainメソッドが無いクラスのテスト方法上手なテストJUnitで簡単にテストできるよテストの目的 テストとは開発したコードに不具合がないか確認し、仕様通りの開発を達成しているか [&#8230;]]]></description>
										<content:encoded><![CDATA[<div id="rtoc-mokuji-wrapper" class="rtoc-mokuji-content frame4 preset3 animation-fade rtoc_open noto-sans" data-id="887" data-theme="BlogArise">
			<div id="rtoc-mokuji-title" class=" rtoc_center">
			<button class="rtoc_open_close rtoc_open"></button>
			<span>Contents</span>
			</div><ol class="rtoc-mokuji decimal_ol level-1"><li class="rtoc-item"><a href="#rtoc-1">テストの目的</a></li><li class="rtoc-item"><a href="#rtoc-2">テストの考え方</a></li><li class="rtoc-item"><a href="#rtoc-3">mainメソッドが無いクラスのテスト方法</a><ul class="rtoc-mokuji mokuji_ul level-2"><li class="rtoc-item"><a href="#rtoc-4">上手なテスト</a></li></ul></li><li class="rtoc-item"><a href="#rtoc-5">JUnitで簡単にテストできるよ</a></li></ol></div><h2 id="rtoc-1" >テストの目的</h2>
<p>テストとは<span class="sc_marker blue">開発したコードに不具合がないか確認し、仕様通りの開発を達成しているかを確認する</span>事を指します。</p>
<p>仕様書で定めた目的を達成するためには作ったらおしまいではなく、あらゆるパターンを考え、そのパターンに対応することができているかを証明しなければいけません。</p>
<p>証明することで品質が保証されるとともに仕様書定めた目的も達成することができます。</p>
<p>本来であれば開発した後には単体テストや結合テスト、システムテストという工程がプログラム開発には含まれている事がほとんどなので、テスト仕様書通りにテストを実施しなければいけません。</p>
<p>しかし、今回は<span class="sc_marker blue">自分が書いたコードが目的の動作なのかを自分で確認する方法</span>を紹介します。</p>
<h2 id="rtoc-2" >テストの考え方</h2>
<p>下記の考え方を大事にしましょう。</p>
<ul>
<li><span class="sc_marker-animation y">書いたら試す</span></li>
<li><span class="sc_marker-animation y">人が手を加えたものにはミスが起こると考える</span></li>
<li><span class="sc_marker-animation y">ミスを少しでも0に近づけるために実施</span></li>
</ul>
<h2 id="rtoc-3" >mainメソッドが無いクラスのテスト方法</h2>
<p>自分で書いたコードはそのまま実行すれば動作を確認することができますよね。</p>
<p>しかし、mainメソッドがない機能を実装している場合は確認することが実行する事ができないので正常に動くかどうかがわかりません。</p>
<p>そんな時はmainメソッドを持つテストクラスを新規作成し、自分が書いたコードを試しましょう。</p>
<pre class="line-numbers"><code class="language-other">public class Animal {
　public String Name;
    public int Age;

    public void ShowProfile(){
        System.out.println( "名前は、" + Name + "、" + Age + "歳です。" );
    }

    public void Speak(){
        System.out.println( "......" );
    }
}</code></pre>
<pre class="line-numbers"><code class="language-markup">public class TestAnimal {
　public static void main(String args[]){
        showProfile();　 --メソッドテスト
        speak();              --メソッドテスト
    }

　public String Name;
    public int Age;

    public void showProfile(){
        System.out.println( "名前は、" + Name + "、" + Age + "歳です。" );
    }

    public void speak(){
        System.out.println( "......" );
    }
}</code></pre>
<p>上記の様にすることで、mainメソッドのないクラスでも自分の環境でテストを行うことができます。</p>
<p>mainメソッドを追加する場合は、<span class="sc_marker blue">本番稼働するコードには追加せず、Test〜〜の様に新規にクラスを用意してテストしてください！</span></p>
<p>本番稼働するコードに直接mainメソッドを追加してしまうと、コードを提出する際にmainメソッドを削除しなければいけません。<br />
人が手を加えるという事は何らかのエラーが起きる可能性があるので、せっかくのテストが無駄になってしまいます。</p>
<p>新規にテストクラスを用意してmainメソッドの記述をしましょう。</p>
<h3 id="rtoc-4" >上手なテスト</h3>
<p>上手なテスト方法として正常系と異常系のテスト方法があります。</p>
<ul>
<li>正常系→開発したプログラムが正常に動くか試す</li>
<li>異常系→引数に想定外の値を渡す。</li>
</ul>
<p>&nbsp;</p>
<p>正常系は動くかどうかを調べるだけなので簡単なのですが、異常系は工夫をしなければいけません。</p>
<p>下記コードでは足し算をおこなっているのですが、異常系を試す場合だと引数にマイナスの値やNULL値などの予想外の値を入れたりしてテストします。</p>
<pre class="line-numbers"><code class="language-other">public class Calc{
  int num1;
  int num2;
  int total;

  public int numTotal(num1,num2){
    this.num1 = num1;
    this.num2 = num2;
    total = num1 + num2;
    return total;
  }
}</code></pre>
<h2 id="rtoc-5" >JUnitで簡単にテストできるよ</h2>
<p>JUnitというJavaの機能を使えばmainメソッドのないクラスでも簡単にテストできるよ。</p>
<p>この記事がJUnitの使用方法を上手に丁寧に説明しているので見てみてください〜〜</p>
<p><a href="https://qiita.com/tomonori_hioki/items/252339a9bf4a17d93b70">EclipseでJUnitを動かす方法</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/887/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>オーバーロードとオーバーライドの違いをまとめました</title>
		<link>https://otonan-syusyoku.work/archives/901</link>
					<comments>https://otonan-syusyoku.work/archives/901#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Thu, 23 Sep 2021 01:08:41 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=901</guid>

					<description><![CDATA[Contents オーバーライドオーバーライドオーバーライド オーバライドとは親クラスで定義したメソッドを子クラスで子クラス専用のメソッドに書き換える技です。 Javaでは継承をよく使用するのですが、親クラスのメソッドを [&#8230;]]]></description>
										<content:encoded><![CDATA[<div id="rtoc-mokuji-wrapper" class="rtoc-mokuji-content frame4 preset3 animation-fade rtoc_open noto-sans" data-id="901" data-theme="BlogArise">
			<div id="rtoc-mokuji-title" class=" rtoc_center">
			<button class="rtoc_open_close rtoc_open"></button>
			<span>Contents</span>
			</div><ol class="rtoc-mokuji decimal_ol level-1"><li class="rtoc-item"><a href="#rtoc-1">オーバーライド</a></li><li class="rtoc-item"><a href="#rtoc-2">オーバーライド</a></li></ol></div><h2 id="rtoc-1" >オーバーライド</h2>
<p>オーバライドとは親クラスで定義したメソッドを子クラスで子クラス専用のメソッドに書き換える技です。</p>
<p>Javaでは継承をよく使用するのですが、親クラスのメソッドを子クラス用にアレンジしたいなって時に使います。</p>
<p>下記コードはAnimalクラスを継承したDogクラスでAnimalクラスのSpeakメソッドを書き換えています。</p>
<pre class="line-numbers"><code class="language-markup">public class Animal {
    public void Speak(){
    System.out.println( "......" );
  }
}

public class Dog extends Animal{
  //オーバーライド
  public void Speak(){
    System.out.println("わんわん");
  }
  public static void main(String args[]){
    Dog dog = new Dog();
    dog.Speak(); //わんわんが出力
}</code></pre>
<div class="sc_frame_wrap inline  orange">
<div class="sc_frame_title">注意！</div>
<div class="sc_frame ">
<div class="sc_frame_text">引数、型、メソッド名が全て同一でないとオーバーライドできない。</div>
</div>
</div>
<h2 id="rtoc-2" >オーバーライド</h2>
<p>オーバライドとは<span class="sc_marker blue">引数の違いによって同一のメソッドを呼び出した時に違う処理をさせる</span>技です。</p>
<p>本来であれば処理内容が異なれば別メソッドを用意しなければいけないのですが、オーバライドの技術を使用すれば呼び出し時に引数の数に違いをもたせればいいだけです。</p>
<p>メソッド名は同一なのに処理内容を変更できるのがオーバライドの強みですね！</p>
<p>下記コードは引数が一つある場合の処理と２つある場合の処理です。</p>
<pre class="line-numbers"><code class="language-other">public class Animal{
  public void Speak(int i){
    System.out.println("一人で黙々と眠る");
  }

  public void Speak(int i , int y){
    System.out.println("二人で仲良く眠る");
  }
  public static void main(String args[]){
    Animal animal = new Animal();
    animal.Speak(1); //"一人で黙々と眠る"が出力
    animal.Speak(1,2); //"二人で仲良く眠る"が出力
  }
}
</code></pre>
<div class="sc_frame_wrap inline  orange">
<div class="sc_frame_title">注意！</div>
<div class="sc_frame ">
<div class="sc_frame_text">オーバーロードでは、引数の型や並び順でも異なる処理を記述することができます。<br />
そのためメソッドの呼び出し時には型の種類や順番に気をつけて引数に指定しましょう！</div>
</div>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/901/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Randomクラスを使用したコード</title>
		<link>https://otonan-syusyoku.work/archives/899</link>
					<comments>https://otonan-syusyoku.work/archives/899#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Thu, 23 Sep 2021 00:54:13 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=899</guid>

					<description><![CDATA[◯目的 ランダムな整数を生成したい。 ◯使い方 ①Randumクラスをインポートしてインスタンス化。 Randum rm = new Randum(); ②nextInt()メソッドの呼び出し rm.nextInt(); [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>◯目的<br />
ランダムな整数を生成したい。</p>
<p>◯使い方<br />
①Randumクラスをインポートしてインスタンス化。<br />
Randum rm = new Randum();</p>
<p>②nextInt()メソッドの呼び出し<br />
rm.nextInt();</p>
<p>③整数の範囲を指定<br />
引数に指定した数の範囲の数が生成される。<br />
例：<br />
引数に10を指定した場合は、0〜9の10個の数字。<br />
引数に6を指定した場合は、0〜5の6個の数字。</p>
<p>rm.nextInt(10);</p>
<p>④ランダムの数字をプログラムに当てはめる<br />
例：500、100、50、10、5、１の６個の数字を格納したint型の配列をランダムに出力するプログラム</p>
<pre class="line-numbers"><code class="language-other">int coinCase[] = new int[6];
coinCase[0] = 500;
coinCase[1] = 100;
coinCase[2] = 50;
coinCase[3] = 10;
coinCase[4] = 5;
coinCase[5] = 1;

Randum rm = new Randum();
int no = rm.nextInt(6);

System.out.println(coinCase[no]);

//noに０〜５のランダムな数字が割り当てられ、配列のインデックスに指定することで５００〜１の数字をランダムに出力する。</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/899/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Finallyは例外処理で重要！</title>
		<link>https://otonan-syusyoku.work/archives/892</link>
					<comments>https://otonan-syusyoku.work/archives/892#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Thu, 23 Sep 2021 00:49:45 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=892</guid>

					<description><![CDATA[例外処理のfinallyの使い方がわからなかったので調べてみたらプログラム作成時にかなり重要なポイントになる事が分かりました。 今までなんとなく記述していたfinallyを気持ちを込めて記述できるようになるはずです。 C [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>例外処理のfinallyの使い方がわからなかったので調べてみたらプログラム作成時にかなり重要なポイントになる事が分かりました。<br />
今までなんとなく記述していたfinallyを気持ちを込めて記述できるようになるはずです。</p>
<div id="rtoc-mokuji-wrapper" class="rtoc-mokuji-content frame4 preset3 animation-fade rtoc_open noto-sans" data-id="892" data-theme="BlogArise">
			<div id="rtoc-mokuji-title" class=" rtoc_center">
			<button class="rtoc_open_close rtoc_open"></button>
			<span>Contents</span>
			</div><ol class="rtoc-mokuji decimal_ol level-1"><li class="rtoc-item"><a href="#rtoc-1">例外処理のfinallyは重要なのか</a></li><li class="rtoc-item"><a href="#rtoc-2">裏技的な例外処理</a></li></ol></div><h2 id="rtoc-1" >例外処理のfinallyは重要なのか</h2>
<p>例外処理を記述する時に思い浮かぶのがファイルの読み書き処理やDB接続などが挙げられるので今回はファイルの読み書き処理を基に解説したい。</p>
<pre class="line-numbers"><code class="language-markup">public static void main (String[] args){
  try{
    FileWriter fr = new FileWriter("読み書きするファイル名" , true);
    //ファイルに書き込み
    fw.write('aiueo');
    //ファイルの書き込み実行
    fw.flush();
    //ファイルを閉じる
    fw.close();
  }
}</code></pre>
<p>1つ目の構文ではtryの中にファイルの定義からファイルの終了までの一連の処理を記述しているのですが、②の処理「ファイルの書き込み実行」のあとに例外が発生してしまうとファイルを閉じることができなくなってしまう。</p>
<p>その結果ファイルを開けなくなったり、ファイル自体が壊れてしまったりする場合が出てきてしまう。</p>
<p>そうならないためにも下記のようにfinallyにファイルを閉じる処理を記述し、<span class="sc_marker blue">絶対にファイルを閉じる処理</span>にしてしまうのが大切。</p>
<pre class="line-numbers"><code class="language-other">public static void main (String[] args){
  try{
    FileWriter fr = new FileWriter("読み書きするファイル名" , true);
    //ファイルに書き込み
    fw.write('aiueo');
   //ファイルの書き込み実行
   fw.flush();
  }catch(IOException e){
    e.printStackTrace();
  }finally{
    //ここでファイルを閉じる
    fw.close();
  }
}</code></pre>
<p>この処理だと<span class="sc_marker blue">例外が起ころうが最後は絶対にファイルを閉じる</span>のでファイルの破損などの障害を未然に防ぐことができる。<br />
この処理にしてしまえばミスが減りますね〜〜〜！</p>
<div class="sc_frame_wrap inline orange">
<div class="sc_frame_title">注意！</div>
<div class="sc_frame ">
<div class="sc_frame_text">「書き込んだ分は今すぐに書き込め」という命令処理。<br />
これがないとファイルの書き込みをまとめて実行するのでエラーが起きたときに書き込みに失敗する恐れアリ。書き込んだ分はflushで実行していったほうが良いって先輩が言ってた。</div>
</div>
</div>
<h2 id="rtoc-2" >裏技的な例外処理</h2>
<p>javaに限りますが、閉じなければいけない処理を書く場合下記のような記述ができます。</p>
<pre class="line-numbers"><code class="language-other">public static void main(String[] args){
  try(FileWriter fr = new FileWriter("記述したいテキスト名" , true)){
    //ファイルに書き込み
    fw.write('aiueo');
    //ファイルの書き込み実行
    fw.flush();
  }catch(IOException e){
    e.printStackTrace();
  }
}</code></pre>
<p>この記述は「try-with-resources」構文と呼ばれています。<br />
この構文ではtry()の部分に閉じなければいけない処理を記述することでjavaが自動的に閉じてくれます。</p>
<p>try-catch-finallyと比べて記述も少なく例外が起きようが起きまいが絶対に閉じてくれるので、推奨されています。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/892/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ラムダ式って便利なのか？</title>
		<link>https://otonan-syusyoku.work/archives/875</link>
					<comments>https://otonan-syusyoku.work/archives/875#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Tue, 21 Sep 2021 16:35:21 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=875</guid>

					<description><![CDATA[Contents 前提知識のインターフェースラムダ式とはラムダ式の目的メソッドを変数として扱う関数型インターフェースを楽に記述前提知識のインターフェース ラムダ式の話の前にインターフェースの話です。分かる人は飛ばして下さ [&#8230;]]]></description>
										<content:encoded><![CDATA[<div id="rtoc-mokuji-wrapper" class="rtoc-mokuji-content frame4 preset3 animation-fade rtoc_open noto-sans" data-id="875" data-theme="BlogArise">
			<div id="rtoc-mokuji-title" class=" rtoc_center">
			<button class="rtoc_open_close rtoc_open"></button>
			<span>Contents</span>
			</div><ol class="rtoc-mokuji decimal_ol level-1"><li class="rtoc-item"><a href="#rtoc-1">前提知識のインターフェース</a></li><li class="rtoc-item"><a href="#rtoc-2">ラムダ式とは</a><ul class="rtoc-mokuji mokuji_ul level-2"><li class="rtoc-item"><a href="#rtoc-3">ラムダ式の目的</a></li><li class="rtoc-item"><a href="#rtoc-4">メソッドを変数として扱う</a></li><li class="rtoc-item"><a href="#rtoc-5">関数型インターフェースを楽に記述</a></li></ul></li></ol></div><h2 id="rtoc-1" >前提知識のインターフェース</h2>
<p>ラムダ式の話の前にインターフェースの話です。分かる人は飛ばして下さい。</p>
<p>&nbsp;</p>
<p>インターフェースとは<span class="sc_marker blue">「クラス内に含まれるメソッドの具体的な処理は記述せずに変数とメソッドの型を定義したもの」</span>になります。</p>
<p>例えば、Phoneというインターフェースを利用してCallクラスやMaileクラスを作成していきます。<strong></strong></p>
<pre class="line-numbers"><code class="language-other">--インターフェースPhone
interface Phone{
  String call = "電話をかけます";
  String mail = "メールを送ります";
}

--インターフェースを利用してCallクラスを実装
class Call implements Phone{
  public tell_call(){
    System.out.println(call);  --インターフェースで定義した変数callの呼び出し
  }
}

--インターフェースを利用してMailクラスを実装
class Mail implements Phone{
  public void send_mail(){
    System.out.println(mail);  --インターフェースで定義した変数mailの呼び出し 
  }

  public static void main(String args[]){
    Call c = new Call();
    Mail m = new Mail();
    c.tell_call; --「電話をかけます」が出力
　　　 m.send_mail;  --「メールを送ります」が出力
  }
}</code></pre>
<p>簡単にインターフェースを表すと下記のイメージで問題ないです。</p>
<ul>
<li><span class="sc_marker blue">インターフェースを土台として捉える</span></li>
<li><span class="sc_marker blue">その土台で定義されている空の変数やメソッドなどの道具を取り出し、</span></li>
<li><span class="sc_marker blue">その道具を使える状態(実装)にしていく</span></li>
</ul>
<p>&nbsp;</p>
<p>ただ、ここで問題になってくるのが抽象クラス(abstract)と似ている問題です。</p>
<p>ここでは詳しく解説しないのですが、抽象クラスは多重継承ができないので一つのクラスしか継承できないので限定的な処理をしたい時に使用します。</p>
<p>反対にインターフェースは多重継承が許されているので色々なインターフェースを継承することができます。</p>
<p>イメージ的にはiPhoneインターフェースとAndroidインターフェースを利用して新しい携帯を作るみたいな感じです。(分かりづらかったらゴメンさなさい)</p>
<h2 id="rtoc-2" >ラムダ式とは</h2>
<h3 id="rtoc-3" >ラムダ式の目的</h3>
<p>ラムダ式の目的は<span class="sc_marker blue">記述を簡略化する</span>事です。構文としては以下の通りです。</p>
<p>引数を渡して処理内容を記述するだけで、普段メソッドを使用する時と何ら変わりません。</p>
<pre class="line-numbers"><code class="language-other">(引数) -&gt; {処理内容}</code></pre>
<h3 id="rtoc-4" >メソッドを変数として扱う</h3>
<p>ラムダ式の良いところの1つ目はメソッドを変数のように扱える点です。</p>
<p>使い方としては、インスタンス化する時にメソッドをそのまま記述します。たったこれだけでメソッドを使用することができます。</p>
<pre class="line-numbers"><code class="language-other">interface Phone{
　public String Call(String name);
}

public class Main{
　public static void main(String[] args){
　　Phone p = (name) -&gt; { return name + "へ電話をかけます"; };
　　System.out.println(h.method("ビートルズ"));  --ビートルズへ電話をかけます
　}
}</code></pre>
<h3 id="rtoc-5" >関数型インターフェースを楽に記述</h3>
<p>Javaには関数型インターフェースと呼ばれる抽象メソッドを一つだけ持つインターフェースが存在します。<br />
(抽象メソッド→具体的な処理が記述されていないメソッド。定義されているのは型やアクセス修飾子。)</p>
<p>抽象メソッドは先程のメソッドを変数のように扱うでも使用したのが自分が作成した関数型インターフェースや、ConsumerやFunctionといったJavaが用意している関数型インターフェースが存在します。</p>
<p>Javaが用意している関数型インターフェースは説明が長くなってしまうので下記のサイトを見て下さい。めっちゃ分かりやすいです。</p>
<p>https://www.yoheim.net/blog.php?q=20160410</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/875/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>JavaでDBのDATE型を扱う時の注意点</title>
		<link>https://otonan-syusyoku.work/archives/873</link>
					<comments>https://otonan-syusyoku.work/archives/873#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Mon, 20 Sep 2021 02:52:47 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=873</guid>

					<description><![CDATA[Contents 気をつけること補足気をつけること JavaでSQLを扱う際に気をつけないといけないのが「SQLから受け取った値を扱える型をJava側で用意する」ことです。 もしJava側でSQLの値を扱える型が用意でき [&#8230;]]]></description>
										<content:encoded><![CDATA[<div id="rtoc-mokuji-wrapper" class="rtoc-mokuji-content frame4 preset3 animation-fade rtoc_open noto-sans" data-id="873" data-theme="BlogArise">
			<div id="rtoc-mokuji-title" class=" rtoc_center">
			<button class="rtoc_open_close rtoc_open"></button>
			<span>Contents</span>
			</div><ol class="rtoc-mokuji decimal_ol level-1"><li class="rtoc-item"><a href="#rtoc-1">気をつけること</a></li><li class="rtoc-item"><a href="#rtoc-2">補足</a></li></ol></div><h2 id="rtoc-1" >気をつけること</h2>
<p>JavaでSQLを扱う際に気をつけないといけないのが<span class="sc_marker blue">「SQLから受け取った値を扱える型をJava側で用意する」</span>ことです。</p>
<p>もしJava側でSQLの値を扱える型が用意できなければ、DBに保存されている値を間違った形で取得してしまい、整合性のないプログラムになってしまいます。</p>
<p>まずは、SQLとJavaの型の対応を見ていきましょう。(OracleDBで自分がよく使うデータ型)</p>
<table style="border-collapse: collapse; width: 100%;">
<tbody>
<tr>
<td style="width: 50%; text-align: center;">SQL</td>
<td style="width: 50%; text-align: center;">Java</td>
</tr>
<tr>
<td style="width: 50%;">CHAR</td>
<td style="width: 50%;" rowspan="2">String</td>
</tr>
<tr>
<td style="width: 50%;">VARCHAR2</td>
</tr>
<tr>
<td style="width: 50%;" rowspan="3">NUMBER</td>
<td style="width: 50%;">int</td>
</tr>
<tr>
<td style="width: 50%;">float</td>
</tr>
<tr>
<td style="width: 50%;">byte</td>
</tr>
<tr>
<td style="width: 50%;">DATE</td>
<td style="width: 50%;">java.sql.Date</td>
</tr>
<tr>
<td style="width: 50%;">TIMESTAMP</td>
<td style="width: 50%;">java.sql.Timestamp</td>
</tr>
</tbody>
</table>
<p>ここで気をつけなければ行けないのが日付を扱うDATE型とTIMESTAMP型です。</p>
<p>DATE型とは「年・月・日」を扱うデータ方に対してTIMESTAMP型は日付と時刻を扱うデータ型になります。</p>
<pre class="line-numbers"><code class="language-other">−−DATE型(YYYY/MM/DD) 
2021/08/20

--TIMESTAMP型(YYYY/MM/DD HH:MM:SS)
2021/08/20 12:30:25</code></pre>
<p>日付を扱うDATE型やTIMESTAMP型も文字列を扱う際のようにString一つで扱えたら良いのですが、Javaではそこが難しいです。</p>
<p>下記のようなコードで対応しましょう。</p>
<pre class="line-numbers"><code class="language-other">/*DATE*/
String sql = "SELECT 登録日 FROM SAMPLE LIMIT1";
PreparedStatement ps = con.preparedStatement(sql);
ResultSet rs = ps.excuteQuery();

java.util.Date date = new java.util.Date();  −−DATE型を扱えるパッケージの呼び出し
date = rs; 

/*TIMESTAMP*/
String sql = "SELECT 登録日 FROM SAMPLE LIMIT1";
PreparedStatement ps = con.preparedStatement(sql);
ResultSet rs = ps.excuteQuery();

java.sql.Timestamp ts = rs.getTimesatamp(1);
java.util.Date date = new Date(1);</code></pre>
<h2 id="rtoc-2" >補足</h2>
<p>日付型の変換はよく使用するので紹介しておきます。</p>
<p>この方法を使えばSQLの型をあまり気にせずにJava側で値を受け取ることができまーす。</p>
<pre class="line-numbers"><code class="language-other">/*日付型を文字列に変換*/
SELECT TO_CHAR('登録日, YYYY/MM/DD'),
               TO_CHAR('登録日, YYYY/MM/DD HH12:MM:SS')  --12時間形式
               TO_CHAR('登録日, YYYY/MM/DD HH24:MM:SS')  --２４時間形式</code></pre>
<div class="highlight"></div>
<pre class="line-numbers"><code class="language-other">/*文字列を日付型に変換*/
SELECT TO_DATE('登録日, YYYY/MM/DD'),TO_DATE('登録日, YYYY/MM/DD HH12:MM:SS') --12時間形式
TO_DATE('登録日, YYYY/MM/DD HH24:MM:SS') --２４時間形式</code></pre>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/873/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Javaのラッパークラスを理解してしまった</title>
		<link>https://otonan-syusyoku.work/archives/849</link>
					<comments>https://otonan-syusyoku.work/archives/849#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Sun, 19 Sep 2021 14:52:36 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=849</guid>

					<description><![CDATA[Contents 概略ラッパークラスとは難しく考えない概略 基本型の値が格納されている変数をオブジェクトとして扱うためのもの。 「オブジェクトとして扱う＝クラスとして定義する」なので、自分の目的に合わせて基本型の値を加工 [&#8230;]]]></description>
										<content:encoded><![CDATA[<div id="rtoc-mokuji-wrapper" class="rtoc-mokuji-content frame4 preset3 animation-fade rtoc_open noto-sans" data-id="849" data-theme="BlogArise">
			<div id="rtoc-mokuji-title" class=" rtoc_center">
			<button class="rtoc_open_close rtoc_open"></button>
			<span>Contents</span>
			</div><ol class="rtoc-mokuji decimal_ol level-1"><li class="rtoc-item"><a href="#rtoc-1">概略</a></li><li class="rtoc-item"><a href="#rtoc-2">ラッパークラスとは</a></li><li class="rtoc-item"><a href="#rtoc-3">難しく考えない</a></li></ol></div><h2 id="rtoc-1" >概略</h2>
<p>基本型の値が格納されている変数をオブジェクトとして扱うためのもの。</p>
<p><span class="sc_marker blue">「オブジェクトとして扱う＝クラスとして定義する」</span>なので、自分の目的に合わせて基本型の値を加工することができます。</p>
<h2 id="rtoc-2" >ラッパークラスとは</h2>
<p>Javaでは型安全という考え方があるので型に対して厳格な姿勢が求められるため、一度定義した型に対して途中で変更するとJVMさんが「型を勝手に変えるな！」と怒ってエラーを吐きます。</p>
<p>しかし下記のようにプログラムによっては途中で定義した型を変更したい時があると思います。</p>
<pre class="line-numbers"><code class="language-other">public static void main(String args[]){
  int i = 2021;
  
  //文字列として扱いたい！
 　String sr = u;  // error</code></pre>
<p>&nbsp;</p>
<p>これだとエラーになるのですが、<br />
Javaではラッパークラスという「ラッピングするクラス」で基本型の値を包んであげることでデータの加工ができるようになります。</p>
<p>下記のコードのようにint型の変数iを様々な形に加工することができます。このコードでは数字を扱うことしかできなかった変数iを加工するためにラッパークラスとして扱うようにしています。</p>
<pre class="line-numbers"><code class="language-other">int i = 1; //int型の変数

Integer itg = new Integer(i); //ラッパークラスの定義

String s = Integer.parseInt(i);　//文字列に変換
System.out.println(s); //文字列型の1が出力</code></pre>
<h2 id="rtoc-3" >難しく考えない</h2>
<p><span class="sc_marker blue">基本型の変数を包んであげる</span>だけです。<br />
基本型を加工するために変数を</p>
<p>「メソッドを使用するためにはクラスがないと使えないので様々な加工方法(メソッド)を持っているラッパークラスでラッピングする」くらいの認識で大丈夫です。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/849/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ジェネリクスをやっと理解した</title>
		<link>https://otonan-syusyoku.work/archives/857</link>
					<comments>https://otonan-syusyoku.work/archives/857#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Sat, 18 Sep 2021 08:38:02 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=857</guid>

					<description><![CDATA[Contents 前提条件ジェネリクスとはジェネリクスの使用目的便利な使い方前提条件 Javaには型安全という考え方があります。 型安全という考え方は名前の通り、「変数やメソッドに型を指定して安全にプログラムを組み立てて [&#8230;]]]></description>
										<content:encoded><![CDATA[<div id="rtoc-mokuji-wrapper" class="rtoc-mokuji-content frame4 preset3 animation-fade rtoc_open noto-sans" data-id="857" data-theme="BlogArise">
			<div id="rtoc-mokuji-title" class=" rtoc_center">
			<button class="rtoc_open_close rtoc_open"></button>
			<span>Contents</span>
			</div><ol class="rtoc-mokuji decimal_ol level-1"><li class="rtoc-item"><a href="#rtoc-1">前提条件</a></li><li class="rtoc-item"><a href="#rtoc-2">ジェネリクスとは</a><ul class="rtoc-mokuji mokuji_ul level-2"><li class="rtoc-item"><a href="#rtoc-3">ジェネリクスの使用目的</a></li></ul></li><li class="rtoc-item"><a href="#rtoc-4">便利な使い方</a></li></ol></div><h2 id="rtoc-1" >前提条件</h2>
<p>Javaには型安全という考え方があります。</p>
<p>型安全という考え方は名前の通り、「変数やメソッドに型を指定して安全にプログラムを組み立てていきましょう！」という考え方です。</p>
<p>&nbsp;</p>
<p>例えば、型の指定をしていない変数mojiに1を代入したとします。</p>
<p>この変数mojiには1という文字が入っているのですが、文字なのか数字を判別することができませんよね。</p>
<p>自分からすると文字の1だと考えて定義した変数が自分以外の誰かからすると数字の1と捉えてしまう可能性があります。</p>
<p>その可能性を潰すためにも<span class="sc_marker blue">型を指定することがJavaのルール</span>になっています。</p>
<pre class="line-numbers"><code class="language-markup">public class Num {
   public static void main(String args[]) {
     String moji = "1";

      System.out.println(moji);

     System.out.print(moji + moji);　　　　//11

    /*変数mojiがint型だった場合
        System.out.println(moji + moji);
        --2
    */
    }

}</code></pre>
<p>ちなみにJavaを勉強する前はPHPを独学で学んでいたのですが、PHPのような変数やメソッドに型を指定しない言語を動的型付け言語と言いいます。<br />
それに対してJavaのような明示的に型を指定しないといけない言語を静的型付け言語と言います。<br />
僕のようにPHPのような動的片付け言語から移行してきたから人からするとストレスを感じる部分なので少しづつなれていきましょう！</p>
<h2 id="rtoc-2" >ジェネリクスとは</h2>
<p>Javaは型を指定して安全にプログラムを組まないといけない言語という事が理解できたところで本題です。</p>
<p>&nbsp;</p>
<p>ジェネリクスとは、コレクションに対して型を指定する方法です！</p>
<p>コレクションとは値の追加、保持などができるjava特有の配列のようなものです。（厳密には配列ではない）</p>
<p>&nbsp;</p>
<p>下記のコードを見れば分かると思うのですが、</p>
<p>boxという名前のコレクションの型をStringとして指定することにより、文字列しか格納できないコレクションになりました。</p>
<pre class="line-numbers"><code class="language-other">//&lt;&gt;の部分にStringを指定！文字列しか格納できないコレクション
List&lt;String&gt; box = new ArrayList&lt;String&gt;();
box.add("hello");
box.add("bye");

for(String i: box) {
	System.out.println(i);
	}</code></pre>
<div class="sc_frame_wrap inline orange">
<div class="sc_frame_title">配列とコレクションの違い</div>
<div class="sc_frame ">
<div>どちらも複数の値を保持できる変数と考えて問題ないのですが、</div>
<div class="sc_frame_text">配列は型の情報、格納する値などを定義する段階で指定しなければいけなく、途中で値の追加などはできません。<br />
それに対してコレクションは名前を宣言するだけで良く、途中で値の追加などができます。</div>
</div>
</div>
<h3 id="rtoc-3" >ジェネリクスの使用目的</h3>
<p>ジェネリクスの使用目的を考える前にコレクションの使用目的を考えてみましょう。</p>
<p>コレクションは複数の値を好きなだけ入れきれることができる配列のようなもなので、何かに関連したデータをまとめて扱いたい時に使用しますよね。</p>
<ul>
<li>ポジション→｛ガード、フォワード、センター｝</li>
<li>美味しいご飯→｛寿司、蟹、ハンバーグ、味噌汁、｝</li>
</ul>
<p>上記のようにまとめることで関連する情報をまとめておくことで後で使用する時に何かと便利です。</p>
<p>&nbsp;</p>
<p>そのためコレクションを使用するときはまとめた情報を繰り返し処理するループ処理などと併用されます。</p>
<p>ここで、問題になってくるのが<span class="sc_marker blue">コレクションには複数の値を入れきれる</span>ということです。</p>
<p>&nbsp;</p>
<p>例えば下記のようなコレクションがあった時はどうでしょうか？</p>
<pre class="line-numbers"><code class="language-other">public static void main(String args[]){
  List&lt;&gt; box = new ArrayList&lt;&gt;();
  box.add(1);
  box.add("aiueo");
  box.add("hello");
  //boxの中身→｛数字の1、文字列のaiueo、文字列のhello｝

for(String i: box){
  System.out.println(box);  //文字列でループ処理を回す処理なのでエラーになる
}</code><code class="language-other"></code></pre>
<p>このようなコードだと様々な型が格納されておりループ処理の中で使用するのができません。</p>
<p>そこで、ジェネリクスを使用してコレクションの型を指定し一つの型だけを格納できるコレクションとしてせんげんしてあげます。</p>
<pre class="line-numbers"><code class="language-other">public static void main(String args[]){
  List&lt;String&gt; box = new ArrayList&lt;String&gt;();  //String型として扱う宣言
  box.add("1");
  box.add("aiueo");
  box.add("hello");

  for(String i: box){
    System.out.println(box);  //文字列しか格納していないのでエラーにならない
  }
}</code></pre>
<p>このように&lt;型名&gt;を記述することでコレクションをどのように扱うかを定めたるものがジェネリクスになります。</p>
<p>こうすることで一つの型しか格納できなくなるので型安全が保てますよね！</p>
<p><span class="sc_marker blue">便利なコレクションを安全に使うことができるジェネリクス</span>です！</p>
<h2 id="rtoc-4" >便利な使い方</h2>
<p>ジェネリクスを便利に使うなら宣言時にEという文字を設定して宣言しておき、呼び出す時に型を定義するという方法があります。</p>
<p>&lt;E&gt;と記述した部分は「T」でも「Z」でも「aiueo」等なんでも問題ないです。</p>
<p>このような代替文字を置いておくことで「呼び出し時に型を定義してね」という意味になります。</p>
<p>メソッドを例えば個人が作成したHero型に設定することも可能なので、ケースに合わせた型宣言が可能になります。</p>
<pre class="line-numbers"><code class="language-other">//メソッドの型をEとしておく
public void Box&lt;E&gt;{
  System.out.println("ジェネリクス");
}

public static void main(String args[]){
  Box&lt;String&gt; b = new Box&lt;String&gt;;
  Box&lt;int&gt; b = new Box&lt;Integer&gt;;
}</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/857/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
