해결된 질문
작성
·
204
·
수정됨
1
public class MemberConstruct {
String name;
int age;
int grade;
MemberConstruct(String name, int age){
this(name, age, 50);
}
MemberConstruct(String name, int age, int grade){
System.out.println("생성자 호출 name= " + name + "age= " + age + "grade= " + grade);
this.name = name;
this.age = age;
this.grade =grade;
}
}
this(name, age, 50);
this.name = name;
this.age = age;
this.grade =grade;
안녕하세요. 생성자와 관련하여 질문드립니다.
this(name, age, 50) 을 실행시키기 위해서는 this.name = name, this.age = age, this.grade = grade 코드가 최소 한번은 작성되어있어야 하나요?
MemberConstruct(String name, int age, int grade){
System.out.println("생성자 호출 name= " + name + "age= " + age + "grade= " + grade);
this.name = name;
this.age = age;
this.grade =grade;
}
}
제 생각으로는 System.out.println("생성자 호출 name= " + name + "age= " + age + "grade= " + grade); 코드 앞
에 this.name = name, this.age = age, this.grade = grade 코드가 있어야 될 것 같습니다.
제가 이해한 바로는 MemberConstruct 메서드의 매개변수 name, age, grade를 받고, this.name, this.age, this.grade를 사용하여 생성된 객체의 맴버변수(name, age, grade)에 대입하는 과정으로 이해했습니다. 그렇다면 this.name, this.age, this.grade가 먼저 실행되어야 되는 것 아닌가요? (대입한 값을 넣은 뒤 실행해야 되는 것 아닌가요?) 위 사진으로 첨부한 코드가 (생성자 호출 name = null age=0, grade =0)으로 실행되지 않고, 어떻게 정상적으로 실행되는지 궁금합니다.
답변 1
3
안녕하세요. qwerty111222님, 공식 서포터즈 OMG입니다.
1.
this(name, age, 50); 는 나를 정의하는 생성자(여기서는 MemberConstruct) 중 3개의 인자를 전달받는
MemberConstruct(String name, int age, int grade){ }
생성자가 MemberConstruct 클래스 내에 반드시 정의되어 있어야 합니다.
다른 클래스에서 MemberConstruct OMG = new MemberCustruct("OMG",10,20); 과 같은 코드를 호출하지 않아도 상관없습니다.
이 부분을 잘 구분해주세요 😀
-
2.대입한 값을 System.out.println 과 같은 출력문으로 먼저 출력해도 전혀! 문제되지 않습니다.
전달받은 정보는 이미 new연산자를 통해 인스턴스를 생성하기 위해 전달받았기 때문입니다.
예를 들어 다음과 같은 코드가 있습니다.
(1)MemberConstruct OMG = new MemberCustruct("OMG",10,20
);
OMG 객체의 생성에 필요한 데이터들을 new 연산자와 인자를 통해 이름 나이 등의 데이터가 전달되고,
(2)System.out.println("생성자 호출 name= " + OMG
+ "age= " + 10
+ "grade= " + 20
);
을 출력하고,
(3)
this.name= name;
this.age = age;
this.grade =grade;
OMG의 멤버변수에 각각의 데이터를 세팅하는 과정으로 진행됩니다.
(2)와 (3)의 순서가 변경되어도 이미 인스턴스 생성 시점에 받은 데이터를 출력하기 때문에
멤버변수를 초기화하는 코드가 뒤에 나와도 문제되지 않습니다.
감사합니다.
상세한 설명 감사합니다!!^^