Day13-4. 230516
생성자
생성자란?
new 연산자에 의해 호출되어 객체의 초기화 담당
객체 초기화란?
필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비를 하는 것.
생성자를 실행하지 않고는 클래스로부터 객채를 만들 수 없음.
기본 생성자
- 모든 클래스는 생성자가 반드시 존재. 하나 이상 가질 수 있음.
- 생성자 선언을 생략하면 컴파일러는 중괄호{} 블록 내용이 비어 있는 기본 생성자 추가.
[public] 클래스() { }
- 클래스가 public class로 선언되면 기본 생성자도 public이 붙지만,
클래스가 public class 없이 class로만 선언되면 기본 생성자도 public이 붙지 않음.
- Car 클래스를 설계할 때 생성자를 생략하면 기본 생성자가 자동 생성.
- 클래스에서 생성자를 선언하지 않아도 Car()인 기본 생성자를 호출해서 객체를 생성할 수 있음.
생성자 선언
생성자를 명시적으로 선언하려면 다음과 같은 형태로 작성
//생성자 블록
클래스(매개변수선언,... ){
//객체의 초기화 코드
}
Car 생성자를 호출할 때 3개의 매개값 제공한다면
Car mycar = new Car("그랜저","검정",300);
세 매개값을 생성자가 받기 위해 다음과 같이 매개 변수 선언
public class Car{
//생성자
Car(String model, String color, int maxSpeed) {...}
}
필드 초기화
- 클래스로부터 객체가 생성될 때 필드는 기본 초기값으로 자동 설정됨.
- 다른 값으로 초기화하기 위해
1) 필드를 선언할 때 초기값을 주는 방법
-> 동일한 클래스로부터 생성되는 객체들은 객체 생성 시 모두 같은 값을 갖게 됨.
public class Korean{
String nation = "대한민국";
}
-> Korean 클래스에 nation 필드를 선언하며 "대한민국"으로 초기값 준 경우
Korean k1 = new Korean()
Korean k2 = new Korean()
-> k1, k2 객체의 nation 필드에는 모두 "대한민국"이 저장되어 있음.
2) 생성자에 초기값을 주는 방법
public class Korean{
//필드
String name;
String ssn;
//생성자
public Korean(String n, String s){
name = n;
ssn = s;
}
}
Korean k1 = new Korean("박자바", "00000-0000000")
Korean k2 = new Korean("김자바", "111111-1111111")
-> 아래코드에서 매개 변수 값 전달되고 name필드와 ssn필드에 초기값으로 사용됨.
- 매개 변수와 필드명이 같은 경우 this 사용
public Korean(String n, String s){
this.name = name;
this.ssn = ssn;
}
this는 객체 자신의 참조로 객체가 객체 자신을 this라고 함.
'this.필드'는 this라는 참조 변수로 필드를 사용하는 것과 동일.
생성자 오버로딩
- 매개변수를 달리하는 생성자를 여러 개 선언하는 것.
-> 다양한 방법으로 객체를 생성하기 위해 사용
- 생성자 오버로딩 시 주의할 점은 매개 변수 타입과 개수, 선언된 순서가 똑같을 경우 매개변수 이름만 바꾸는 것은 생성자 오버로딩이 아니다.
Car(String model, String color){....}
Car(String color, String model){....} //오버로딩 아님.
- Car클래스에서 생성자 오버로딩한 예
public class Car{
Car(){...}
Car(String model){...}
Car(String model, String color){....}
}
- Car객체 생성
Car car1 = new Car();
Car car1 = new Car("그랜저");
Car car1 = new Car("그랜저","흰색");
Car06 클래스>
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
package chap0607;
import java.util.Date;
public class Car06 {
//field
private String company;
private int price;
private char grade; //에너지등급 예)'A','B'
private boolean isHybrid; //하이브리드유뮤 예)true,false
private Date productionDay; //생산일
//constructor
//생성자 오버로딩
public Car06_p232() {}
public Car06_p232(String company,int price) {
this.company=company;
this.price=price;
}
public Car06_p232(String company) {
this.company=company;
}
public Car06_p232(int price) {
this.price=price;
}
//method
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public char getGrade() {
return grade;
}
public void setGrade(char grade) {
this.grade = grade;
}
public boolean isHybrid() {
return isHybrid;
}
public void setHybrid(boolean isHybrid) {
this.isHybrid = isHybrid;
}
public Date getProductionDay() {
return productionDay;
}
public void setProductionDay(Date productionDay) {
this.productionDay = productionDay;
}
}
|
cs |
Car06Main 클래스>
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
|
package chap0607;
public class Car06Main {
public static void main(String[] args) {
//Car06클래스의 매우좋은회사에서 생산한 판매가격이 5000인 파라미터가 1개인 생성자를 호출하여 객체생성
Car06_p232 myCar3 = new Car06_p232("매우좋은회사",5000);
System.out.println(myCar3.getCompany());
System.out.println(myCar3.getPrice());
System.out.println("--------");
System.out.println();
//Car06클래스의 int타입 파라미터가 1개인 생성자를 호출하여 객체생성
Car06_p232 myCar2 = new Car06_p232(3000);
System.out.println(myCar2.getPrice());
System.out.println("--------");
System.out.println();
//Car06클래스의 String파라미터가 1개인 생성자를 호출하여 객체생성
Car06_p232 myCar1 = new Car06_p232("좋은회사");
System.out.println(myCar1.getCompany());
System.out.println("--------");
System.out.println();
//Car06클래스의 기본생성자를 호출하여 객체생성
Car06_p232 myCar = new Car06_p232();
System.out.println(myCar.getCompany());
System.out.println(myCar.getPrice());
System.out.println(myCar.getGrade());
System.out.println(myCar.isHybrid());
System.out.println(myCar.getProductionDay());
}
}
|
cs |
* 실행 결과
매우좋은회사
5000
--------
3000
--------
좋은회사
--------
null
0
'개발 수업 > JAVA' 카테고리의 다른 글
[Java] 상속/부모 생성자 호출 super() (0) | 2023.05.17 |
---|---|
[Java] 클래스/this() (0) | 2023.05.17 |
[Java] 클래스/접근제한자 (0) | 2023.05.16 |
[Java] final,상수(static final) (0) | 2023.05.16 |
[Java] 상속(inheritance)/클래스 상속 (0) | 2023.05.16 |