new 연산자로 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당한다.
여기서 말하는 객체 초기화라는 것은 메소드를 호출해서 객체를 사용할 준비를 하는 것 을 말한다.
new 연산자에 의해 생성자가 실행되면 힙 영역에 객체가 생성되고 객체의 번지가 리턴된다.
리턴된 객체의 번지는 클래스 변수에 저장된다.
만약 에러가 발생하면 객체는 생성되지 않는다.
모든 클래스는 생성자가 반드시 존재하며, 하나 이상 가질 수 있다.
항상 자주 보던 public class 예의 형태이다.
이전에 직접 해보았던 예제를 참고하자(아래 사진)
기존에 항상 만들던 코드들을 예시로 들자면
Car myCar = new Car();
에서 뒤에 붙은 Car()
가 기본 생성자를 호출해서 객체를 만든다는 의미이다.
기본 생성자 대신 우리가 생성자를 명시적으로 선언하기 위해서는 다음과 같은 형태로 작성한다.
생성자는 메소드와 비슷한 모양이나, 리턴 타입이 없고 클래스 이름과 동일하다.
생성자 블록 내부에는 객체 초기화 코드가 작성된다.
매개 변수 선언은 생략도 여러개 선언도 가능하다.
매개 변수는 new 연산자로 생성자를 호출할 때 외부의 값을 생성자 블록 내부로 전달하는 역할을 한다.
Car myCar = new Car("그랜저", "핫핑크", 300);
위 상황에서는 2개의 매개값은 String 타입이고 마지막 매개값은 int 타입이다.
위 3개의 매개값을 생성자가 받기 위해서는 다음과 같이 매개 변수를 선언해야 한다.
public class Car {
Car(String model, String color, int maxSpeed) { ... }
}
알고리즘 문제 푸는시간에 자주 보았던 것이 떠오른다.
위 사진의 경우 매개변수가 int 타입 배열이다.
클래스에 생성자가 명시적으로 선언되어 있을 경우에는 반드시 선언된생성자를 호출해서 객체를 생성해야 한다.
아래처럼 직접 해 보았다.
클래스에 생성자를 명시적으로 선언했을 경우에는 main 에서 호출이 불가능하다고 빨간줄과 에러가 뜨는것을 볼 수 있다.
하지만 마지막 사진처럼 선언한것과 같은 타입으로 매개변수를 전달해주면 정상적으로 호출이 되는것을 볼 수 있다.
클래스로부터 객체가 생성될 때 필드는 초기값으로 자동 설정된다. 하지만 초기값을 다르게 주고 싶다면...
필드를 선언할 때 초기값을 주거나, 생성자에서 초기값을 주는 방법이 있다.
아래의 예제를 통해 알아보자 !!
위처럼 했을 때 k1
과 k2
객체의 nation 필드에는 모두 "대한민국"
이 저장되어 있다.
객체 생성 순간 외부에서 제공되는 다양한 값들로 초기화 하려면 생성자에서 초기화를 해야 한다.
위의 name 과 ssn(주민번호) 필드값은 클래스 작성할 때 초기값을 줄 수 없다.
따라서 생성자의 매개값으로 이 값을 초기화 하는 것이다.
위 처럼 진행하면 된다.
위 사진에도 보이지만 매개 변수 n을 통해서 이름이 전달되고 s를 통해서 주민번호가 전달되는 형식이다.
이 값들이 각각 name 필드와 ssn 필드의 초기값으로 사용되는 것이다.
아래 처럼 진행하면 생성자 필드에서 초기화 하는것이 된다.
객체 생성 후 필드값 출력
매개변수의 이름은 너무 짧으면 가독성이 좋지 않기 때문에 통상적으로 필드와 동일한 이름을 갖는 매개 변수를 사용한다.
지금 같은 경우에는 필드와 매개 변수 이름이 동일하기 때문에 생성자 내부에서 해당 필드에 접근할 수 없다.
이유는 동일한 이름의 매개 변수가 사용 우선순위가 높기 때문이다.
이럴 때는 필드 앞에 this 를 붙이면 된다. 이는 객체 자신의 참조이며 객체 자신을 this 라고 한다.
this 를 이용하여 Korean 생성자를 수정하면 다음과 같다.
외부에서 제공되는 다양한 데이터들을 이용해서 객체를 초기화하려면 생성자도 다양해야 한다.
특징으로는 기본 생성자를 제공하지 않으며 매개 변수를 달리하는 생성자를 여러 개 선언하는 것을 말한다.
더 쉽게 말하자면 생성자를 두 개 이상 구현하는 경우를 말한다.
위 사진 같은 경우가 오버로딩의 예시라고 보면 된다.
위 사진의 경우는 오버로딩이 아니다.
이번에는 실제 직접 생성자의 오버로딩을 해보자
생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드가 발생할 수 있다.
필드 초기화 내용은 한 생성자에만 집중적으로 작성하고, 나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출하는 방법으로 할 수 있다.
생성자에서 다른 생성자를 호출할 때 사용 !!
아래는 다른 생성자를 호출해서 중복 코드를 줄이는 방법이다.
이후 객체 생성시 생성자를 선택해줄 때는 이렇게 하면 된다.
위 처럼 입력하고 나면 결과를 볼 수 있다.
기본 생성자 : 클래스 선언 시 컴파일러에 의해 자동으로 추가되는 생성자 이다.
생성자 선언 : 클래스로부터 객체를 생성할 때 호출되는 생성자를 명시적으로 선언할 수 있다. 생성자를 선언하면 기본 생성자는 생성되지 않는다.
매개 변수 : 생성자 호출 시 값을 전달받기 위해 선언되는 변수
객체 초기화 : 객체를 사용하기 전에 준비하는 과정으로 필드를 선언할 때 초기화되거나 생성자 내부에서 필드값을 초기화할 수 있으며, 메소드를 호출하는 내용으로 구성된다.
오버로딩 : 매개 변수를 달리하는 생성자를 여러 개 선언하는 것을 말한다.
this() : 객체 자신의 또 다른 생성자를 호출할 때 사용한다.