●생성자 메소드의 매개변수 사용
생성자에 전달인수를 만들고 다른 값을 전달하여, 객체마다 멤버변수의 초기값을 객체 생성과 동시에 달리 하여 시작할 수 있습니다.
매개변수로 다양한 데이터 타입 이용 가능 (int, double, String, int...a, 객체...)
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class Cclass{
private int age;
Cclass(int a) {
age = a;
}
}
public static void main(String[] args) {
Cclass c1 = new Cclass(20);
Cclass c2 = new Cclass(30);
|
cs |
c1 객체에는 초기값 20으로 설정 // c2 객체에는 초기값 30으로 설정
CClass c3 = new Cclass(); // 에러
클래스 내부에 매개변수를 갖든 안갖든, 생성자가 꺼내어지고 정의가 되면
숨어 있던 디폴트 생성자는 꺼내어지고 새로 정의된 생성자로 대체되어 없어 집니다.
-> 그래서 CClass 에서 아무런 매개변수를 갖지 않는 생성자 메소드를 만들어줘야 위 코드에서 에러가 안남
-> CClass(){}
●멤버메서드의 오버로딩 (메서드의 이름이 같고 매개변수의 데이터타입, 개수, 순서 등등이 다른것)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
public class Class13 {
public static void main(String[] args) {
Sum s = new Sum(25, 36);
System.out.println("s.add()의 결과 : " + s.add()); // a+b
System.out.println("s.add(23)의 결과 : " + s.add(23)); // 23+a+b
System.out.println("s.add(59,65)의 결과 : " + s.add(59,65));
System.out.println("s.add(58,98,78,36,59)의 결과 : " + s.add(58,98,78,36,59) );
}
}
//멤버 메서드의 오버로딩
class Sum{
private int a;
private int b;
Sum( int c, int d){
a = c; b = d;
}
public int add() {
return a+b;
}
/*
public int add( int c ) {
return a+b + c;
}
public int add(int c, int d) {
return a+b+c+d;
}
*/
public int add(int... c) {
int tot =0;
for(int i=0; i<c.length; i++) tot += c[i];
return a+b+tot;
}
}
|
cs |
-멤버메소드 add(){} 의 오버로딩
-매개변수를 다양하게 지정하여 사용할 수 있음
●this.
- 멤버변수와 지역변수(매개변수)와 부득이하게 이름이 같았을때, 그 둘을 구분하기 위해 멤버변수 앞에 this. 을 붙여서 사용합니다
- this 키워드는 클래스 내부에서사용되는 모든 멤버 변수에 원래 붙어 있지만 사용 편의상 확실히 멤버변수로 구분할 수 있는 경우 생략해. 서 사용 (but 붙여서 사용할 수도 있음)
-this 변수는 레퍼런스(참조) 변수입니다
-클래스의 멤버필드들은 new 라는 키워드에 의해서 각각의 객체별로 생성됩니다. (서로 다른(겹치지 않는) 메모리 공간)
-반면, 멤버 메서드는 생성된(오버로딩 포함) 메서드별로 하나만 존재하며 모든 객체들이 공유해서 필요시 호출합니다.
-이때 현재 메서드를 호출한 객체가 어떤 객체인지 구분하여 실행될 수 있게 this 라는 숨겨진 참조변수를 제공합니다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
class ThisB{
private int num;
ThisB( /* ThisB this */ ){
this.num = 0;
}
public void setNum(int num /* , ThisB this */ ) {
// 메서드를 호출한 객체가 매개변수 this 에 저장됩니다
this.num = num;
}
public void prn(/* , ThisB this */) {
System.out.printf("num = %d\n", this.num);
}
}
public class Class15 {
public static void main(String[] args) {
ThisB b1 = new ThisB();
ThisB b2 = new ThisB();
b1.setNum(100);
b2.setNum(200);
b1.prn();
b2.prn();
}
}
|
cs |
출력값
num = 100
num = 200
-모든 멤버메서드에서는 메서드를 호출한 객체의 주소가 'this'변수에 저장되어 있음
※ this 의 용도 : 멤버메서드를 호출한 호출객체의 참조변수값(주소값)을 전달받아 전달된 메서드를 호출한 객체를 식별하는 용도로 사용됩니다. 보통 멤버변수를 this 없이 사용해도 이름이 중복된 매개변수가 없다면 내부적으로 this 가 붙어서 실행됩니다.
1
2
3
4
5
6
7
8
|
public class Class15 {
public static void main(String[] args) {
ThisB b3 = b1;
b3.setNum(300); // b3 의 변수값변경은 b1 의 변경이기도 합니다.
b1.prn();
b3.prn();
|
cs |
ThisB b3 = b1;
-> b1 이 저장한 참조값(주소)을 b3에 저장 (인스턴스는 하나, 같은 주소를 갖는 참조 변수는 두개의 효과)
-> 위 연산은 new 를 이용하여 b3 에 새로운 공간을 만든게 아니라,
b1위 레퍼런스 값만 복사 저장한 결과로, b1 과 b3 는 같은 공간의 주소를 저장하고 있기 때문에
출력값은 num = 300
num = 300
1
2
3
4
5
6
7
|
public class Class15 {
public static void main(String[] args) {
ThisB b4 = new ThisB( b2 );
b2.setNum(500); // 전달인수로 객체의 주소를 보냅니다. b2.setNum(500);
b2.prn();
b4.prn();
|
cs |
-b4라는 새로운 객체를 만들고 b2의 데이터를 b4에 복사
-출력값 num = 500
num = 200
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
class ThisB{
public void copy1(ThisB b/* , ThisB this */) {
this.num = b.num;
//main 메서드에서 b5.copy1(b2); 이와 같이 호출되었다면
//this <- b5 b<- b2
}
}
public class Class15 {
public static void main(String[] args) {
ThisB b5 = new ThisB();
b5.copy1(b2);
b2.setNum(700);
b2.prn();
b5.prn();
}
}
|
cs |
-b5 새로운 객체를 만들고 (new)
copy1() 멤버메소드를 호출하여 매개변수에 있는 데이터를 호출한 객체(this)에 복사하기
-출력값 num = 700
num = 500
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
class ThisB{
public ThisB copy2(/* ThisB this */) {
//ThisB b6 = b4.copy2(); this<-b4 실행결과가 리턴돼서 b6로 되돌려짐
ThisB temp = new ThisB();
temp.num = this.num;
return temp;
}
public class Class15 {
public static void main(String[] args) {
ThisB b6 = b4.copy2();
b2.setNum(900);
b2.prn();
b6.prn();
}
}
|
cs |
- 새로운 객체를 만들고, 호출한 객체(this)의 데이터를 그 새로운 객체에 복사하는 멤버 메소드 copy2(){}
결과적으로 그 새로 만들어진 객체를 반환(return)까지 해야됨
- temp라는 새로운 객체를 만들고 그 temp안에 있는 멤버변수에 this(b4)의 데이터를 대입하고 return한다
- 출력값 num = 900
num = 700
※this의 용도 : 오버로딩 되어 있는 생성자들간 서로를 재호출 하기 위한 이름으로 사용
호출하는 형태(매개변수의 형태)대로 생성자가 오버라이딩 되어 있어야 사용가능
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
class ThisC{
private int num1;
private int num2;
private int num3;
ThisC(int n){
num1 = n;
System.out.println("ThisC클래스의 생성자1이 호출되었습니다");
}
ThisC(int n1, int n2){
this(n1);
num2 = n2;
System.out.println("ThisC클래스의 생성자2이 호출되었습니다");
}
ThisC(int n1, int n2, int n3){
this(n1,n2);
num3 = n3;
System.out.println("ThisC클래스의 생성자3이 호출되었습니다");
}
public class Class16 {
public static void main(String[] args) {
ThisC t1 = new ThisC(10);
System.out.println();
ThisC t2 = new ThisC(20,30);
System.out.println();
ThisC t3 = new ThisC(10,20,30);
}
}
|
cs |

-this를 사용한 생성자간 호출 코드는 반드시 생성자의 명령 중 첫번째 실행코드로만 사용 가능합니다.
'JAVA > 수업 복습' 카테고리의 다른 글
자바 공부기록 39 - Static 메소드 기초 / 자료형변환 클래스 내 메소드의 활용 (0) | 2022.04.28 |
---|---|
자바 공부기록 38 - Static의 정의 / Static 변수 (0) | 2022.04.28 |
자바 공부기록 36 - 생성자(Constructor) (0) | 2022.04.26 |
자바 공부기록 35 - getter setter 메서드 생성 (0) | 2022.04.26 |
자바 공부기록 34 - 접근지정자(public, private, protected) (0) | 2022.04.26 |