package construct;
public class MemberInit {
String name;
int age;
int grade;
}
package construct;
public class MethodInitMain1 {
public static void main(String[] args) {
MemberInit member1 = new MemberInit();
//Setting
member1.age = 15;
member1.name = "user1";
member1.grade = 90;
MemberInit member2 = new MemberInit();
//Setting
member2.age = 12;
member2.name = "user2";
member2.grade = 92;
// MemberInit Array
MemberInit[] members = {member1 , member2};
for(MemberInit member: members){
System.out.println("이름: " + member.name + " 나이: " + member.age + " 성적: " + member.grade);
}
}
}
package construct;
public class MethodInitMain2 {
public static void main(String[] args) {
MemberInit member1 = new MemberInit();
//Setting
initMember(member1 , "user1" , 15,90);
//Setting
MemberInit member2 = new MemberInit();
initMember(member2 , "user2" , 16,92);
// MemberInit Array
MemberInit[] members = {member1 , member2};
for(MemberInit member: members){
System.out.println("이름: " + member.name + " 나이: " + member.age + " 성적: " + member.grade);
}
}
static void initMember(MemberInit member , String name , int age , int grade){
member.name = name;
member.age = age;
member.grade = grade;
}
}
package construct;
public class MemberInit {
String name;
int age;
int grade;
//static은 클래스에서는 절대 사용하지 말아야 한다.
void initMember(String name , int age , int grade){
this.name = name; // this는 멤버 변수에 값을 넣을때 매개변수와 멤버 변수가 같을 경우 구분을 하기위한 용도로 사용한다.
this.age = age;
this.grade = grade;
}
}
package construct;
public class MethodInitMain3 {
public static void main(String[] args) {
MemberInit member1 = new MemberInit();
//Setting
member1.initMember("user1" , 15,90);
//Setting
MemberInit member2 = new MemberInit();
member2.initMember("user2" , 16,92);
// MemberInit Array
MemberInit[] members = {member1 , member2};
for(MemberInit member: members){
System.out.println("이름: " + member.name + " 나이: " + member.age + " 성적: " + member.grade);
}
}
}
package construct;
public class MemberThis {
String nameField;
void initMember(String nameParameter){
nameField = nameParameter; // 멤버 변수와 매개변수가 이름이 다를 경우에는 this를 생략해도 된다.
}
}
package construct;
public class MemberThis {
String nameField;
void initMember(String nameParameter){
this.nameField = nameParameter; // 이름이 달라도 무조건 쓰는 경우가 있다..
}
}
package construct;
public class MemberConstruct {
String name;
int age;
int grade;
MemberConstruct(String name , int age , int grade){
System.out.println("생성자 호출 = "+ name + ",age="+age + ",grade=" + grade);
this.name = name;
this.age = age;
this.grade = grade;
}
}
package construct;
public class ConstructMain1 {
public static void main(String[] args) {
// 선언을 할때 값을 넘겨 주면서 -> 객체를 불러라 + 생성자를 이용해 초기화까지 진행한다.
MemberConstruct member1 = new MemberConstruct("user1" , 15 , 90); // 선언과 동시에 멤버변수의 값을 넘겨줘서 값을 초기화 한다.
MemberConstruct member2 = new MemberConstruct("user2" , 17 , 92); // 선언과 동시에 멤버변수의 값을 넘겨줘서 값을 초기화 한다.
MemberConstruct[] members = {member1 , member2};
for(MemberConstruct member : members){
System.out.println("사용자 이름: " + member.name + " 나이: " + member.age + " 성적: " + member.grade);
}
}
}
생성자 장점
- 생성자를 안만들었을때는 멤버변수 초기화 하는 부분을 메서드를 만들어서 객체를 선언한후 초기화하는 메서드를 한번더 불러야 한다.
- 그러나 생성자는 선언과 초기화를 동시해 할수 있기 때문에 중복 호출을 줄여주는 장점이 있다.
제약 생성자 호출 필수
- 만약 생성자를 만들어두고 인스턴스 선언시 객체를 넘겨주지 않을 경우에는 값이 존재하지 않기 때문에 숫자형 자료들은 0 / 문자형 자료형은 null 이런식으로 값이 넘어가기 때문에 프로그램 동작에는 이상이 없지만 시스템 상태에서는 큰 문제를 유발할 수 있다. 따라서 생성자에 반드시 값을 넘겨줘야 한다.
- 그러나 생성자를 메서드 오버로딩 처럼 여러개 정의할 수 있는데 그 경우는 한가지만 사용하면 된다.
- 반드시 호출해야 하는 생성자 때문에 시스템 상에서 문제되는 부분을 바로 발견하고 원천적으로 막을 수 있다.
package construct;
public class MemberDefault {
String name;
MemberDefault(){
System.out.println("기본 생성자 호출");
}
}
package construct;
public class MemberDefaultMain {
public static void main(String[] args) {
MemberDefault memberDefault = new MemberDefault(); // 정상적으로 실행
}
}
package construct;
public class MemberConstruct {
String name;
int age;
int grade;
MemberConstruct(String name , int age){
this.name = name;
this.age = age;
this.grade = 50;
}
MemberConstruct(String name , int age , int grade){
System.out.println("생성자 호출 = "+ name + ",age="+age + ",grade=" + grade);
this.name = name;
this.age = age;
this.grade = grade;
}
}
package construct;
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 + ",age="+age + ",grade=" + grade);
this.name = name;
this.age = age;
this.grade = grade;
}
}