8월 16일 TIL(항해 3일차)

코코·2023년 8월 16일
0

TIL(Today I Learned)

목록 보기
5/19
post-thumbnail

1. 생성자

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

public Car() {} // 선언

...

Car car = new Car(); // 호출
  • 생성자는 반환 타입이 없고 이름은 클래스의 이름과 동일.
  • new 연산자에 의해 객체가 생성되면서 Car(); 즉, 생성자가 호출된다.

(1) 기본 생성자

기본 생성자는 선언할 때 괄호( ) 안에 아무것도 넣지않는 생성자를 의미한다.

  • 모든 클래스는 반드시 생성자가 하나 이상 존재한다.
  • 만약 클래스에 생성자를 하나도 선언하지 않았다면 컴파일러는 기본 생성자를 바이트코드 파일에 자동으로 추가시켜준다. 따라서 이러한 경우는 기본 생성자 생략이 가능하다.
  • 반대로 단 하나라도 생성자가 선언되어있다면 컴파일러는 기본 생성자를 추가하지 않는다.
public class Car {
		public Car(String model) {} // 생성자 선언
		// 생성자가 한 개 이상 선언되었기 때문에 기본 생성자를 추가하지 않음.
}
  • 컴파일러에 의해 생성되는 기본 생성자는 해당 클래스의 접근 제어자(public, …)를 따릅니다.
public class Car {
		public Car() {} // 컴파일러가 추가시켜주었다.
}

class Car {
		Car() {} // 컴파일러가 추가시켜주었다.
}

(2) 필드 초기화

생성자는 객체를 초기화하는 역할을 수행한다.

  • 객체를 만들때 인스턴스마다 다른 값을 가져야 한다면 생성자를 통해서 필드를 초기화 할 수 있다.
    ex) 자동차마다 모델, 색상, 가격이 다르다면 생성자를 생성하여 필드값을 초기화 시키는게 낫다.

  • 반대로 인스턴스마다 동일한 데이터를 가지는 필드는 초기값을 대입하는 것이 좋다.
    ex) 자동차가 만들어질 때마다 기어의 상태를 'P'로 고정해야 한다면 초기값을 직접 대입하는 것이 낫다.

단, 주의할 점!

  • 생성자를 통해 필드값을 초기화하고 기본 생성자를 작성하지 않았는데 기본 생성자를 호출한다면?
public Car(String modelName, String colorName, double priceValue) {
    model = modelName;
    color = colorName;
    price = priceValue;
}

...

Car car = new Car(); // 오류 발생
  • 위처럼 한 개 이상의 생성자가 존재하지 않을 경우 컴파일러가 자동으로 기본 생성자를 추가해주지 않는다. 기본 생성자가 존재하지 않아 오류가 발생한다.

(3) 생성자 this()

  • 생성자에서 다른 생성자 호출할 때 사용한다.

  • 생성자의 첫 줄에서만 사용 가능하다.

  • 코드의 중복을 제거할 수 있다.

    class Car2 {
        String color; // 색상
        String gearType; // 변속기 종류 - auto(자동), manual(수동)
        int door; // 문의 갯수

        //<1>
        Car2() {
            this("white", "auto", 4);
        }

        //<2>
        Car2(String color) {
            this(color, "auto", 4);
        }

        //<3>
        Car2(String color, String gearType, int door) {
            this.color = color;
            this.gearType = gearType;
            this.door = door;
        }
    }

<1>과 <2> 메서드는 <3> Car2(String color, String gearType, int door) 를 호출

profile
Just Do It

0개의 댓글