1
Help us understand the problem. What are the problem?

posted at

updated at

Java Silver SE 11を獲得するまでの日記【1章】

はじめに

資格を取るまでJavaの勉強やその途中で思ったことを適当に殴り書いていく。

見返したときにさらっと復習ができる程度には書きたい...
なのでこれは個人的な記事です。

パッケージとインポートについて

パッケージの目的は次の3つ

  1. 名前空間を提供し、名前の衝突を避ける
  2. アクセス修飾子と組み合わせてアクセス制御を提供する
  3. クラスの分類を可能にする

世の中で提供されている部品を利用する際、その部品のクラス名がかぶってしまったらエラーが出まくってしまう。

そのためクラスは「パッケージ名.クラス名」の完全修飾クラス名で扱う。

パッケージは名前の重複を避けるために習慣として

jp.co.xxx

のようにドメイン名(xxx.co.jp)を逆にして記述する。
どんな習慣だ...

これでパッケージ単位でアクセス制御することができる。

ほかにもクラス単位でアクセス制御するため
public」というものがある

公開するクラス
package jp.co.xxx;
public class Sample
{
      //処理
}
非公開するクラス
package jp.co.xxx;
class Sample
{
      //処理
}

見ての通りpublicが付いているか、否かである。
publicをつけることによって外部のパッケージから使えるようになる。

また、クラスは必ず何かしらのパッケージに属する。
パッケージ宣言を省略した場合「無名パッケージ」に所属する。パッケージに属さないクラスは存在しない。

そしてパッケージは以下のように「packageキーワード」を使って宣言できる。

パッケージ宣言
package sample; //ソースコードの先頭行に記述する
public class Test
{
      //処理
}

これでTestクラスはsampleパッケージに属していることになる。

パッケージ宣言は、必ずソースコードの先頭行に記述しなければいけない。

本来ソースコードは以下のように完全修飾クラス名で利用しなければいけない。

完全修飾クラス名で記述したソースコード
public class Main
{
      public static void main(String[] args)
      {
            java.lang.String str = "100";
            int val = java.lang.Integer.parseInt(str);
            java.math.BigDecimal decimal = new java.math.BigDecimal(val);
            System.out.println(decimal.intValue());
            }
      }
}

このように完全修飾クラス名で記述するとくっっそ長くなる。もはや何を書いているかわからない。
そこで、以下のように「インポート宣言」をすることでパッケージ名を省略してクラス名だけで記述することができる。

インポート宣言で記述したソースコード
import java.lang.String;
import java.lang.Integer;
import java.lang.BigDecimal;

public class Main
{
      public class void main(String[] args)
      {
            String str = "100";
            int val = Integer.parseInt(str);
            BigDecimal decimal = new BigDecimal(val);
            System.out.println(decimal.intValue());
      }
}

なお、「java.langパッケージ」は基本的なクラスがまとめられたパッケージで、これは頻繁に利用するためインポート宣言を省略できる。また、同じパッケージに属するクラスも省略できる。

そして以下のように

指定パッケージに属する全クラスのインポート宣言
import java.until.*;

パッケージ名の後ろにアスタリスクを使うことによって指定パッケージのすべてのクラスをインポートできる。

これは指定パッケージのクラスをインポートできるが指定パッケージ以降のパッケージはインポートされない。

無名パッケージに属するクラスはほかにも「Officeクラス」「Personクラス」があり使うことができる。

OfficeクラスとPersonクラス
public class Office
{
      //処理
}
public class Person
{
      //処理
}

もちろん明示的にパッケージ宣言をしたクラスからは、上記のOfficeクラス、Personクラスは使えないためコンパイルエラーになる。

mainメソッドについて

クラスには複数のメソッド(関数)を定義できる。
このとき処理を始めるためのメソッドを「エントリーポイント」という。

Javaでは、エントリーポイントとなるメソッドが決まっていて、以下のように記述する。

エントリーポイントとなるメソッドの書き方
public static void main(String[] args)
{
      //処理
}

上記のコードのうち変更できるのは引数名「args」の部分だけになる。

また、引数は次のように「可変長引数のString型」を受け取ることもできる。

可変長引数のString型で記述したエントリーポイント
public static void main(String... args)
{
      //処理
}

これは可変長の引数はコンパイル時に配列型の引数に変換されるため。

javaコマンドについて

javaコマンド」はJVMを起動するためのコマンドである。
javaコマンドの構文は以下の通り。

javaコマンドの構文
java 完全修飾クラス名 引数1 引数2 ...etc

クラス名の後に続ける引数を「起動パラメータ」「コマンドライン引数」と呼ぶ。

起動パラメータはエントリーポイントの引数としてString配列型に格納される。

javaコマンドでは次の3つを実行することができる。

  1. mainメソッドを持つクラスファイル
  2. jarファイル内のメインクラス
  3. モジュールに含まれるメインクラス

またJava SE 11では、javacコマンドでコンパイルせずに直接実行できる「ソースファイルモード」が追加された。

javaコマンドでSample.javaを実行
> java Sample.java a b c
a
b
c

起動パラメータは、スペースで区切って列挙する。スペースを含む文字列を使いたい場合は以下のようにダブルクオーテーションで括る。

起動パラメータにスペースを含む文字列を使う
> java Sample.java Hello World "Hello World"
Hello
World
Hello World

また、ダブルクオーテーションを文字として扱いたい場合はその後ろに「\」(バックスラッシュ)をいれる。
文字として扱えないものを文字として扱う方法を「エスケープ」という。

> java Sample.java Hello World \"Hello World\"
Hello
World
"Hello
World"

試験では、以下の3つを押さえておくとよい。

  1. スペースが区切り文字として扱われる
  2. スペースを含む文字列場ダブルクオーテーションで括ることで1つとして扱われる
  3. ダブルクオーテーションそのものは文字として扱われない

おわりに

趣味でソースコード書いてたけどやっぱ仕様の話になると全然知らないことだらけでどっひゃ~!って感じだった。でもやっぱりやってて面白いからこれからもこういう感じで進めていこうと思う。

追記
途中で資格勉強を投げ出さないよう自分に戒めとしてツイッターにあげることにした。

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
1
Help us understand the problem. What are the problem?