생성자란?
클래스의 인스턴스를 새롭게 생성할 때 사용되는 메서드의 일종
- 클래스명과 메서드명이 같음
- 반환 타입이 없음(void조차 없음)
생성자의 쓰임새
인스턴스의 초기화 작업에 사용됨.
객체 생성 시 반드시 정해진 타입의 입력값을 받고자 할 때 사용
(예시)
Dog(String name) { → Dog자료형의 객체 생성 시 문자열로 된 이름을 반드시 입력하도록 강제
this.setName(name);
}
....생략....
Dog dog1 = new Dog("Geun"); → main 메서드에서 dog1 개체 생성 시 이름을 반드시 넣어 생성해야함
디폴트 생성자
생성자의 받을 입력항목이 없고 생성자 내부에도 아무런 코드가 없는 생성자
클래스에 생성자가 없을 때, 컴파일러가 자동으로 만드는 생성자임
클래스 내부에 생성자가 있을 때, 입력값이 없는 인스턴스를 새로 정의할 수 없음.
사용하기 위해서는 직접 디폴트생성자를 만들어 주어야 함
(예시)
Dog() { → 입력항목도 없고, 내부에도 아무 내용이 없음
}
생성자 오버로딩
받을 입력값을 다르게 한다면, 같은 이름의 생성자를 여러 개 만들 수있음
(예시)
class Dog extends Animal {
Dog(String name) { → 문자열 타입 생성자 Dog
this.setName(name);
}
Dog(int type){ → 정수 타입 생성자 Dog
if (type==1) {
this.setName("Yorkshire");
} else if (type==2) {
this.setName("bulldog");
}
따라 연습해보기
class Vehicle{
String name;
void setName(String name) {
this.name = name;
}
}
class Car extends Vehicle {
void run() {
System.out.println(this.name + " is running");
}
}
class Benz extends Car {
void run() {
System.out.println(this.name + " is running on the road");
}
void run(int hour) {
System.out.println(this.name + " is running for " + hour + " hours on the road");}
Benz(String name) { // 생성자 : 클래스명과 동일하고 void 형태인 메서드=
this.setName(name);
}
Benz(int grade) {
if(grade == 1) {
this.setName("S Class");
} else if(grade == 2) {
this.setName("E Class");
} else if(grade == 3) {
this.setName("C Class");
}
}
}
public class Day15 {
public static void main(String[] args) {
Benz benz = new Benz("Pang");
benz.run();
benz.run(3);
System.out.println(benz.name);
System.out.println();
Benz eClass = new Benz(2);
System.out.println(eClass.name);
System.out.println();
benz.setName("Benz S class");
benz.run();
benz.run(3);
System.out.println(benz.name);
}
}