Search

생성자

생성자 (Constructor)

인스턴스가 생성될 떄 호출되는 인스턴스 초기화 메소드
주로 인스턴스 변수의 초기화 작업에 사용
인스턴스 생성 시 실행되어야 할 작업을 위해서도 사용
메소드처럼 클래스 내에 선언, 리턴값은 X

생성자의 조건

1.
생성자 이름은 클래스 이름과 동일
2.
리턴 값 X

생성자의 정의

클래스이름 (타입 변수명, 타입 변수명, ... ) { // 인스턴스 생성 시 수행될 코드, // 주로 인스턴스 변수의 초기화 코드를 적음. } class Card { Card() { // 매개변수가 없는 생성자 ... } Card(String k, int num) { // 매개변수가 있는 생성자 ... } ... }
Java
생성자가 인스턴스를 생성하는 것은 아님! → 연산자 new가 인스턴스를 생성하는 것
생성자는 단순히 인스턴스 변수들의 초기화에 사용되는 조금 특별한 메소드일 뿐
Card c = new Card();
1.
연산자 new에 의해서 메모리(heap)에 Card 클래스의 인스턴스가 생성
2.
생성자 Card()가 호출되어 수행됨.
3.
연산자 new의 결과로, 생성된 Card 인스턴스의 주소가 반환되어 참조변수 c에 저장됨.

기본 생성자 (Default Constructor)

모든 클래스에 반드시 하나 이상의 생성자가 정의되어 있어야 함에도, 지금까지 클래스에 생성자를 정의하지 않고도 인스턴스를 생성할 수 있었던 이유?
→ 컴파일러가 제공하는 기본 생성자 덕택
소스파일(.java)에 생성자가 없더라도, 컴파일러가 자동적으로 기본 생성자를 추가하여 컴파일
// 매개변수도 없고 아무런 내용도 없는 기본 생성자 클래스이름() { } Card() { }
Java
특별히 인스턴스 초기화 작업이 필요없다면, 컴파일러가 제공하는 기본 생성자를 이용해도 굿
컴파일러는 클래스에 정의되어 있는 생성자가 하나도 없을 때만 기본 생성자를 추가
ConstructorTest.java

매개변수가 있는 생성자

생성자도 메소드처럼 매개변수를 선언하여 호출 시 값을 넘겨받아 인스턴스 초기화 작업에 사용 가능
자동차 클래스
class Car { String color; // 색상 String gearType; // 변속기 종류 int door; // 문 개수 Car() {} // 생성자 Car(String c, String g, int d) { // 생성자 color = c; gearType = g; door = d; } } // 매개변수 없는 생성자를 사용할 경우 Car c = new Car(); c.color = "white"; c.gearType = "auto"; c.door = 4; // 매개변수 있는 생성자를 사용할 경우 Car c = new Car("white", "auto", 4);
Java
CarTest.java

생성자에서 다른 생성자 호출 - this(), this

같은 클래스의 멤버들 간 서로 호출이 가능한 것처럼, 생성자 간에도 서로 호출 가능
this : 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있음. 모든 인스턴스 메소드에 지역변수로 숨겨진 채 존재
this(), this(매개변수) : 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용

다른 생성자의 호출 조건

1.
생성자 이름으로 클래스이름 대신 this 사용
2.
한 생성자에서 다른 생성자 호출 시, 반드시 첫 줄에서만 호출 가능
3.
인스턴스 메소드에서만 사용 가능(클래스 메소드에선 사용불가)
Car(String color) { door = 5; //에러 Car(color, "auto", 4); // 생성자의 두번쨰 줄에서 다른 생성자 호출 & this 사용 X }
Java
CarTest2.java

생성자를 이용한 인스턴스의 복사

생성자를 이용하여 현재 사용 중인 인스턴스와 같은 상태의 인스턴스 추가 가능
Car(Car c) { // Car 클래스의 참조변수를 매개변수로 선언한 생성자 // 매개변수로 넘겨진 참조변수가 가리키는 Car 인스턴스의 인스턴수변수를 자신에 복사 color = c.color; gearType = c.gearType; door = c.door; }
Java
CarTest3.java

인스턴스 생성 시, 다음을 꼭 고려하자.

1. 클래스 - 어떤 클래스의 인스턴스를 생성할 것인가?

2. 생성자 - 선택한 클래스의 어떤 생성자로 인스턴스를 생성할 것인가?

참고 자료