3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【初心者】Engineerの心得

Last updated at Posted at 2020-08-03

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

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

1.検索のお話

(これは覚えよう)

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

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

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

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

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

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


ここから学習の備忘録。

1.クラスとインスタンスがわからなくなる

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

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

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

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

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

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

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

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

3.引数、戻り値って何…?それ…

ざっくりでこんな感じ。初期の初期で躓いた記憶…😱

返り値(戻り値):関数とかから出てくる値
引数:関数とかに入れる値
d005003-3.png
d005003-9.png

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

class Menu
  #~~
  #~~

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

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

4.インスタンスメソッドってなんぞ?

意外と私はここで躓いています。
「???」となる方は多いのではないでしょうか?

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

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             #クラスの中で定義したメソッドを呼びだす=インスタンスメソッド

さらにインスタンスメソッドの中でインスタンス変数を扱う、「ん、なんじゃそれ…」みたいなことも立て続け出てきます。その際に、特殊な変数「.self」を用いて「self.変数名」とすることでインスタンス変数を扱うことができます。
class Menu
  #~~
  #~~

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


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

<参考までに>

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

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

5.クラスメソッドってなんぞ?

クラスに対して呼び出すメソッドのことを指します。

たとえば

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

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

   def Menu.is_discount_day?
    #処理
   end
end

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

キャプチャ.PNG

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

◆文字列から数値への変換 ~IntegerクラスのparseIntメソッドとは何ぞや?~

数値形式の文字列を数値そのものに変換する方法があるそうです。
その1つが、『parsexxxメソッドを使用する』とのこと。

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

ラッパークラスの説明はこちらから

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メソッド

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


String str = "124";
int i = Integer.parseInt(str);


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

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

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


String str = "124.567";
int i = Integer.parseInt(str);


また、範囲を超えた数値の文字列を変換しようとすると、コンパイルエラーになりませんが実行時に

「java.lang.NumberFormatException: Value out of range」というエラーが発生します。

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

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

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

◆サンプル

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が規定されています。これらをプリミティブ型というそうです。

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

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

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

rapper.gif

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

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

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

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


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

◆lengthとlength()の違い

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

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

length:配列の長さを取得する
length():文字列の長さを取得する

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

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だそうです。設定するときに必要なデータが入っているフォルダのパスを指定してあげればフォルダの中身の情報が取得できるそう。

Q.2 コマンドライン引数の情報はどこに渡されるの?

結論: mainメソッドの引数部分

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

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

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

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

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

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

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

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

■StringBuilderクラスを使わない連結方法(※注意点アリ)

public static void main(String[] args) {
        //コマンドライン引数を3つ渡す 例:とり 豚 からし
	    System.out.println(args[0] + args[1] + args[2]);  //結果:とり豚からし
	}

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

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

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

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

StringBuilderクラス使い方

<使い方>


StringBuilder sb = new StringBuilder();

レッツ書き換え!

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());  //結果:とり豚からし
	}

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

■LocalDateTimeクラスとは?

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

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

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型のパラメータを持つメソッドで使用する。

では、またの

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?