생성자

김나영·2023년 6월 14일
0

Java 문법 종합반

목록 보기
15/21

생성자

  • 객체가 생성될 때 호출되며 객체를 초기화하는 역할을 수행

  • 반환 타입이 없고 이름은 클래스의 이름과 동일

public Car() {}
  • 생성자 선언
Car car = new Car();
  • new 연산자에 의해 객체 생성

  • 생성자 호출

기본 생성자

  • 선언할 때 괄호() 안에 아무것도 넣지 않는 생성자

  • 모든 클래스는 반드시 생성자가 하나 이상 존재

  • 컴파일러가 기본 생성자를 바이트코드 파일에 자동으로 추가 시켜줬다면 생략 가능

  • 생성자가 단 하나라도 선언되어있다면 컴파일러는 기본 생성자를 추가하지 않음

public class Car {
		public Car(String model) {} // 생성자 선언
}
  • 생성자가 한개 이상 선언되었기 때문에 기본 생성자를 추가하지 않음.
public class Car {
		public Car() {} // 컴파일러가 추가시켜줌
}
class Car {
		Car() {} // 컴파일러가 추가시켜줌
}

필드의 초기화

  • 객체를 만들 때 인스턴스마다 다른 값을 가져야 한다면 생성자를 통해서 필드 초기화 가능

  • ex)

    • 만들어지는 자동차 마다 모델, 색상, 가격이 다르다면 생성자를 사용하여 필드의 값을 초기화 하는 것이 좋음
  • 인스턴스마다 동일한 데이터를 가지는 필드는 초기값을 대입하는 것이 좋음

  • ex)

    • 자동차가 만들어질 때마다 기어의 상태를 ‘P’ 로 고정해야 한다면 초기값을 직접 대입하는 것이 좋음
  • ‼️ 주의 !!

    • 생성자를 통해 필드 값을 초기화 하고 기본 생성자를 작성하지 않았는데 기본 생성자를 호출한다면???
public Car(String modelName, String colorName, double priceValue) {
 model = modelName;
 color = colorName;
 price = priceValue;
}
...
Car car = new Car(); // 오류 발생
  • 1개 이상의 생성자가 존재하기 때문에 컴파일러가 자동으로 기본 생성자를 추가해주지 않음

  • 기본 생성자가 존재하지 않으므로 Error 발생

생성자 오버로딩

  • 생성자를 통해 필드를 초기화 할 때 적용 가능

  • ex)

    • 우리가 자동차를 생성할 때 모델, 색상, 가격이 다른 자동차를 여러대 생성할 수도 있고 색상만 다른 자동차를 여러대 생성할 수도 있기 때문에 오버로딩을 사용하면 이를 효율적으로 처리할 수 있음
  • ‼️ 주의 !!

    • 오버로딩을 할 때 개수, 타입, 순서가 동일한데 매개 변수명만 다르게 하는 경우에는???
    • Error 발생!!
public Car(String modelName, String colorName, double priceValue)
public Car(String colorName, String modelName, double priceValue)
  • modelName과 colorName 매개변수의 위치가 다르기 때문에 가능할 것처럼 보이지만 String, String, double : 매개변수의 개수, 타입, 순서가 동일하기 때문에 중복이 불가능
char gear = 'P';
    // (1) constructor : 오버로딩(똑같은 매개변수르 사용하면서 매개 변수에 따라 완벽하게 다른 기능을 수행)
    public Car(String modelName) {
        model = modelName;
        System.out.println("첫 번째 생성자가 호출되었습니다.");
    }
    // (2)
    public Car(String modelName, String colorName) {
        model = modelName;
        color = colorName;
        System.out.println("두 번째 생성자가 호출되었습니다.");
    }
    // (3)
    public Car(String modelName, String colorName, double priceValue) {
        model = modelName;
        color = colorName;
        price = priceValue;
        System.out.println("세 번째 생성자가 호출되었습니다.");
    }
package week03.constructor;
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); // 문자 문자 double형
        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");
    }
}
  • 첫 번째 생성자 : car2 => String modelName을 받기 때문에

  • 두 번째 생성자 : car3 => String modelName, String colorName을 받기 때문에

  • 세 번째 생성자 : car4 => String modelName, String colorName, double priceValue을 받기 때문에

  • gear는 모두 'P'로 고정이 되고 modelName, color, price만 지정해준 값으로 변경됨

0개의 댓글