Back-End (Web)/JAVA

[JAVA] 생성자

JABHACK 2024. 11. 12. 12:58

생성자

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