07 생성자와 변수의 초기화

생성자

○ 생성자 : 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드

클래스이름 (타입 변수명, 타입 변수명, …) { }

Test(){ }

Test(int a, String b, bollean c){

this.a = a;

this.b = b;

this.c = c;

}

인스턴스 변수의 초기화 작업에 주요 사용됨

클래스 내에 선언됨

생성자의 조건

(1)   생성자의 이름은 클래스의 이름과 같아야 함

(2)   생성자는 리턴 값이 없음

생성자도 오버로딩이 가능함(매개변수에 차이를 둬서 다르게 인스턴스 생성 가능)

연산자 new로 생성자를 통해 인스턴스를 생성하는 것

Test t = new Test();

(1)   연산자 new에 의해서 메모리(heap) Test클래스의 인스턴스가 생성됨

(2)   생성자 Test()가 호출되어 수행됨

(3)   연산자 new의 결과로, 생성된 Test인스턴스의 주소가 반환되어 참조변수 t에 저장됨

 

○ 기본 생성자

Test () {}

클래스에서 생성자를 정의하지 않고도 인스턴스를 생성할 수 있었던 것!

컴파일러가 기본생성자를 추가해줘서

클래스의 접근 제어자가 public 인 경우 생성자도 public 클래스이름()

기본생성자가 컴파일러에 의해 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 때!

다른 생성자 있으면 기본생성자 자동으로 추가 안되고

내가 직접 추가해야 됨

○ 매개변수 있는 생성자

Test(int a, String b, bollean c){

a = a;

b = b;

c = c;

}

매개변수 선언해서 호출 시 값을 넘겨받아서 인스턴스 초기화할 수 있음

인스턴스 내의 멤버변수는 접근 가능하니까~ ㅎㅎ

 

○ 생성자에서 다른 생성자 호출하기_this(), this

생성자 간에 서로 호출 가능함! 그 조건

(1)   생성자의 이름으로 클래스이름 대신 this 사용

(2)   한 생성자에서 다른 생성자를 호출할 때 반드시 첫 줄에서만 호출 가능

생성자 내에서 초기화 작업 도중에 다른 생성자 호출하게 되면 다른 생성자 내에서 멤버변수 값을 초기화 할 수 있으니까, 이전 초기화 작업이 무의미해질 수 있음

■ this!

(1)   인스턴스 변수 앞에 붙여주는 this

인스턴스 변수 앞 this : 참조변수. 인스턴스 자신을 가리킴

생성자의 매개변수와 클래스의 멤버변수 이름이 같은 경우 인스턴스 변수를 구별함

인스턴스의 주소가 저장되어 있음

모든 인스턴스 메서드에 지역변수로 숨겨진 채 존재(this를 써 주는 건 명시하는 거네)

□ static메서드는 this 사용할 수 없음

인스턴스 생성하지 않고도 static 메서드는 호출할 수 있으므로!

(2)   this()

□ this(매개변수) 생성자.

같은 클래스의 다른 생성자 호출할 때 사용

                                                           

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

Test(Test t){

      a = t.a;

      b = t.b;

      c = t.c;

}

■ Object 클래스의 clone메서드를 이용하면 간단히 인스턴스 복사할 수 있음

 

변수의 초기화

○ 초기화 : 변수를 선언하고 처음으로 값을 저장하는 것

멤버변수는 초기화 하지 않아도 자동적으로 자료형에 맞는 기본값으로 초기화 됨!

지역변수는 자동으로 초기화 안되므로 사용할 때 초기화 해야 됨

멤버변수 초기화 방법

(1)   명시적 초기화

(2)   생성자

(3)   초기화 블록

-      인스턴스 초기화 : 인스턴스 변수 초기화에 사용

-      클래스 초기화 : 클래스변수 초기화에 사용

 

○ 명시적 초기화

변수를 선언과 동시에 초기화 하는 것

복잡한 초기화 작업 필요할 때는 생성자나 초기화 블록 이용

 

○ 초기화 블록

클래스 초기화 블록 : 클래스 변수의 복잡한 초기화에 사용

인스턴스 초기화 블록 앞에 static 붙임

         클래스 초기화 블록은 클래스가 메모리에 처음 로딩

0될 때 한번만 수행됨

인스턴스 초기화 블록 : 인스턴스 변수의 복잡한 초기화에 사용

클래스 내에 블록{ } 만들고 그 안에 코드 작성

인스턴스 생성될 때마다 수행 됨

초기화 블록 내에는 메서드처럼 조건문, 반복문, 예외처리구문 등 자유롭게 사용 가능

초기화 작업이 복잡하여 명시적 초기화로 부족한 경우 초기화 블록 사용

생성자보다 초기화 블록이 먼저 수행됨

인스턴스 변수의 초기화는 주로 생성자를 사용,

인스턴스 초기화 블록은 모든 생성자에서 공통으로 수행되어야 하는 코드 넣는데 사용

 

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

클래스 변수 초기화 시점 : 클래스가 처음 로딩될 때 단 한번 초기화 됨

인스턴스 변수의 초기화 시점 : 인스턴스가 생성될 때마다 각 인스턴스별로 초기화 이루어짐

클래스 변수의 초기화 순서 : 기본값 -> 명시적 초기화 -> 클래스 초기화 블록

인스턴스 변수의 초기화 순서 : 기본값 -> 명시적 초기화 -> 인스턴스 초기화 블록 –> 생성자

클래스 변수는 항상 인스턴스 변수보다 먼저 생성되고 초기화 됨

 

 

'JAVA > 이론' 카테고리의 다른 글

[java][이론] 009 package와 import  (0) 2020.07.06
[java][이론] 008 상속  (0) 2020.07.06
[java][이론] 006 변수와 메서드  (0) 2020.07.02
[java][이론] 005 클래스와 객체  (0) 2020.07.02
[java][이론] 004 배열  (0) 2020.06.29

+ Recent posts