생성자
- 인스턴스(객체)가 생성될 때 호출되는 인스턴스(객체) 초기화 메서드
- 인스턴스 초기화란 인스턴스 변수들을 초기화하는 것
- 대부분
객체의 초기화
를 목적으로 사용한다
인스턴스 생성 과정
graph LR
A(new연산자를 통해서 메모리heap영역에 인스턴스 생성)-->B(생성자가 호출되어 실행)-->C(new연산자 결과로 해당 객체의 주소가 변환되어 참조변수에 저장된다)
생성자의 제약조건
- 생성자의 이름은 클래스의 이름과 같아야한다
- 생성자는 다른 함수와는 다르게 리턴 값이 없다
- 생성자는 객체가 생성될때 자동으로 한번 호출된다
- 생성자는 매개변수 조건에 따라 여러개를 작성할 수 있다(오버로딩)
생성자의 종류
매개변수가 있는 생성자
1
2
3
4
5
6
7
8
9
10
11
12
| class human {
String name;
String job;
int age;
Car() {} // 기본 생성자
Car(String c, String g, int d) { // 생성자
name = c;
job = g;
age = d;
}
}
|
생성자를 사용하지 않고 객체에 데이터를 직접 넣을때
1
2
3
4
5
| // 생성자를 사용하지 않았을 때
human h = new human();
h.name = "parkdongwon";
h.job = "student";
h.age = 16;
|
생성자를 사용하여 객체에 데이터를 직접 넣을때
1
| human h = new human("parkdongwon", "student", 16);
|
this
this는 객체 즉 자기자신을 나타낸다 this를 사용하는 경우는 아래와 같다
this를 사용하는 경우(클래스의 속성과 생성자/메소드의 매개변수의 이름이 같은 경우)
아래 소스와 같이 생성자에서 받는 매개변수의 이름과 클래스의 변수 이름이 같을 경우 java는 매개변수인지 클래스 변수인지 인식을 하지 못해서 값을 제대로 반영하지 못한다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| // this를 사용하지 않아서 이슈된 코드
public class human {
public String name;
public String job;
public int age;
public human(String name, String job, int age) {
name = name;
job = job;
age = age;
}
public static void main(String[] args) {
human h = new human("parkdongwon", "student", 16);
System.out.println("name: " + h.name); // name: null
System.out.println("job: " + h.job); // job: null
System.out.println("age: " + h.age); // age: 0
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| // this를 사용해서 정상화된 코드
public class human {
public String name;
public String job;
public int age;
public human(String name, String job, int age) {
this.name = name;
this.job = job;
this.age = age;
}
public static void main(String[] args) {
human h = new human("parkdongwon", "student", 16);
System.out.println("name: " + h.name); // name: parkdongwon
System.out.println("job: " + h.job); // job: student
System.out.println("age: " + h.age); // age: 16
}
}
|
this를 사용하는 경우(클래스에 오버로딩된 다른 생성자 호출)
아래 소스와 같이 생성자가 여러개인 오버로딩된 경우 생성자가 다른 생성자를 호출할때는 this를 사용하여 호출한다
오버로딩
이란 너무 많이 적재했다(Overloading)는 뜻을 가진 단어로 같은 이름의 메서드에 매개변수의 타입, 개수를 다르게 한 것을 말한다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| // this를 사용하는 경우 (클래스에 오버로딩된 다른 생성자 호출)
public class human {
public String name;
public String job;
public int age;
public human(String name, int age) {
// human(String name, String job, int age)를 호출
this(name, "student", age);
}
public human(String name, String job, int age) {
this.name = name;
this.job = job;
this.age = age;
}
public static void main(String[] args) {
human h = new human("parkdongwon", "student", 16);
System.out.println("name: " + h.name); // name: parkdongwon
System.out.println("job: " + h.job); // job: student
System.out.println("age: " + h.age); // age: 16
}
}
|
객체 자신의 참조값을 전달하고 싶을 때
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| // this를 사용하는 경우 (객체 자신의 참조값을 전달하고 싶을 때)
public class human {
public String name;
public String job;
public int age;
public human(String name, String job, int age) {
this.name = name;
this.job = job;
this.age = age;
}
// 어떤 메소드에서는 동작을 완료하고 리턴값으로 메소드의 매개변수로 객체, 자기 자신의 참조값을 전달하고 싶어하는 경우
public human getHumanInstance() {
return this;
}
}
|