[java]10/6学習履歴-初期化


初期化変数


変数宣言後に初めて値を保存することを変数の初期化と呼びます.
メンバー変数は、初期化することなく、変数のデータ型に一致するデフォルト値に自動的に初期化されます.
ゾーン変数は使用前に初期化する必要があります.
class Initialize{
  static int x;
  public static void main(String[] args){
    System.out.println(x); // 0 출력.
  }
}
メンバー変数と配列の初期化はオプションですが、領域変数の初期化は必要です.
배열은 참조변수 선언 -> new 생성 -> 초기화로 이어지기 때문에 생성에서 기본값 0 이 들어간다. 참조변수 선언은 변수만 선언할 뿐임.

メンバー変数の初期化方法

  • 明示的初期化
  • コンストラクタ(コンストラクタ)
  • 初期化ブロック
    •インスタンス初期化ブロック:インスタンス変数を初期化する
    •クラス初期化ブロック:クラス変数
  • を初期化する

    明示的初期化Explicit初期化


    宣言と同時に変数を初期化することを明示的な初期化と呼びます.
    int x = 4; // 기본형 (primitive type) 변수의 명시적 초기화
    String y = new String("initial"); // 참조형 (reference type) 변수의 명시적 초기화
    明示的な初期化は簡単ですが、より複雑な初期化操作が必要な場合は、初期化ブロックまたはコンストラクション関数を使用します.

    初期化ブロック初期化ブロック

  • クラス初期化ブロック
  • インスタンス初期化ブロック
  • インスタンス初期化ブロックはクラスに作成され、クラスにコードが記述されます.クラス初期化ブロックは、インスタンス初期化ブロックの前にstaticを追加する.
    クラス初期化ブロックは、クラスが初めてメモリにロードされたときに1回実行され、インスタンス初期化ブロックは、コンストラクション関数などのインスタンス作成時に実行されます.**このとき、インスタンス初期化ブロックは、コンストラクション関数より先に実行される.
    클래스가 로딩될 때, 클래스변수들이 메모리에 만들어지고, 곧바로 클래스 초기화블럭이 클래스변수들을 초기화.
    インスタンス変数の初期化は主にコンストラクション関数を使用しますが、すべてのコンストラクション関数が共同で実行しなければならないコードを入れるときにインスタンス初期化ブロックを使用します.
    예시
    
    // 초기화 블럭을 사용하지 않은 코드
    class Car{
      static int count; // 클래스변수 count. 자동으로 0으로 초기화된다.
      int serialNo; // 인스턴스변수 serialNo. 아직 초기화되지 않은 상태.
      String color; // 인스턴스변수 color.
    
      Car(){ // 생성자 1
      count++;
      serialNo = count;
      color = "white";
      }
      
      Car(String color){ // 생성자 2
      count++;
      serialNo = count; // 위의 생성자와 중복되는 코드가 사용.
      this.color = color;
      }
    }
    
    // 초기화블럭을 사용한 코드
    class Car{
      static int count;
      int serialNo;
      String color;
      
      { // 인스턴스 초기화 블럭
      serialNo = ++count;
      }
      Car(){
      color = "white";
      }
      Car(String color){
      this.color = color;
      } // 중복된 코드를 사용할 필요가 없다.
    }
    コードの重複を排除することで、再利用性と信頼性が向上し、エラーの可能性が低減されます.オブジェクト向けプログラミングの究極の目標.
    예시
    class BlockTest{
     static {
     System.out.println("클래스 초기화블럭");
     }
     {
     System.out.println("인스턴스 초기화블럭");
     }
     BlockTest(){
       System.out.println("생성자");
     }
     public static void main(String[] args){
     System.out.println("start");
     BlockTest test = new BlockTest();
     }
    }
    
    출력순서
    
    "클래스 초기화블럭" => "start" => "인스턴스 초기화블럭" => "생성자"
    ** 클래스 초기화블럭이 가장 먼저 실행 -> main 메서드
    プログラムが実行中にクラスの情報を必要とすると、メモリに格納され、クラス初期化ブロックが最初に実行されることを保証します.
    예시
    class StaticBlock{
      static int[] arr = new int[10];
      static{
        for(int i=0; i<arr.length; i++){
          arr[i] = (int)(Math.random() * 10) + 1;
        } // 클래스 초기화블럭을 이용해 클래스변수의 초기화. 배열이나 복잡한 초기화에 사용할 수 있다.
      }
    }
    인스턴스변수의 복잡한 초기화는 생성자를 이용해서도 가능하다.

    メンバー変数の初期化時間と順序


  • クラス変数の初期化点
    クラスの最初のロード時に一度初期化します.

  • インスタンス変数の初期化ポイント
    インスタンスを作成するたびに、各インスタンスが初期化されます.

  • クラス変数の初期化順序
    デフォルト->明示的初期化->クラス初期化ブロック

  • インスタンス変数の初期化順序
    デフォルト->明示的初期化->インスタンス初期化ブロック->作成者
    *もう一つの段階があります.
  • クラス情報(クラスメンバーの使用やインスタンスの作成など)が必要な場合、クラスはメモリにロードされます.
    클래스의 로딩 시기는 JVM 의 종류에 따라 좀 다를 수 있다. 클래스가 필요할 때 로딩되는 것도 있고,
    사용할 클래스들을 프로그램이 시작될 때 미리 로딩하도록 되어있는 것도 있다.