class Card {
...
Card() { // 매개변수가 없는 생성자.
// 인스턴스 초기화 작업
}
Card(String kind, int number) { // 매개변수가 있는 생성자
// 인스턴스 초기화 작업
}
클래스를 설계할 때 생성자를 생략하면 기본 생성자가 생성된다. 즉
public class Car{
}
와 같이 생성자를 선언하지 않아도
public class Car{
pulic Car(){}
}
처럼 기본 생성자 Car()가 생성된다.
우리가 명시적으로 생성자를 선언하려면 다음과 같은 형태로 작성한다.
클래스(매개변수 선언..){
//객체의 초기화 코드
}
그런데 생성자가 하나라도 존재하는 경우에는 기본 생성자가 삽입되지 않는다.
위 코드에서는 컴파일 에러가 발생한다.
Data_2 클래스의 인스턴스를 생성할 때 생성자 Data_2(int x)를 사용하거나 Data_2클래스에 생성자 Data_2()를 추가로 정의하면 된다.
매개변수는 생략해도 되고 여러개를 선언해도 된다. 매개변수는 new 연산자로 생성자를 호출할 때 외부 값을 생성자 내부로 전달하는 역할을 한다.
Car mycar = new Car("그랜저","블랙",300);
과 같이 Car생성자를 호출하려면 다음과 같이 선언한다.
public class Car{
//생성자
Car(String model, String color, int speed){
...
}
}
예제를 보자.
class Car {
Car(String color, int cc) { //생성자를 선언함
}
}
public class CarExample{
public static void main(String[] args) {
Car mycar = new Car("블랙",3000);
//Car mycar = new Car(); 클래스에 생성자를 선언했기 때문에 기본 생성자를 호출할 수 없음.
System.out.println(mycar);
}
}
class Car {
String color;
String gearType;
int door;
Car() {
} //기본 생성자
Car(String c, String g, int d) {
color = c;
gearType = g;
door = d;
}
}
class CarExample {
public static void main(String[] args) {
Car c1 = new Car("white", "auto", 4);
System.out.println(c1.color + c1.gearType + c1.door);
}
}
public class Korean{
String nation = "대한민국";
String name;
String ssn;
}
다음과 같이 객체를 생성하면 k1,k2객체의 nation필드에는 모두 대한민국이 저장되어 있다.
Korean k1 = new Korean();
Korean k2 = new Korean();
public Korean(String n, String s) {
name=n;
ssn=s;
즉,
class Korean{
String nation = "대한민국";
String name;
String ssn;
//생성자
public Korean(String n, String s) {
name=n;
ssn=s;
}
}
public class KoreanExample {
public static void main(String[] args) {
Korean son = new Korean("손은미", "990413");
System.out.println(son.name + "의 주민번호 앞자리는 " + son.ssn);
Korean jung = new Korean("정철균","990413");
System.out.println(jung.name + "의 주민번호 앞자리는 " + jung.ssn);
}
}
자바에서는 매개변수의 이름을 멤버 변수와 같은 이름으로 붙이는 경우가 많은데, 이 때는 참조변수 this를 사용하면 좋다.
위의 경우 Korean생성자의 매개변수 이름을 n,s로 사용했다.
그런데 필드의 인스턴스 변수와 매개변수의 이름이 동일할 때 this를 이용하여 다음과 같이 수정할 수 있다.
class Korean{
String nation = "대한민국";
String name;
String ssn;
//생성자
public Korean(String name, String ssn) {
this.name = name;
this.ssn = ssn;
}
}
public class KoreanExample {
public static void main(String[] args) {
Korean son = new Korean("손은미", "990413");
System.out.println(son.name + "의 주민번호 앞자리는 " + son.ssn);
Korean jung = new Korean("정철균","990413");
System.out.println(jung.name + "의 주민번호 앞자리는 " + jung.ssn);
}
}
매개변수를 달리하는 생성자를 여러 개 선언하는 것
class Car {
//필드
String company = "테슬라";
String model;
String color;
//생성자
Car() {
}
Car(String model) {
this.model = model;
}
Car(String model, String color) {
this.model = model;
this.color = color;
}
}
public class Carexample {
public static void main(String[] args) {
Car car1 = new Car();
System.out.println("car1.compnay: " + car1.company);
Car car2 = new Car("모덽X");
System.out.println("car2.compnay: " + car2.company);
System.out.println("car2.model: " + car2.model);
Car car3 = new Car("모델X","화이트");
System.out.println("car3.compnay: " + car3.company);
System.out.println("car3.model: " + car3.model);
System.out.println("car3.color: "+ car3.color);
}
}
class Car {
String color;
String gearType;
int door;
Car() {
this("white", "auto", 4);
} //Car(String color, String gearType, int door)호출
Car(String color){
this(color, "auto", 4);
} //Car(String color, String gearType, int door)호출
Car(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
}
class CarExample {
public static void main(String[] args) {
Car c1 = new Car();
Car c2 = new Car("blue");
System.out.println(c1.color + "," + c1.gearType + "," + c1.door);
System.out.println(c2.color + "," + c2.gearType + "," + c2.door);
}
}
위의 경우 Car()에서 다른 생성자 Car(String color, String gearType, int door)를 호출하였다.
class Car {
//필드
String company = "테슬라";
String model;
String color;
int maxSpeed;
//생성자
Car() {
}
Car(String model){
this(model, "화이트");
}
Car(String model, String color){
this(model, color, 250);
}
Car(String model, String color, int maxSpeed){
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
}
public class Carexample {
public static void main(String[] args) {
Car car1 = new Car();
System.out.println("car1.compnay: " + car1.company);
Car car2 = new Car("모덽X");
System.out.println("car2.compnay: " + car2.company);
System.out.println("car2.model: " + car2.model);
Car car3 = new Car("모델X","화이트");
System.out.println("car3.compnay: " + car3.company);
System.out.println("car3.model: " + car3.model);
System.out.println("car3.color: "+ car3.color);
Car car4 = new Car("모델X","화이트",200);
System.out.println("car4.company: " + car4.company);
System.out.println("car4.model: " + car4.model);
System.out.println("car4.color: " + car4.color);
System.out.println("car4.maxSpeed: " + car4.maxSpeed);
}
}
class Date {
private int year;
private int month;
private int day;
Date() {
this(22, 10, 20);
}
;
Date(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
void pr() {
System.out.println(year + "/" + month + "/" + day);
}
}
public class DateEx {
public static void main(String[] args) {
Date d1 = new Date();
d1.pr();
Date d2 = new Date(20,10,20);
d2.pr();
}
}
output
22/10/20
20/10/20