class Animal{
String name;
void setName(String name){
this.name = name;
}
}
class Dog extendxs Animal{
void sleep(){
System.out.println(this.name+" zzz");
}
}
class HouseDog extends Dog{
void sleep(){
System.out.println(this.name+" zzz in house");
}
void sleep(int hour){
System.out.printlnt(this.name+" zzz in house for "+hour+" hours");
}
}
public class Sample{ //*수정할 부분
public static void main(String[] args){
HouseDog houseDog = new HouseDog();
houseDog.setName('jane');
houseDog.sleep();
houseDog.sleep(3);
}
}
위 예제에서 main 메소드를 다음과 같이 수정후 실행해보자.
public class Sample{
public static void main(String[] args){
HouseDog dog = new HouseDog();
System.out.println(dog.name); // null 출력
}
}
dog 객체의 name 변수에 값이 없으므로 null이 출력된다.
이처럼 HouseDog 클래스에 name(객체변수)값을 설정하거나 설정하지 않을 수 있다. 그렇다면 name이라는 객체변수에 값을 반드시 입력해야 객체가 생성될 수 있도록 강제하는 방법은 없을까?
이 경우 생성자 를 이용하면 된다.
class HouseDog extends Dog{
HouseDog(String name){ // 생성자
this.setName(name);
}
(...)
위 메소드처럼 메소드명이 클래스명과 동일하고 자료형을 정의하지 않는 메소드를 생성자라 한다.
생성자는 객체가 생성될 때 호출된다.(즉, 생성자는 new 키워드가 사용될 때 호출된다.)
new 클래스명(인자);
위에서 생성자를 추가한 메소드를 반영해 수정해보자.
public class Sampl{
public static void main(String[] args){
HouseDog dog = new HouseDog("jane");// 생성자로 인해 공백 불가
System.out.println(dog.name);
}
}
먼저 아래 두가지 코드를 보자.
1) 생성자 X
class Dog extends Animal{
void sleep(){
System.out.println(this.name+" zzz");
}
}
2) 디폴트 생성자
class Dog extends Animal{
Dog(){
}
void sleep(){
System.out.println(this.name+" zzz");
}
}
2의 디폴트 생성자를 구현하면 new Dog()
로 Dog 클래스의 객체가 만들어 질 때 위에 구현한 디폴트 생성자가 실행될 것이다.
만약 클래스에 생성자가 없다면 컴파일러는 자동으로 디폴트 생성자를 추가한다. 그러나 기작성된 생성자가 있는 경우 컴파일러는 디폴트 생성자를 추가하지 않는다.
하나의 클래스에 여러개의 인자가 다른 생성자를 만들 수 있다.
class Animal{
String name;
void setName(String name){
this.name = name;
}
}
class Dog extends Animal{
void sleep(){
System.out.println(this.name+" zzz");
}
}
class HouseDog extends Dog{
HouseDog(String name){ //String name, 인자 1
this.setName(name);
}
houseDog(int type) { //int type, 인자2
if(type==1){
this.setName("puddle");
}else if(type==2){
this.setName("`bullodg");
}
}
(...)
public class Sample{
public static void main(String[] args){
HouseDog puddle = new HouseDog("Tom"); // Tom 출력
HouseDog bulldog = new HouseDog(1); // bulldog 출력
(...)
위처럼 입력 인자에 따라 생성자를 여러 개 만드는 것을 생성자 오버로딩이라 한다.