생성자 이해하기
생성자란 인스턴스를 생성할 때 즉 객체를 호출할 때 사용하였던 것이 생성자입니다.
public class Student{
String studentName;
int studentGrade;
}
public class Test{
public static void maint(String[] args){
Student student = new Student();//생성자 사용(기본생성자)
}
}
위의 예시에서는 생성자를 만들진 않았지만 기본적으로 컴파일 시 추가해주는 기본 생성자를 사용할 수 있습니다. 필요에 따라 생성자를 만들어줄 수 있습니다. 단 생성자를 만들어준다면 기본 생성자를 컴파일 시 자동으로 생성해주지 않습니다.
public class Student{
String studentName;
int studentGrade;
public Student(String name, int grade){
Student.studentName=name;
Student.studentGrade=grade;
}
}
public class Test{
public static void maint(String[] args){
Student student = new Student("철수",4);//생성자 사용(만든 생성자)
}
}
첫 번째 예시의 객체에서 생성자를 만드는 경우 위와 같이 만들 수 있습니다. 이럴 경우는 기본 생성자를 사용할 수 없으므로 생성자를 부를 때 위에 new다음에 오는 생성자처럼 메서드 호출 시 데이터 값을 입력하듯 값을 넣어주어야 합니다. 만약 생성자를 만들었지만 기본 생성자도 사용하고 싶다면 기본 생성자도 같이 만들어주시면 됩니다.
public class Student{
String studentName;
int studentGrade;
public Student(){//기본생성자 만들기
}
public Student(String name, int grade){
Student.studentName=name;
Student.studentGrade=grade;
}
}
public class Test{
public static void maint(String[] args){
Student student1 = new Student("철수",4);//생성자 사용(만든 생성자)
Student student2 = new Student();
}
}
위와 같이 생성자를 두 개도 만들 수 있습니다. 이렇게 같은 이름을 가진 생성자 혹은 같은 이름을 가진 메서드를 만들 수도 있는데 이것을 오버 로딩이라고 합니다. 오버 로딩에 대해서는 다음에 설명드리도록 하겠습니다.
this란 무엇인가?
this는 자신의 메모리를 가리키는 용어입니다.
public class Student{
String studentName;
int studentGrade;
public Student(String name, int grade){
this.studentName= name; //Student.studentName=name;와 같은 내용
this.studentGrade= grade; //Student.studentGrade=grade;와 같은 내용
}
}
public class Test{
public static void maint(String[] args){
Student student1 = new Student("철수",4);//생성자 사용(만든 생성자)
Student student2 = new Student();
}
}
위의 예시에서 볼 수 있듯이 자신이 가지고 있는 메모리를 불러올 때 'this.변수이름'으로 불러올 수 있습니다. 따라서 위의 예시에서 this.studentName과 Student.studentName는 같은 것을 의미합니다. this=Student로 볼 수 있습니다.
this를 생성자에 사용하기
public class Student{
String studentName;
int studentGrade;
public Student(){
this("홍길동",1); //Student("홍길동",1);을 불러온것과 동일합니다.
}
public Student(String name, int grade){
Student.studentName=name;
Student.studentGrade=grade;
}
}
public class Test{
public static void maint(String[] args){
Student student1 = new Student("철수",4);
Student student2 = new Student();//studentName는 홍길동, studentGrade는 1
}
}
위의 예시에서 기본 생성자에 코드를 추가하였습니다. 내용은 기본 생성자를 호출하는 경우 this("홍길동",1)을 사용하게 되는데 이것은 Student("홍길동",1)과 동일하기 때문에 기본 생성자를 쓰는 경우 studentName에는 "홍길동"이 studentGrade에는 1이 입력됩니다.