1. 생성자(constructor)
* 생성자 란 ?
- 객체 생성될 때 자동으로 호출되는 함수(메서드)
- 클래스명과 반드시 같아야 한다. '클래스명' == '메소드명'
- 리턴자료형을 사용 안해도 된다.
- 오버로딩이 가능
- 역할 : 필드 초기화
- 매개변수가 없는 생성자를 '디폴트생성자' 라고 한다.
- 상속 X
- 인스턴스가 생성될 때마다 호출되는 '인스턴스 초기화 메서드'
- 인스턴스 변수의 초기화 또는 인스턴스 생성시 수행할 작업에 사용
- 몇가지 조건을 제외하고는 메서드와 같다.
- 모든 클래스에서는 반드시 하나 이상의 생성자가 있어야 한다.
(지금까지 컴파일이 가능했던이유는 자동으로 컴파일러가 자동적으로 '디폴트생성자'를 생성했기 때문)
* 생성자의 역할 : 객체생성 + 필드초기화(동시에) -> 생성자
* 생성자 선언 형식
- 리턴자료형 X
- [접근지정자] [기타제어자] 생성자함수([매개변수]......)
* 인스턴스 생성과 순서
Car c = new Car();
1) 연산자 new에 의해서 메모리가(heep)에 Car클레스의 인스턴스가 생성된다.
2) 생성자 Car()가 호출되어 수행된다.
- 이때 인스턴스에 생성이 생성자로 인한것이 아닌 new에 의한것이다.
3) 연산자 new의 결과로, 생성된 Car인스턴스의 주소가 반환되어 참조변수 c에 저장된다.
* 생성자의 조건
- 생성자의 이름은 클래스의 이름과 같아야 한다.
- 생성자는 리턴값이 없다. (하지만 void를 쓰지 않는다.)
- 조건 방식
클래스 이름(타입 변수명, 타입 변수명 ....){
// 인스턴스 생성시 수행될 코드
// 주로 인스턴스 변수의 초기화 코드를 적는다.
//return 문 사용할 수 있다.
}
* 기본 생성자란?
- 매개변수가 없는 생성자
- 클래스에 생성자가 하나도 없으면 컴파일러가 기본 생성자를 추가한다.
- 생성자가 하나라도 있으면 컴파일러는 기본생성자를 추가하지 않는다.
- 인스턴스를 생성 할 때 new 연산자와 함께 생성자를 호출하도록 되어있기 때문에
"모든 클래스에는 반드시 하나 이상의 생성자가 있어야 한다. "
클래스이름(){ }
car(){ } 컴파일러에 의해 추가된 car클래스의 기본생성자. 내용 없다.

this ?
- 클래스 자기 자신의 주소값을 갖는 [참조변수]
- 3가지 용도
1) 맴버를 가리킬 때의 this
2) 생성자에서 또 다른 생성자를 호출할 때의 this
3) 단독(리턴 값 , 매개변수 값)으로 사용될 때의 this
* this() - 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용
- 다른 생성자 호출은 생성자의 첫 문자에서만 가능
- 한 생성자내에서 초기화 작업을 수행한 다음에 다른 생성자를 호출하면 다른 생성자에 의해서
전에 수행한 초기화 작업이 덮어써질수 있기 때문에 생성자에서 다음생성자를 호출할때 첫
문장에서만 호출할수있도록 하는것이다.
() 가 붙은 this 는 생성자
{} 가 없는 this 는 참조변수
* 참조변수 this
- 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다.
- 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재

* 생성자를 이용한 인스턴스 복사
- 인스턴스간의 차이는 인스턴스변수의 값 뿐 나머지는 동일하다.
- 생성자에서 참조변수를 매개변수로 받아서 인스턴스변수들 값을 복사한다.
- 똑같은 속성값을 갖는 독립적인 인스턴스가 하나 더 만들어진다.

* 변수의 초기화
- 변수를 선언하고 처음으로 값을 저장하는 것
- 멤버변수(인스턴스변수, 클래스변수)와 배열은 각 타입의 기본값으로 자동 초기화되므로 초기화를 생략할 수 있다.
- 지역변수는 사용전 꼭!! 초기화를 해주어야 한다.



* 맴버변수의 초기화 방법
- 명시적 초기화(explicit initialization) = 선언과 함께 초기화 하는것
- 생성자(constructor) = 인스턴스변수에 초기화
- 초기화 블럭(initialization block)
= 인스턴스 초기화 블럭: { } - 인스턴스변수의 복잡한 초기화에 사용
// 생성자에서 공통적으로 수행되는 작업에 사용되며 인스턴스가 생성될 때 마다 (생성자 보다 먼저) 실행
= 클래스 초기화 블럭 : static{ } - 클래스변수의 복잡한 초기화에 사용
// 클래스변수의 복잡한 초기화에 사용되며 클래스가 로딩될 때 실행
* 멤버변수의 초기화 시기와 순서
- 클래스변수 초기화 시점 : 클래스가 처음 로딩될 때 단 한번 , 프로그램 시작
기본값 -> 명시적초기화 -> 클래스 초기화 블럭
- 인스턴스변수 초기화 시점 : 인스턴스가 생성될 때 마다 , 객체생성
기본값 -> 명시적초기화 -> 인스턴스초기화 블럭 -> 생성자
ex) 프레임 count++


