【初心者】Engineerの心得

Engineerになりたい君は、
入社する会社が
**【SIer】なのか【Web系】**なのか知っておきましょう。

知らないと大やけどです。あっちっちです。しっかりググりましょう。

#1．検索のお話
（これは覚えよう）

皆さんは普段どのように検索していますか？
おすすめのお店を探すときや知りたいものを探すとき
「東京　おすすめ　うまい」とか検索しますよね。

エンジニアの場合だと
「エンジニア　なりたい」だけだと
膨大な量が出てきてしまうので、ここわっかんないなーってものも
きちんと言葉にしないとありすぎて困ってしまうのです。



でもご安心を
そんなあなたも1ランク上のググりストになれます。
というより、**これからエンジニアなりたい人は必須**です。
こんな種類があるので覚えましょうね。

|検索方法 |検索例  |ざっくり説明  |
|---|---|---|
|1語で検索  |	WORD1  |「WORD1」を含むページが膨大に表示  |
|完全一致  |“WORD1がWORD2である”  |	「WORD1がWORD2である」と完全一致する文字を含むページを検索。文章を検索したい時に使ったり、キーワードを完全一致させたい時に使う。  |
|ワイルドカード  |“WORD1*WORD2”  |	「WORD1」と「WORD2」の間の文字がなんでも良い。完全一致で思い出せない文字がある時に使うことが多い  |
|複数語で検索  |WORD1 WORD2  |「WORD1」と「WORD2」を含むページを検索  |
|特定の語句を除外  |WORD1 -WORD2  |「WORD1」を含んで「 WORD2」を含まないページを検索  |

知っておくと人生広がるので、ぜひ


追加で、
<b>「日本語でないなら英語で検索してみる」</b>とか
<b>「期間半年以内にして検索結果を絞る」</b>とかするとなおよさげ。

<br>

>ここから学習の備忘録。

#1.クラスとインスタンスがわからなくなる
オブジェクト指向の言語をやっていると、「クラス？インスタンス？なんだっけ…」と何度もなりました。ここを無視して進めると、痛いしっぺ返しを食らいます（経験談）

オブジェクト指向とは、プログラミングをする上では必須だけど、理解するのが難しいことで有名。

ここで、ザックリオブジェクト指向を説明すると

>モノの作成と操作として見る考え方。オブジェクトとは「モノ」を意味します。

>「テレビ」というモノを操作するとき、中でどういうプログラムが動いているか知る必要はなく、リモコンで操作すれば、動きます

>「こういう”モノ”を作りましょう」「そして、その"モノ"を使いましょう」というのがオブジェクト指向という考え方だと思ってOK

まぁうーんって感じですよね。わかります、ハイ。
そんなオブジェクト指向を理解するのに必要なのが、クラスとインスタンス。

><b>クラスは設計図のようなもの</b>で、その<b>設計図からつくる実際の「もの」にあたるものがインスタンス</b>になります。


#3.引数、戻り値って何…？それ…
ざっくりでこんな感じ。初期の初期で躓いた記憶…😱

>返り値（戻り値）：関数とかから出てくる値
引数：関数とかに入れる値
![d005003-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505304/65291fb8-6abb-afbf-cda2-8470ebd2bd3e.png)
![d005003-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505304/d07cb13c-9550-0b0a-df66-7ca561118e72.png)

概念はおさえとくのが良さげです。

```ruby
class Menu
  #~~
  #~~

    #クラスの中でメソッドを定義
   def show(date)          #dataは引数           
      return "私は#{date}です"   #returnと同じ列が戻り値
   end
end

menu1 = Menu.new       #Menuクラスから「インスタンス（もの）」を生成
puts menu1.show("メニュー")       #実行結果：私はメニューです
```

#4.インスタンスメソッドってなんぞ？
意外と私はここで躓いています。
「？？？」となる方は多いのではないでしょうか？

>インスタンスメソッドとは、<b>クラスの中で定義し、インスタンスに対して呼び出すメソッドのこと</b>を指します。

```ruby
class Menu
   #複数のインスタンス変数を用意
   attr_accessor  :name     #情報を持たせるために「accessor シンボル」のようにする
   attr_accessor  :price    #Menuクラスのインスタンスにprice（インスタンス変数）という情報を与える

    #クラスの中でメソッドを定義
   def show           
      puts "私はメニューです"
   end
end

menu1 = Menu.new       #Menuクラスから「インスタンス（もの）」を生成
menu1.name = "すし"    #インスタンスに情報を持たせるために、「クラスで用意したインスタンス変数に値を代入」

puts menu1.name       #実行結果:すし

menu1.show             #クラスの中で定義したメソッドを呼びだす=インスタンスメソッド
```
<br>
さらにインスタンスメソッドの中でインスタンス変数を扱う、「ん、なんじゃそれ…」みたいなことも立て続け出てきます。その際に、特殊な変数「.self」を用いて「self.変数名」とすることでインスタンス変数を扱うことができます。

```ruby
class Menu
  #~~
  #~~

    #クラスの中でメソッドを定義
   def show_name           
      puts "私は#{self.name}です"   #selfに、呼び出したインスタンス自身が代入されている 
   end
end


menu1 = Menu.new       #Menuクラスから「インスタンス（もの）」を生成
puts menu1.show_name  #インスタンスメソッドの呼び出し      
#実行結果：私はピザです
```

<参考までに>
>インスタンス生成手順
❶クラスを用意
❷クラスからインスタンスを生成する
❸インスタンス変数に値を代入する

rubyには❷と❸をまとめて、「インスタンスを生成すると同時にインスタンス変数に値を代入する」方法、<b>initializeメソッド</b>がありますが、それはまた今度


#5.クラスメソッドってなんぞ？
>クラスに対して呼び出すメソッドのことを指します。

たとえば

```ruby
require "date"
  date1 = Data.today   #Dateはクラス名、「.today」はクラスメソッド
```

<br>
>クラスメソッドは、「def クラス名.メソッド名」とすることで定義できます。

```ruby
class Menu

   def Menu.is_discount_day?
    #処理
   end
end

```

**最後にクラスメソッドとインスタンスメソッドの確認**
progateからの引用ですが、これがRubyの場合スッキリまとまっているかと。

<img width="1031" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505304/25244ab7-1055-87f6-a0a1-65769259b77f.png">

意外とわかりやすい言語で概念をおさえて、javaに戻るとここはそういうことね！ってつながるので、挫折しないためにもおすすめしたいです。


#◆文字列から数値への変換　～IntegerクラスのparseIntメソッドとは何ぞや？～
数値形式の文字列を数値そのものに変換する方法があるそうです。
その１つが、『parsexxxメソッドを使用する』とのこと。

**parsexxxメソッドを使用する**
この方法は、各ラッパークラスで用意されているparsexxxメソッドを使う方法です。xxxの部分はラッパークラス毎に異なりそれぞれ次のようなメソッドが用意されています。



※[ラッパークラスの説明はこちらから](https://qiita.com/Fallstag_Atsugi/items/1ebb7cce04305f63f082)


```
Byteクラス:
static byte parseByte(String s)

Shortクラス:
static short parseShort(String s)

Integerクラス:
static int parseInt(String s)

Longクラス:
static long parseLong(String s)

Floatクラス:
static float parseFloat(String s)

Doubleクラス:
static double parseDouble(String s)

```

##◆使用例：parsexxxメソッド
たとえば、<b>Integerクラスで用意されているparseIntメソッドは、引数に指定された文字列を整数の値として解析しint型の値として返す</b>そうです。実際には次のように記述します。
<br>

```java

String str = "124";
int i = Integer.parseInt(str);
```
<br>
<br>

なお、整数でない数値の文字列をparseIntメソッドを使って変換しようとしたり、そもそも数値形式でない文字列を変換しようとすると、コンパイルエラーとはなりませんが実行時に

>「java.lang.NumberFormatException: For input string」というエラーが発生します。

例えば次のような場合です。

```java

String str = "124.567";
int i = Integer.parseInt(str);
```
<br>

<br>

また、範囲を超えた数値の文字列を変換しようとすると、コンパイルエラーになりませんが実行時に
>「java.lang.NumberFormatException: Value out of range」というエラーが発生します。

例えば次のような場合です。

```java
String str = "198667234";
byte b = Byte.parseByte(str);
```

いずれの場合もコンパイル時にはエラーとなりませんので注意して下さい。

◆サンプル
```java
class JSample5_1{
  public static void main(String args[]){
    String str1 = "124";

    int i = Integer.parseInt(str1);

    System.out.println(i);     //124
  }
}
```

以上です。








#◆ラッパークラスとは？
ラッパークラスとはなんぞやと思い、まとめてみました。
[javaでは基本データ型として、byte, short, long, integer, float, char, double, booleanが規定](https://qiita.com/Fallstag_Atsugi/items/f9e5a07ddad33133613a)されています。これらをプリミティブ型というそうです。

プリミティブ型はオブジェクトではないので、それ自身のメソッドを持っていません。

ところがオブジェクトを使ってゆくと、これらの基本型を操作しなければならない局面が出てきます。そのためプリミティブ型をオブジェクトとして操作するクラスが各種定義されています。 これらはプリミティブ型を包み込むという意味でラッパークラスといいます。

あんまりわかりませんね。情報系の学部卒ならスッと頭に入るのでしょうか？

![rapper.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505304/886e24d9-d1a1-b8d4-5ce2-b6c9e589a295.gif)

絵にするとわかりやすい😊


ラッパークラスは下の表で示されるように、プリミティブ型の種類によっていくつかの種類があります。オブジェクトですので、それぞれ固有のプリミティ値を持ち、それを操作するメソッドを持っています。


|プリミティブ型	|ラッパークラス|
|---|---
|byte	|Byte
|short	|Short
|int	|Integer
|long	|Long
|char	|Character
|float	|Float
|double	|Double
|boolean	|Boolean

使い方は色々ありますが１例として、数字の文字列 "123" "123.45" はそのままでは計算ができませんが、ラッパークラスで数字に変換することによって数値計算することができるそうな。


<br>
基本データ型はNULLデータは代入できません。オブジェクト型ならNULLが代入できます。
頭が大文字になっているのが特徴ですね🙄




#◆lengthとlength()の違い

Javaで長さを取得するために使うlengthとlength()。
違いがわからないので、まとめました。

初学者以外も、よく意味がごっちゃになるそうなので一度おさらいしましょう

>length：<b>配列の長さを取得する</b>
length()：<b>文字列の長さを取得する</b>

参考までにこんな感じで使います。

```
public class Main {
  public static void main(String[] args) {

    // length：配列の長さを取得する
    int[] array = {1, 2, 3};
    System.out.println(array.length);   // 3

    // length()：文字列の長さを取得する
    String str = "lengthの長さ";
    System.out.println(str.length());   // 9
  }
}
```

ちなみに、length()を使って文字列の長さを取得する際、全角・半角を問わず1文字としてカウントされます。

どっちが使いたいか理解したうえでコードを実装しましょうね。



#※コマンドライン引数について
>結論：プログラムを起動した際に一番最初に渡される情報

いちいちコードを書かなくてもファイルの情報を勝手に持ってきてくれるから便利との評判です。

ざっくり説明すると、コマンドライン引数に最も多く設定されるのはファイルの情報で、別に文字や数値でもOKだそうです。<b>設定するときに必要なデータが入っているフォルダのパスを指定してあげればフォルダの中身の情報が取得できる</b>そう。



**Q.2  コマンドライン引数の情報はどこに渡されるの？**
>結論： mainメソッドの引数部分

```java
public class sample{       
   public static void main(String[] args){ 
   }                      //String[] argsの部分
}
```

javaの仮想マシン(VM)から最初に呼び出されるのは、<b>"public static void main(String[] args)"と決まっている</b>らしくString型の配列で受け取っています。

ちなみに変数名だけは別に"args"じゃなくても良いそうな。


**Q.3 mainメソッドは他の場所から引数の値を受け取れないの？**

>結論：mainメソッドの引数はコマンドライン引数専用である

<b>mainメソッドプログラムの中で一番最初に呼ばれるため、下のようにメソッドで引数を渡すことができない</b>のです。だからコマンドライン引数で情報を渡してあげる必要があるそうな。


```java
public class sample{       
   public static void main(String[] args){ 
     hello("こんにちは","柿崎");
   } 

  public void hello(String a, String b){
    System.out.println(a + "," + b + "さん")   //結果：こんにちは,柿崎さん
  }                   
}
```

#■StringBuilderクラスを使わない連結方法（※注意点アリ）
```java
public static void main(String[] args) {
        //コマンドライン引数を３つ渡す　例：とり　豚　からし
	    System.out.println(args[0] + args[1] + args[2]);  //結果:とり豚からし
	}
```

これで連結されるそうなんですが、<b>これではダメらしい</b>です。

どうすればいいのかというと、

>文字列を3つ以上を結合する場合は、「＋」で連結するのではなく、StringBuilderクラスを使用するとのこと。「+」による連結を行うと、古いインスタンスは捨てられ、連結後の情報を持つ新しいインスタンスが生成されて、負荷がかかってしまうからだそうです。

では、早速書き換えましょう

**StringBuilderクラス使い方**

<使い方>

```java

StringBuilder sb = new StringBuilder();
```

レッツ書き換え！

```java
public static void main(String[] args) {
        //
            StringBuilder sb = new StringBuilder();

	       // 文字列結合  例　とり　豚　からし
           sb.append(args[0]);
           sb.append(args[1]);
           sb.append(args[2]);

    System.out.println(sb.toString());  //結果:とり豚からし
	}
```


**問題点：コマンドライン引数が１つや２この時反応しない**
今回は、３つコマンドライン引数を指定したのですが、１つ、または２つにするとエラーが起きてしまうんですよね…。「0」の時は、if文を使って回避できるのですが、ここだけ課題点です…。





#■LocalDateTimeクラスとは？
>Java8から導入された新しいAPI。
【特徴】
・タイムゾーンのない日時。
・内部にLocalDateとLocalTimeのインスタンスを持っている。
・例：2015-12-15T23:30:59.999

コードで書くとこんな感じでできる。

```java
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

public class test01 {

	public static void main(String[] args) {

	    //現在日時を生成;
		LocalDateTime d = LocalDateTime.now();
	    System.out.println("現在日時：" + d);   //現在日時：2020-04-15T15:57:33.884

	    //日付を生成
	    LocalDate ld2 = LocalDate.of(2020, 4, 15);
	    System.out.println("日付：" + ld2);   //日付：2020-04-15


	    //時間を生成
	    LocalTime lt1 = LocalTime.now();
	    System.out.println("時間：" + lt1);   //時間：15:57:33.886
	}
}
```

知っておくと便利かも。

 


**DateTimeFomatterクラスとは？**
>java.time.fomat.DateTimeFormatter
【特徴】
 ・日付・時刻の文字列出力、解析を行う。
   ・ 旧APIのSimpleDateFormatに相当。
  ・ISO標準形式等のフォーマッタも定数として定義してある。

**そのほかの日時クラスってあるの？**
>java.time.ZonedDateTime
タイムゾーン付きの日時。
例：2015-12-15T23:30:59.999+09:00[Asia/Tokyo]


＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
      



>java.time.OffsetDateTime
オフセット付きの日時。
例：2015-12-15T23:30:59.999+09:00

＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
>java.time.ZoneId
タイムゾーンID。(Asia/Tokyoなど)
ZonedDateTimeのインスタンス作成時などに使用する。

＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
>java.time.ZoneOffset
グリニッジ/UTCからのタイムゾーン・オフセット(+09:00など)。
OffsetDateTimeのインスタンス作成時などに使用する。

＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
>java.time.temporal.ChronoField
「年」「月」などの日時のフィールドを表す列挙型。
TemporalFieldインターフェースの実装クラス。
日時クラスから値を取得する場合など、TemporalField型のパラメータを持つメソッドで使用する。

＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
>java.time.temporal.ChronoUnit
「1年」「1ヶ月」など、日時の単位を表す列挙型。
TemporalUnitインターフェースの実装クラス。
TemporalUnit型のパラメータを持つメソッドで使用する。


では、またの