생성자란?
인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드(인스턴스 변수를 초기화함)
생성자의 조건
- 생성자의 이름은 클래스의 이름과 같음
- 생성자는 리턴값이 없음(void는 생략)
생성자의 정의
클래스이름(타입 변수명, 타입변수명, ...){
// 인스턴스 생성 시 수행 될코드,
// 주로 인스턴스 변수의 초기화 코드를 적음
}
class Card{ Card(){ // 매개변수가 없는 생성자 } Card(String k, int num){ // 매개변수가 있는 생성자. }
여기서 주의해야하는 것은 인스턴스를 생성하는 것은 new이지 생성자가 아니다!
생성자는 인스턴스를 초기화 하는 역할 만 할 뿐임
기본생성자(default constructor)
클래스 이름() { } Card() { }
- 매개변수가 없는 생성자
- 생성자가 하나도 정의 되어있지 않은 경우 기본생성자 추가
단,
자동적으로 기본 생성자를 추가하는 경우는 클래스 내에 생성자가 하나도 없을 경우임!!
매개변수가 있는 생성자
class Car{
String color; String gearType; int door; Car(){} // 생성자
Car(String c, String g, int d){ // 생성자
color=c; gearType=g; door=d;
}
Car c=new Car("white", "auto", 4);
위와 같이 인스턴스 생성후 별도로 초기화를 하지 않도록 하는 것이 바람직
this()와 this
this()
생성자 간에 다른 생성자를 호출할 때 사용
- 반드시 첫줄에서 호출가능
why? 초기화 작업도중 다른 생성자를 호출하면 호출된 생성자 내에서 멤버변수 값을 초기화 하기 때문 - 클래스이름 대신 this를 사용
this
인스턴스 자신을 가리키는 참조변수
- this를 통해 인스턴스 변수에 접근가능
- static메서드에서는 사용불가
- 인스턴스 메서드 내에 지역변수로 숨겨져잇음
생성자를 이용한 인스턴스 복사
Car(Car c){ color=c.color; gearType=c.gearType; door=c.door; }
위의 코드는 참조변수를 매개변수로 선언한 생성자임
참조변수가 가리키는 iv들을 인스턴스 자신에 복사한다.
-> 인스턴스를 복사하여 생성해도 독립적인 저장공간을 갖는다.
따라서 c1의 값을 변경해도 c2의 값이 변경되지는 않음
변수의 초기화
변수를 선언하고 처음으로 값을 저장하는 것을 변수의 초기화라고함.
멤버변수(iv,cv)는 자동적으로 기본값으로 초기화가 됨
but 지역변수는 반드시 직접 초기화 해야한다!!
멤버 변수는 지역변수와 달리 초기화 방법에 3가지가 있다.
멤버변수의 초기화 방법
1. 명시적 초기화(explicit initialization)
변수를 선언과 동시에 초기화 하는 방법
class Car{
int door=4; // 기본형(primitive type) 변수의 초기화
Engine e=new Engine(); // 참조형(reference type) 변수의 초기화
// ...
}
가장 간단하고 명료한 방법이다.
하지만 보다 복잡한 초기화 작업이 필요할 때는 초기화 블럭이나 생성자를 사용해야함
2. 초기화 블럭(initialization block)
- 클래스 초기화 블럭
- 클래스가 메모리 로딩될 때 한번만 수행
- 앞에 static을 붙임
- 인스턴스 초기화 블럭
- 인스턴스를 생성할 때 마다 수행됨
- 모든 생성자에서 공통으로 수행돼야 하는 코드를 넣는 곳에 사용
멤버변수의 초기화 시기와 순서
클래스 변수 초기화 시점: 클래스가 처음 로딩 될 때
인스턴스변수 초기화 시점: 인스턴스가 생성 될 때
[초기화 순서]
cv 기본값 → cv 명시적 초기화 → cv 초기화 블럭 → iv 기본값 → iv 명시적 초기화 → iv 초기화 블럭 → 생성자
클래스 변수는 항상 인스턴스 변수보다 먼저 생성되고 초기화 됨!
'JAVA' 카테고리의 다른 글
[JAVA] 자바 객체지향 개념 정리(3) (0) | 2021.11.05 |
---|---|
[JAVA] 자바 객체지향 개념 정리(2) (0) | 2021.11.05 |
[JAVA] 자바 객체지향 개념 정리(1) (0) | 2021.11.05 |
[JAVA] 이클립스 설치 및 구성이해 (0) | 2020.12.18 |
[JAVA] 메모장으로 javac로 컴파일 및 실행하기 (0) | 2020.12.17 |
댓글