1. 생성자
생성자는
인스턴스(객체)가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다.
따라서 인스턴스 변수의 초기화 작업에 주로 사용되며, 인스턴스 생성 시에 실행되어야 하는 작업을 위해서도 사용된다.
1) 클래스 내에 선언되며 메서드와 유사한 구조이지만, 리턴값이 없다.(그렇다고 따로 void를 작성하지도 않는다.)
2) 생성자의 이름은 클래스의 이름과 같아야 한다.
3)생성자는 리턴 값이 없다.
4) 모든 클래스는 반드시 생성자를 가져야 한다.
c card= new card();
//사실 생성자를 만들지 않은경우 자동으로 기본생성자를 생성해주어 우리가 몰랐지만
//인스턴스 생성시 우리는 생성자를 통해 초기화+객체생성+참조변수에 연결 해준다.
cf. 초기화란, 변수를 선언하고 처음으로 값을 저장하는 것을 '변수의 초기화'라고 한다.
따라서 매개변수가 있는 생성자를 통해서 우리가 인스턴스 생성과 동시에 우리가 원하는 값을 초기화 할 수 있도록 한다.
예시
verEx1 에는 정의되어 있는 생성자가 하나도 없으므로 컴파일러가 기본 생성자를 추가해주었지만, VerEx3에는 이미 생성자 VerEx3(int x) 가 정의되어 있으므로 기본 생성자가 추가되지 않았기 때문이다.
컴파일러가 자동적으로 기본 생성자를 추가해주는 경우는 '클래스 내에 생성자가 하나도 없을 때 ' 뿐이라는 것을 명심해야 한다.
2. 매개변수가 있는 생성자
public class Car {
String colr; //색상
String gearType; //변속시 종류 -auto(자동),manual(수동)
int door;
Car(){} // 기본생성자 반드시 클래스랑 이름 같아야 했고,
Car(String c, String g,int d){ //생성자(매개변수가 있는) 이것이 생성자의 이유이기도함: 초기화하는 것이니까
colr=c;
gearType=g;
door=d;
}
}
(1)번 보다 (2) 비교했을때, 양쪽 모두 같은 내용이지만, (2)의 코드가 더 간결하고 직관적이다.
이처럼 클래스를 작성할 때 다양한 생성자를 제공함을써 인스턴스 생성 후에 별도로 초기화를 하지 않아도 되게 하는 것이 바람직하다.
(1)
Car c = new Car();
c.color="white";
c.gearType="auto";
c.door=4;
(2) Car c = new Car("white","auto",4);
3. 생성자에서 다른 생성자 호출하기 - this()
같은 클래스의 멤버들 간의 서로 호출 할 수 있는 것처럼 생성자 간에도 서로 호출이 가능하다.
조건
-생성자의 이름으로 클래스이름(x) , this 를 사용한다.
-한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
생성자를 만들때, 코드의 중복을 제거하기 위해서, 간편하게 관리하고 사용하기 위해서 생성자끼리 호출한다.
변경 전
변경 후 -> 코드의 중복을 제거해서 더 좋은 코드라고 볼 수 있다.
Cf. 4. 객체 자신을 가리키는 참조변수 - this
지역변수(lv)와 인스턴스 변수(iv)를 구별할 때 사용한다.
- 인스턴스 자신을 가르키는 참조변수
- 인스턴스 메서드(생성자 포함)에서 사용가능
this 가 없으면 가까운쪽으로 인식해서 모두가 lv(지역변수)로 인식하여 구별할 수 없게 된다.
왼쪽은 지역변수와 인스턴스변수가 다르기때문에 (this)가 생략가능하다.
오른쪽은 지역변수와 인스턴스 변수가 같기 떄문에 (this)를 생략할 수 없다.
비교!
static은 인스턴스 멤버가 사용불가하다. 왜냐하면, 인스턴스 생성이 안될 시에도 static은 존재하는데, 인스턴스 멤버가 사용된다면, 인스턴스 멤버가 없을떄, static도 존재할 수 없는 아이러니한 상황이 발생하기 때문이다.
정리
this : 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다. / 모든 인스턴스메서드에 지역변수로 숨겨진 채로 존재한다.(선언하지 않아도 사용가능)
this(), this(매개변수) 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.
'자바를 잡아라' 카테고리의 다른 글
[JAVA] chapter 3 연산자 (0) | 2023.08.08 |
---|---|
[JAVA] chapter2 변수 (0) | 2023.08.07 |
[JAVA][객체2] 상속/포함관계 (0) | 2023.07.05 |
[JAVA] 변수의 초기화 (0) | 2023.07.05 |
[JAVA] 메서드 오버로딩(overloading) (0) | 2023.07.04 |