생성자
생성자 - 인스턴스가 생성될 때마다 호출되는 '인스턴스 초기화 메서드'
인스턴스 초기화 - 인스턴스 변수에 적절한 값을 저장하는 것
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);
}
}
'IT 관련 > JAVA' 카테고리의 다른 글
자바 객체지향언어II(제어자 ,다형성) (0) | 2022.06.29 |
---|---|
자바 객체지향언어II(상속,오버라이딩,super (0) | 2022.06.28 |
자바 객체지향언어I (재귀, 클래스메서드와 인스턴스메서드, 메서드 오버로딩) (0) | 2022.06.22 |
자바 객체지향언어I (JVM메모리 , 기본형 참조형 매개변수) (0) | 2022.06.17 |
자바 객체지향언어I ( 인스턴스, 메서드) (0) | 2022.06.17 |