개발/JAVA

[JAVA] 생성자

경주초이 2020. 6. 15. 21:16

Animal.java

public class Animal {
    String name;

    public void setName(String name) {
        this.name = name;
    }
}

Dog.java

public class Dog extends Animal {
    public void sleep() {
        System.out.println(this.name+" zzz");
    }
}

HouseDog.java

public class HouseDog extends Dog {
    public void sleep() {
        System.out.println(this.name+" zzz in house");
    } 

    public void sleep(int hour) {
        System.out.println(this.name+" zzz in house for " + hour + " hours");
    } 

    public static void main(String[] args) {
        HouseDog dog = new HouseDog();
        System.out.println(dog.name);
    }
}

name 객체 변수에 아무 설정하지 않았기 때문에 null이 출력된다.
HouseDog 클래스는 코딩하기에 따라 name 값을 설정 할 수도 있고 안할 수도 있다.
name 값 설정을 강제하려면 생성자(constructor)를 이용하면 된다

HouseDog.java

public class HouseDog extends Dog {
	
    //constructor
    public HouseDog(String name) {
        this.setName(name);
    } 

    public void sleep() {
        System.out.println(this.name+" zzz in house");
    } 

    public void sleep(int hour) {
        System.out.println(this.name+" zzz in house for " + hour + " hours");
    } 

    public static void main(String[] args) {
        HouseDog dog = new HouseDog();
        System.out.println(dog.name);
    }
}

Constructor 규칙

  1. 클래스 명과 메소드명이 동일하게
  2. 리턴타입을 정의하지 않는다
HouseDog dog = new HouseDog("happy");   // 생성자 호출 시 문자열을 전달해야 한다.

//아래와 같이 하면 컴파일 오류가 밠갱한다.
HouseDog dog = new HouseDog();

 

생성자 오버로딩

public class HouseDog extends Dog {
    public HouseDog(String name) {
        this.setName(name);
    }

    public HouseDog(int type) {
        if (type == 1) {
            this.setName("yorkshire");
        } else if (type == 2) {
            this.setName("bulldog");
        }
    }

    public void sleep() {
        System.out.println(this.name+" zzz in house");
    } 

    public void sleep(int hour) {
        System.out.println(this.name+" zzz in house for " + hour + " hours");
    } 

    public static void main(String[] args) {
        HouseDog happy = new HouseDog("happy");
        HouseDog yorkshire = new HouseDog(1);
        System.out.println(happy.name);
        System.out.println(yorkshire.name);
    }
}

위 HouseDog 클래스는 두 개의 생성자가 구현되어 있다. 하나는 String 자료형을 입력으로 받는 생성자이고 다른 하나는 int 자료형을 입력으로 받는 생성자이다. 두 생성자의 차이는 입력 항목이다. 이렇게 입력 항목이 다른 생성자를 여러 개 만들 수 있는데 이런 것을 생성자 오버로딩(Overloading) 이라고 말한다

이제 HouseDog 객체는 다음과 같이 두 가지 방법으로 생성이 가능하다.

HouseDog happy = new HouseDog("happy");
HouseDog yorkshire = new HouseDog(1);