하루하루 살아남기

[Java / 자바] 생성자 오버로딩(Constructor Overloading) 본문

개발/Java

[Java / 자바] 생성자 오버로딩(Constructor Overloading)

막막이 2021. 3. 15. 22:31
반응형
    public Animal() {
        this("elephant", 4);
    }

생성자 오버로딩이란?

 

이전에 메서드 오버로딩은 매개변수의 수나 형(type)이 다르다면 여러개 선언할수 있다고 했습니다. 생성자 오버로딩 또한 같습니다. 매개변수의 수와 형만 다르다면 여러개 선언할 수 있습니다. 이를 생성자 오버로딩 이라고 합니다.

 

public class Animal {
    String animal;
    int legs;

    public Animal(String animal) {
        this.animal = animal;
    }
}

 

동물 클래스를 하나 만들었습니다. 동물 클래스는 어떤 동물인지를 나타내는 animal 필드와, 다리수를 나타내는 legs를 가지고 있습니다. 생성자는 animal을 매개변수로 받아 어떤 동물인지를 초기화하는 생성자가 하나 있습니다. 하지만 저는 어떤 동물인지와 함께, 이 동물의 다리수를 초기화 하고 싶습니다. 이때 생성자 오버로딩을 통해 생성자를 더 만들 수 있습니다.

 

public class Animal {
    String animal;
    int legs;

    public Animal(String animal) {
        this.animal = animal;
    }

    public Animal(String animal, int legs) {
        this.animal = animal;
        this.legs = legs;
    }
}

 

이제 실제로 사용해 보겠습니다.

 

public class Animal {
    String animal;
    int legs;

    public Animal(String animal) {
        this.animal = animal;
    }

    public Animal(String animal, int legs) {
        this.animal = animal;
        this.legs = legs;
    }

    public static void main(String[] args) {
        Animal animal = new Animal();
    }
}

new 키워드를 통해 인스턴스화 하는데 에러가 발생합니다. 왜 일까요?

 

바로 매개변수를 아무것도 받지않는 생성자가 없기 때문입니다. 이 에러를 해결하기 위해 매개변수가 아무것도 없는 생성자도 하나 만들어줍시다.

 

public class Animal {
    String animal;
    int legs;
    
    public Animal() {}

    public Animal(String animal) {
        this.animal = animal;
    }

    public Animal(String animal, int legs) {
        this.animal = animal;
        this.legs = legs;
    }

    public static void main(String[] args) {
        Animal animal1 = new Animal();
        Animal animal2 = new Animal("dog");
        Animal animal3 = new Animal("cat", 4);
    }
}

 

객체를 3개 만들어 주었습니다. 각각 다른 생성자를 통해 만들었기에 animal1의 필드(animal, legs)에는 아무것도 저장되어 있지않습니다. animal2는 animal 필드에 'dog'라는 값만 저장되어있고 legs는 아무값도 들어있지 않을 것입니다. animal3은 "cat"과 다리 4개라는 값을 전달해주었기에, animal에는 'cat'이 legs에는 4가 저장되어 있을 것입니다. 확인해 보겠습니다.

 

public class Animal {
    String animal;
    int legs;

    public Animal() {}

    public Animal(String animal) {
        this.animal = animal;
    }

    public Animal(String animal, int legs) {
        this.animal = animal;
        this.legs = legs;
    }

    public static void main(String[] args) {
        Animal animal1 = new Animal();
        Animal animal2 = new Animal("dog");
        Animal animal3 = new Animal("cat", 4);

        System.out.println("--------animal1------------");

        System.out.println(animal1.animal);
        System.out.println(animal1.legs);

        System.out.println("--------animal2------------");

        System.out.println(animal2.animal);
        System.out.println(animal2.legs);

        System.out.println("--------animal3------------");

        System.out.println(animal3.animal);
        System.out.println(animal3.legs);
    }
}

 

실행결과는 다음과 같습니다

 

 

그런데 아무것도 들어있지 않아야하는 값에 null 또는 0이 들어가있습니다. 이는 각 타입의 기본값이 출력된 것입니다.

animal1의 null과 0은 참조형과 int형의 기본값입니다. animal2의 0또한 int의 기본값입니다.  그런데, 매개변수가 없는 생성자를 호출했을때, 다른 기본값을 넣어주고 싶을수 있습니다. 그럴 땐 이렇게 사용합니다.

 

    public Animal() {
        animal = "elephant";
        legs = 4;
    }

직접 값을 넣어줄수 있습니다. 여기서 이 기본 생성자 코드는 이렇게 수정할 수 있습니다.

 

    public Animal() {
        this("elephant", 4);
    }

 

this 키워드는 자기자신을 가르킵니다. this에 괄호를 붙이면 자기 자신의 생성자를 가르킵니다. 따라서 위 코드가 의미하는 것은 자기자신의 생성자 중 String형과, int형을 매개변수로 받는 생성자를 호출한 것입니다. 정리하면 기본생성자(매개변수가 없는 생성자)가 다른 생성자(Animal(String animal, int legs))를 호출한 것입니다. 이 방법은 정의되지 않은 생성자는 호출할 수 없습니다. this() 메서드를 사용하면, 코드가 중복되는것을 막아주어 깔끔한 코드를 작성할수 있습니다.

728x90
반응형

'개발 > Java' 카테고리의 다른 글

[Java / 자바 ] 상속  (0) 2021.03.17
[Java / 자바] 패키지(Pakage)  (0) 2021.03.16
[Java / 자바] 메서드 오버로딩(Method Overloading)  (0) 2021.03.15
[Java / 자바] this 키워드  (0) 2021.03.14
[Java / 자바] 생성자  (0) 2021.03.14
Comments