생성자
public Car() {} // 선언
...
Car car = new Car(); // 호출
- 생성자는 객체가 생성될 때 호출되며 객체를 초기화하는 역할을 수행합니다.
- 생성자는 반환 타입이 없고 이름은 클래스의 이름과 동일합니다.
- new 연산자에 의해 객체가 생성되면서 Car(); 즉, 생성자가 호출됩니다.
- 위와 같이 ()만 존재하는 경우를 기본 생성자라한다.
- 만약 생성자를 하나도 생성하지 않으면 컴파일러가 자동으로 기본 생성자를 자동으로 추가한다.
public class Car {
public Car(String model) {} // 생성자 선언
// 생성자가 한개 이상 선언되었기 때문에 기본 생성자를 추가하지 않음.
}
- 즉 이 경우는 컴파일러는 기본 생성자를 생성하지 않음 (public Car가 선언되어 있음으로)
public class Car {
public Car() {} // 컴파일러가 추가시켜줌
}
class Car { // 클래스가 public임으로 여기도 접근제어자는 없지만 public으로 기본 배치된다.
Car() {} // 컴파일러가 추가시켜줌
}
컴파일러에 의해 생성되는 기본 생성자는 해당 클래스의 접근 제어자(public, …)를 따른다.
필드 초기화
- 위의 기본 생성자처럼 생성자를 자동으로 추가하는 것이 아닌 프로그래머가 직접 지정하는 방식
- 인스턴스마다 동일한 데이터를 가지는 필드는 초기값을 대입하는 것이 좋다.
public Car(String modelName, String colorName, double priceValue) {
model = modelName;
color = colorName;
price = priceValue;
}
...
Car car = new Car(); // 오류 발생
더보기
한 개 이상의 생성자가 존재하기 때문에 컴파일러가 자동으로 기본 생성자를 추가해 주지 않기 때문에 기본 생성자가 존재하지 않아 오류가 발생합니다.
기본 생성자 | 필드 초기화 |
인스턴스마다 다른 값을 가져야 한다면 생성자를 통해서 필드를 초기화할 수 있습니다. 예를 들어 만들어지는 자동차마다 모델, 색상, 가격이 다르다면 생성자를 사용하여 필드의 값을 초기화하는 것이 좋습니다. = 계속 변경할거면 굳이 직접 정해줄 이유가 없으니 |
반대로 인스턴스마다 동일한 데이터를 가지는 필드는 초기값을 대입하는 것이 좋습니다. 예를 들어 자동차가 만들어질 때마다 기어의 상태를 ‘P’로 고정해야 한다면 초기값을 직접 대입하는 것이 좋습니다. = 변동이 없다면 미리 한번만 지정하면 되니 |
생성자 오버로딩
생성자를 통해 필드를 초기화할 때 오버로딩을 적용할 수 있다.
- 예를 들어 우리가 자동차를 생성할 때 모델, 색상, 가격이 다른 자동차를 여러 대 생성할 수도 있고 색상만 다른 자동차를 여러 대 생성할 수도 있기 때문에 오버로딩을 사용하면 이를 효율적으로 처리할 수 있다.
public Car(String modelName, String colorName, double priceValue)
public Car(String colorName, String modelName, double priceValue)
이거 될까 안될까?
더보기
- modelName과 colorName 매개변수의 위치가 다르기 때문에 가능할 것처럼 보이지만
- String, String, double : 매개변수의 개수, 타입, 순서가 동일하기 때문에 중복이 불가능합니다.
public class Car {
static final String COMPANY = "GENESIS"; // 자동차 회사 : GENESIS
String model; // 자동차 모델
String color; // 자동차 색상
double price; // 자동차 가격
double speed; // 자동차 속도 , km/h
char gear = 'P'; // 기어의 상태, P,R,N,D
boolean lights; // 자동차 조명의 상태
public Car(String modelName) {
model = modelName;
}
public Car(String modelName, String colorName) {
model = modelName;
color = colorName;
}
public Car(String modelName, String colorName, double priceValue) {
model = modelName;
color = colorName;
price = priceValue;
}
double gasPedal(double kmh, char type) {
changeGear(type);
speed = kmh;
return speed;
}
double brakePedal() {
speed = 0;
return speed;
}
char changeGear(char type) {
gear = type;
return gear;
}
boolean onOffLights() {
lights = !lights;
return lights;
}
void horn() {
System.out.println("빵빵");
}
}
public class Main {
public static void main(String[] args) {
// 기본 생성자 호출 오류 확인
// Car car1 = new Car(); // 오류 발생
// 생성자 오버로딩을 통해 여러 상황에서 자동차 생산
// 제네시스 자동차를 생산 : static final String COMPANY = "GENESIS"; 상수 고정
// 모든 자동차는 생산시 기어의 최초 상태 'P' 로 고정 : char gear = 'P'; 직접 대입하여 초기화
// GV60 모델만 기본으로 선택
Car car2 = new Car("GV60");
System.out.println("car2.model = " + car2.model);
System.out.println("car2.gear = " + car2.gear + "\n");
// GV70 모델, 색상 Blue 만 기본으로 선택
Car car3 = new Car("GV70", "Blue");
System.out.println("car3.model = " + car3.model);
System.out.println("car3.color = " + car3.color);
System.out.println("car3.gear = " + car3.gear + "\n");
// GV80 모델, 색상 Black, 가격 50000000 으로 완전하게 고정된 경우
Car car4 = new Car("GV80", "Black", 50000000);
System.out.println("car4.model = " + car4.model);
System.out.println("car4.color = " + car4.color);
System.out.println("car4.price = " + car4.price);
System.out.println("car4.gear = " + car4.gear + "\n");
}
}
'Back-End (Web) > JAVA' 카테고리의 다른 글
[JAVA] 접근 제어자 (1) | 2024.11.12 |
---|---|
[JAVA] This와 This() (0) | 2024.11.12 |
[JAVA] 인스턴스 멤버와 클래스 멤버 (0) | 2024.11.12 |
[JAVA] 객체의 필드와 메서드 (0) | 2024.11.12 |
[JAVA] 클래스 설계와 객체 생성 (0) | 2024.11.12 |