생성자
생성자는 객체 지향 프로그래밍에서 객체의 초기화를 담당하는 서브루틴을 담당합니다. 생성자는 객체가 처음 생성될 때 호출되어 멤버 변수를 초기화하고, 필요에 따라 자원을 할당하기도 합니다. 생성자는 프로그램의 시작 단계에서 어떠한 변수등을 초기화 시켜주는 역할을 함으로써 프로그램이 구동될 준비를 도와주게 됩니다.
인스턴스가 생성될 때마다 호출되는 인스턴스 초기화 메소드
인스턴스 변수의 초기화 또는 인스턴스 생성시 수행할 작업에 사용
몇가지 조건을 제외하고는 메소드와 유사하다.
모든 클래스에는 반드시 하나 이상의 생성자가 있어야 한다.
생성자 조건
메소드명이 클래스명과 동일하고 리턴 자료형이 없는 경우 이 메소드는 생성자라고 한다.
생성자의 이름은 클래스의 이름과 같아야 한다.
생성자는 리턴값이 없지만 void를 쓰지 않는다.
일반적인 생성자의 형태는 아래와 같다.
클래스이름(타입 변수명, 타입 변수명, ... ) {
// 인스턴스 생성시 수행될 코드
// 주로 인스턴스 변수의 초기화 코드를 적는다.
}
class Card {
.
.
.
Card() { // 매개변수가 없는 생성자.
// 인스턴스 초기화 작업
}
Card(String kind, int number) { // 매개변수가 있는 생성자
// 인스턴스 초기화 작업
}
.
.
.
}
기본 생성자
매개변수가 없는 생성자로 클래스에 생성자가 하나도 없으면 컴파일러가 기본 생성자를 추가한다. 하지만 생성자가 하나라도 있으면 컴파일러는 기본 생성자를 추가하지 않는다. 기본 생성자가 자동으로 추가되기 때문에 생성자를 정의하지 않고도 인스턴스를 생성할 수 있게 된다.
“모든 클래스에는 반드시
하나 이상의 생성자가 있어야 한다.”
매개변수 생성자
인스턴스를 생성한 후 인스턴스 변수의 값을 변경하는 것보다, 매개변수를 있는 생성자를 사용하는 것이 코드를 보다 간결하고 직관적으로 만든다.
class Car {
String color; //색상
String gear; //변속기 – auto(자동), manual(수동)
int door; //문의 개수
Car() { } //생성자
Car(String c, String g, String d) { //생성자
color = c;
gear = g;
door = d;
}
}
참조 This
다른 생성자 호출 this()
this() 는 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다. 다른 생성자 호출은 생성자의 첫 문장에서만 가능하다.
class Car {
String color;
String gear;
int door;
// Car() {
// color = "red";
// gear = "manual";
// door = 2;
// }
// ▼코드의 재사용성을 높힌 코드
Car() {
this("red", "manual", 4);
}
Car(String c, String g, int d) {
color = c;
gear = g;
door = d;
}
}
참조변수 this
this는 인스턴스 자신을 가리키는 참조변수로 인스턴스의 주소가 저장되어있다. 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다.
class Car {
String color;
String gear;
int door;
Car() {
this("red", "manual", 4);
}
// Car(String c, String g, int d) {
// color = c;
// gear = g;
// door = d;
// }
// ▼인스턴스변수와 지역변수를 구별하기 위해 참조변수 this사용
Car(String color, String gear, int door) {
this.color = color;
this.gear = gear;
this.door = door;
}
}
예제
-
Code
Constructor.javapublic class Constructor { int value= 7; public Constructor() { System.out.println("이것은 생성자입니다"); } public void test(){ ReceiveClass rc = new ReceiveClass(); rc.test(value); System.out.println(value); System.out.println("CallClass 에서 출력 " +rc.test1()); Mabang mm = rc.test2(); mm.num=9; mm.start(); float result=rc.sum(6, 7.3f); int result1=rc.sum(3, 4); float result2=rc.sum(6.6f, 99); System.out.println(result+" "+result1+" "+ result2); // System.out.println(rc.staticTest()); System.out.println(ReceiveClass.staticTest()); } } -
Code
ConstructorMain.javapublic class ConstructorMain { public static void main(String[] args) { Constructor ct= new Constructor(); ct.test(); } } -
Result