생성자(Constructor)는 new 연산자로 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당한다.
생성자를 실행하지 않고는 클래스로부터 객체를 만들 수 없다. new 연산자에 의해 생성자가 성공적으로 실행되면
힙(heap)영역에 객체가 생성되고 객체의 주소(번지)가 리턴된다.
1. 기본생성자
모든 클래스는 생성자가 반드시 존재하며, 생성자를 1개 이상을 가질 수 있다. 코드 작성시 클래스내부에 생성자 선언을 생략하였다면 컴파일러는 다음과 같이 블록 내용이 비어있는 기본생성자를 바이트 코드에 자동으로 추가한다.
public class Car{
}
↓ 컴파일
public class Car{
public Car() {} // 자동추가
}
그렇기에 클래스에 생성자를 선언하지 않아도 기본생성자를 통해 객체를 생성할 수 있다.
하지만 클래스에 명시적으로 선언한 생성자가 1개라도 있으면 컴파일러는 기본생성자를 추가하지 않는다.
2. 필드 초기화
클래스로부터 객체가 생성될 때 필드는 기본 초기값으로 자동 설정된다.
다만 다른값으로 초기화를 하고 싶으면 2가지 방법이 존재한다.
(1) 클래스의 필드를 선언할 때 초기화를 해주기
public class Car {
//필드
String company= "KIA";
String model;
String color;
int maxspeed;
int speed;
}
위 코드에서보이는 것처럼 company라는 필드는 KIA라는 값으로 초기화가되어있다.
이렇게 필드 선언시 초기화를 해주면 이 Car 클래스로 부터 생성되는 모든 객체들의 Company 필드값은 KIA가 된다.
그렇기 때문에 객체 생성 시점에서 외부에서 제공되는 다양한 값들로 초기화가 되어야 한다면 생성자로 초기화를 해주어야한다.
(2) 생성자로 초기화해주기
생성자의 매개변수명과 필드명은 비슷하거나 동일한 것을 사용하는 것이 좋으며 통상적으로 필드명과 생성자의 매개변수명을 동일한 이름을 갖게 한다.
그러나 이럴 경우 매개변수의 사용 우선순위가 높기 때문에 생성자 내부에서 해당 필드에 접근할 수 없게 되는데 이를 해결하기 위해서 'this'를 사용한다. this는 객체 자신의 참조한다는 의미이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public class Car {
//필드
String company= "KIA";
String model;
String color;
int maxspeed;
int speed;
//생성자
Car(String model, String color, int maxspeed, int speed) {
this.company = company;
this.model = model;
this.color = color;
this.maxspeed = maxspeed;
this.speed = speed;
}
}
|
cs |
3. 생성자 오버로딩
객체를 생성자를 통해 초기화 할 때, 필드가 여러개라면 1개만 초기화할수도 있고 2개만 초기화할 수도있다. 원하는 만큼 다양하게 초기화할 수 있도록 생성자도 여러개를 선언하여 다양한 방법으로 객체를 초기화할 수 있도록 하는 것을
생성자 오버로딩이라한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
public class Car {
//필드
String company= "KIA";
String model;
String color;
int maxspeed;
int speed;
//생성자
Car(){
}
Car(String model){
this(model, "");
}
Car(String model, String color){
this(model, color, 0);
}
Car(String model, String color, int maxspeed){
this(model, color, maxspeed, 0);
}
Car(String model, String color, int maxspeed, int speed) {
this.company = company;
this.model = model;
this.color = color;
this.maxspeed = maxspeed;
this.speed = speed;
}
|
cs |
위 Car 클래스에서 생성자 오버로딩을 해준다음
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public class Car_example {
public static void main(String[] args) {
int a= 10;
Car mycar = new Car("K7", "Black", 220, 60);
Car mycar2 = new Car();
Car mycar3 = new Car("k5");
Car mycar4 = new Car("K3", "White");
System.out.println(mycar.company+","+mycar.model+","+mycar.color+","+mycar.maxspeed+","+mycar.speed);
System.out.println(mycar2.company+","+mycar2.model+","+mycar2.color+","+mycar2.maxspeed+","+mycar2.speed);
System.out.println(mycar3.company+","+mycar3.model+","+mycar3.color+","+mycar3.maxspeed+","+mycar3.speed);
System.out.println(mycar4.company+","+mycar4.model+","+mycar4.color+","+mycar4.maxspeed+","+mycar4.speed);
}
}
|
cs |
객체를 생성해서 출력해보면 다음과 같이 출력되는 것을 확인 할 수 있다.
Company 필드 같은 경우는 필드를 선언할 때 초기화를 해주었기 때문에 모든 객체의 company필드 값은 KIA이다.
mycar2 객체는 매개변수가 없는 생성자를 통해 생성되므로 첫번째 생성자를 통해 초기화된것이다..
mycar3 객체는 모델명만 초기화해주었으므로 2번째 생성자에 의해서 된 것이다.
'Java' 카테고리의 다른 글
[프로그래머스] - 약수의 합 (java) (0) | 2020.09.18 |
---|---|
[Java] - 메소드 오버로딩 (0) | 2020.09.18 |
[프로그래머스] - 스코빌지수 -java (0) | 2020.09.17 |
[Java] - Main 함수의 매개변수 입력방법 (0) | 2020.09.15 |
[Java] - 향상된 For문 (0) | 2020.09.15 |