해결된 질문
작성
·
268
·
수정됨
0
안녕하세요 생성자를 공부 하던 중 궁금한게 생겨서 질문 드립니다!! ^^
생성자를 정의하는 방법이 헷갈려서 질문 드립니다!
1.클래스와 같은 이름을 가진 메소드를 만드는 것이 생성자를 만드는 방법이라고 할 수 있는건가요? (2.그리고 class Calculator는 Calculator라는 클래스를 만드는 것이고, public Calculator는 메소드 오버로딩처럼 이미 만들어진 Calculator 클래스를 수정하는건가요?)
package chap_07;
class Calculator {
int left, right;
public Calculator(int left, int right) {
this.left = left;
this.right = right;
}
public void sum() {
System.out.println(this.left + this.right);
}
}
3.위 코드에서 class Calculator 로 클래스를 만들고 이후 public Calculator 로 클래스와 같은 이름인 메소드를 만듬으로써, calculator 클래스를 열면 바로 int left,right를 입력하도록 하는 생성자를 만든 것인가요?
public class CalculatorDemo1 {
public static void main(String[] args) {
Calculator c1 = new Calculator(); // 에러 발생
c1.sum();
4.그리고 Calculator() 괄호 안에 아무것도 입력하지 않으면 오류가 생기는 것을 미루어 보아
새로운 인스턴스를 만들 때 생성자가 작동하는 것이 맞나요?
감사합니다.
답변 1
1
안녕하세요?
1. 맞습니다.
클래스와 같은 이름을 가진 메소드를 만드는 것이 생성자를 만드는 방법입니다. 이때 반환형(ex: void, int 등)은 작성하지 않습니다.
2. 맞습니다.
class Calculator { ... } 는 Calculator 라는 클래스를 정의하는 것입니다.
public Calculator( ... ) { ... } 는 Calculator 라는 클래스의 생성자를 정의하는 것입니다.
이때, Calculator 생성자를 개발자가 직접 정의하지 않으면 자동으로 Default 생성자가 만들어지며 Default 생성자는 아무런 전달값을 받지 않는 형태의 생성자입니다. 하지만 클래스 내에서 public Calculator(int left, int right) { ... } 와 같은 생성자를 정의하게 되면 Default 생성자는 만들어지지 않습니다.
3. 맞습니다.
public Calculator(int left, int right) {
this.left = left;
this.right = right;
}
위 코드를 정의함으로써 Calculator 클래스로부터 어떤 객체를 만들 때 인스턴스 변수인 left, right 는 전달받은 값으로 설정됩니다.
4. 아래와 같이 답변 드립니다.
새로운 인스턴스를 만들 때 생성자가 호출되는 것은 맞습니다. 단, 위에서 작성한 2번의 설명에 의해 다음과 같이 생성자를 정의하였으므로 Default 생성자가 만들어지지 않습니다.
public Calculator(int left, int right) {
this.left = left;
this.right = right;
}
그러므로 new Calculator() 를 하게 되면 아무런 전달값을 받지 않는 Default 생성자가 없기 때문에 오류가 나는 것이며, 이때는 다음과 같이 Default 생성자를 만들거나 또는 left, right 에 해당하는 전달값을 보내줌으로써 오류를 해결할 수 있습니다.
public Calculator() { } // Default 생성자 추가
public Calculator(int left, int right) {
this.left = left;
this.right = right;
}
감사합니다 😊