생성자


생성자 - 인스턴스가 생성될 때마다 호출되는 '인스턴스 초기화 메서드'

인스턴스 초기화 - 인스턴스 변수에 적절한 값을 저장하는 것

 

Card c = new Card();

1. 연산자 new에 의해서 메모리(heap)에 card클래스의 인스턴스가 생성된다.

2. 생성자 Card()가 호출되어 수행된다.

3. 연산자 new의 결과로 생성된 card인스턴스의  주소가 참조변수 c에 저장된다.

 

 

조건

    - 생성자의 이름은 클래스의 이름과 같아야한다.

    - 생성자는 리턴값이 없다. (하지만 void를 쓰지않음)

        클래스이름(타입 변수명) {  인스턴스 생성시 수행될 코드 }

    - 여러개 가능(오버로딩)

    -  클래스에 생성자가 없어도 컴파일러가 기본 생성자를 추가한다.

 

 

기본 생성자 - 매개변수가 없는 생성자

클래스이름 () { }
Card() { }

 

 

this() - 생성자 , 같은 클래스의 다른 생성자를 호출 할 때 사용 , 다른 생성자 호출은 생성자의 첫 문장에서만 가능

Car() {
	this("white", "auto", 4) ; }
    
Car(String c,String g,int d) { 
	color = c;
    gearType = g;
    door = d;
    }

 

참조변수this

    this - 인스턴스 자신을 가리키는 참조변수 , 인스턴스의 주소가 저장되어있음

             (인스턴스 변수와 지역변수를 구별하기 위해 참조변수 this사용)

             ( 변수이름을 다르게 해도 되지만 보통은 매개변수와 똑같이 변수 명을 정한  후 this로 구별지음)

class Car {
	String color;
    String gearType;
    int door;
    
    Car ( String color , String gearType, int d) {
           this.color = color;
           this.gearType = gearType; }

 

생성자를 이용한 인스턴스의 복사 

        - 생성자에서 참조변수를 매개변수로 받아서 인스턴스변수들의 값을 복사한다. 

 

 

변수의 초기화


        

        변수를 선언하고 처음으로 값을 저장하는 것

        멤버변수(인스턴스변수,클래스변수)와 배열은 각 타입의 기본값으로 자동 초기화된다.

        지역변수는 사용전에 꼭!! 초기화를 해야한다.

 

  int x;
        int y;
    }
    void method() {
        int i;
        int j =i;   //컴파일에러
    }

 

멤버변수의 초기화

        1. 명시적 초기화   - 선언과 동시에 초기화

                  int door = 4;            Engine e = new Engine();

         2. 생성자

 Car ( String color , String gearType, int d) {
           this.color = color;
           this.gearType = gearType; }

        3. 초기화 블럭   - 인스턴스 초기화 블럭( {} ) , 클래스 초기화 블럭 ( static {} )

                        클래스 초기화 블럭 - 클래스변수의 복잡한 초기화에 사용되며 클래스가 로딩될 때 실행된다.

                        인스턴스 초기화 블럭 - 생성자에서 공통적으로 수행되는 작업에 사용되며 인스턴스가 생성될 때마다(생성자보다 먼저) 실행된다. ( 거의 사용하지않음)

             

    System.out.println(Arrays.toString(arr));
    }

    static int[] arr = new int[10];
     static  {
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int)(Math.random() * 10);
        }
    }

   

 

멤버변수의 초기화 시기와 순서

          클래스 변수 초기화 - 클래스가 처음 로딩될 때

          인스턴스 변수 초기화 - 인스턴스가 생성될 때마다 

자바의정석

               인스턴스는 변수 초기화는 인스턴스가 생성될 때마다 증가함으로 ++증감함수를 넣으면 인스턴스가 생성될 때마다 1씩증가되어 출력된다.

 

 

 

 

 

 

다른 부분 추가 static 사용이유 - 컴파일 시 static 변수가 먼저 컴파일 되는데 이 때문에 컴파일 될 당시에는 static이 아닌 변수들은 찾지 못해서 non-static field 에러가 뜬다!!!

int[] arr = new int[10];       //static이 없음 !@@!!!
 static  {               //에러 arr을 찾지못함!!!
    for (int i = 0; i < arr.length; i++) {
        arr[i] = (int)(Math.random() * 10);
    }
}

 

+ Recent posts