인프런 커뮤니티 질문&답변

skyjoon2님의 프로필 이미지
skyjoon2

작성한 질문수

나도코딩의 자바 기본편 - 풀코스 (20시간)

생성자

기본생성자 질문드리겠습니다.

해결된 질문

작성

·

292

0

BlackBox(){}
BlackBox(String modelName, String resolution, int price, String color){}

위와같이 매개변수가 없는 기본생성자

매개변수가 있는 생성자가 있는 경우에

 

해당 클래스를 참조하는 객체를 생성하는 경우

BlackBox b2 = new BlackBox("하양이", "UHD", 300000, "화이트");

이와같이 매개변수가 있는 생성자를 참조하는 객체를 만든다면 메소드가 오버로딩이 되어 기본생성자를 호출하지 않는건가요?

 

매개변수가 있는 생성자와 없는 기본생성자 둘다 없는 경우에는 에러가 나지 않는데. 매개변수가 있는 생성자만 생성을 한뒤

해당 메소드를 참조하는 객체를 생성하는 경우

BlackBox b2 = new BlackBox("하양이", "UHD", 300000, "화이트");

와같이 형식을 맞춰 해당 객체를 생성하는 오류가 나는 이유를 알고싶습니다.

 

답변 1

0

나도코딩님의 프로필 이미지
나도코딩
지식공유자

안녕하세요?
매개변수가 없는 기본 생성자는 사실은 따로 정의해주지 않아도 자동으로 생성이 됩니다. 그래서 별다른 생성자를 만들지 않고도 다음과 같이 객체를 만들 수 있습니다.

public class BlackBox {
    // 비어 있음
}
public class Sample {
    public static void main(String[] args) {
        BlackBox b1 = new BlackBox();
    }
}

만약 BlackBox 코드를 다음과 같이 하게 되면 객체를 생성할 때 기본 생성자가 호출되는 것을 확인할 수 있지요.

public class BlackBox {
    BlackBox () {
        System.out.println("기본 생성자 호출");
    }
}
// 실행 결과 : 기본 생성자 호출

매개변수가 있는 생성자는 직접 정의를 해줘야 하며, 매개변수를 가지는 객체를 생성할 때 기본 생성자는 호출되지 않습니다. 확인을 위해 코드를 다음과 같이 적어보겠습니다.

public class BlackBox {
    BlackBox () {
        System.out.println("기본 생성자 호출");
    }

    BlackBox(String modelName, String resolution, int price, String color) {
        System.out.println("매개변수를 가지는 생성자 호출");
    }
}

그리고 main() 메소드는 이렇게 바꾸고 실행합니다.

public class Sample {
    public static void main(String[] args) {
        // BlackBox b1 = new BlackBox();
        BlackBox b2 = new BlackBox("하양이", "UHD", 300000, "화이트");
    }
}
// 실행 결과 : 매개변수를 가지는 생성자 호출

만약 객체 생성 시 기본 생성자의 동작을 함께 수행하고 싶다면 this() 를 이렇게 추가하시면 됩니다.

public class BlackBox {
    ...

    BlackBox(String modelName, String resolution, int price, String color) {
        this(); // 기본 생성자 호출
        System.out.println("매개변수를 가지는 생성자 호출");
    }
}

 

2번째로 질문해주신,

"매개변수가 있는 생성자와 없는 기본생성자 둘다 없는 경우에는 에러가 나지 않는데. 매개변수가 있는 생성자만 생성을 한뒤 해당 메소드를 참조하는 객체를 생성하는 경우 해당 객체를 생성하는 오류가 나는 이유"

부분은 오류가 발생하지 않아야 정상입니다. 제가 이해한 질문 내용을 코드로 적어보면 다음과 같으며 이는 정상적으로 동작합니다.

// 매개변수가 있는 생성자만 생성
public class BlackBox {
    BlackBox(String modelName, String resolution, int price, String color) {
        System.out.println("매개변수를 가지는 생성자 호출");
    }
}
// 해당 메소드를 참조하는 객체를 생성
public class Sample {
    public static void main(String[] args) {
        BlackBox b2 = new BlackBox("하양이", "UHD", 300000, "화이트");
    }
}

실행 결과는 이렇습니다.

매개변수를 가지는 생성자 호출

만약 의도하신 질문이

"매개변수가 있는 생성자만 생성을 한뒤 BlackBox b1 = new BlackBox(); 와 같이 기본 생성자를 이용하여 객체를 생성하려고 할 때 오류가 나는 이유"

라고 한다면, 이는 오류가 발생하는 상황이 맞습니다. 개발자가 직접 매개변수가 있는 생성자를 만드는 경우에는 기본 생성자를 자동으로 만들어주지 않기 때문에 그런 것입니다.

// 매개변수가 있는 생성자만 생성
public class BlackBox {
    BlackBox(String modelName, String resolution, int price, String color) {
        System.out.println("매개변수를 가지는 생성자 호출");
    }
}
// 기본 생성자를 이용하여 객체 생성 시도
public class Sample {
    public static void main(String[] args) {
        BlackBox b1 = new BlackBox(); // 에러 발생
    }
}

이를 해결하기 위해서는 BlackBox 클래스에 기본 생성자를 명시적으로 추가해주면 됩니다.

// 기본 생성자를 명시적으로 추가
public class BlackBox {
    BlackBox () {
        System.out.println("기본 생성자 호출");
    }

    BlackBox(String modelName, String resolution, int price, String color) {
        System.out.println("매개변수를 가지는 생성자 호출");
    }
}

궁금증 해결에 도움되길 바라겠습니다.
감사합니다 😊

skyjoon2님의 프로필 이미지
skyjoon2

작성한 질문수

질문하기