Java - this. 문법
2020. 6. 14. 11:37ㆍJava
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
|
public class Ex {
public static void main(String[] args) {
/*
* 레퍼런스 this
* - 인스턴스 생성 시 생성된 인스턴스 주소가 자동으로 저장되는 레퍼런스 변수(키워드)
* (단, 개발자가 선언하는 것이 아닌 자바에 의해 자동으로 선언된 레퍼런스)
* - 생성자나 메서드 등에서 로컬변수를 선언했을 때,
* 로컬변수의 이름과 인스턴스 변수의 이름이 같을 경우
* 인스턴스 변수를 지정하기 위한 용도로 사용
* 사용법 : this.인스턴스변수명
*/
Student s = new Student(1, "홍길동");
System.out.println(s.id + ", " + s.name);
s.showStudentInfo();
System.out.println("-----------------");
Student s2 = new Student(2, "이순신");
s2.showStudentInfo();
}
}
class Student {
// 인스턴스(멤버) 변수
int id;
String name;
public Student(int id, String name) {
// 로컬변수와 인스턴스변수의 이름이 같을 때,
// 로컬변수가 선언된 메서드 내에서 변수명 지정 시 로컬변수로 인식 됨
// id = id; // 잘못된 코드(오류는 X) => 로컬변수 값을 다시 로컬변수에 전달하는 코드
// name = name; // 잘못된 코드(오류는 X) => 로컬변수 값을 다시 로컬변수에 전달하는 코드
// 인스턴스 변수를 로컬 변수와 구별하기 위해 레퍼런스 this 키워드를 사용해야함
// => 인스턴스변수명 앞에 this. 을 붙여서 구별
this.id = id; // 로컬변수 id 값을 인스턴스변수 id 에 저장
this.name = name; // 로컬변수 name 값을 인스턴스변수 name 에 저장
}
public void showStudentInfo() {
// 로컬변수 이름과 중복되지 않는 경우에는 레퍼런스 this 생략할 수 있다!
System.out.println("아이디 : " + this.id); // 레퍼런스 this 를 사용해도 되고
System.out.println("이름 : " + name); // 생략해도 됨(중복되는 이름이 없기 때문)
}
}
public class Ex2 {
public static void main(String[] args) {
/*
* 생성자 this()
* - 생성자 내에서 오버로딩 된 다른 생성자를 호출
* => 생성자 오버로딩 시 중복 코드를 제거하기 위해 사용
* - 생성자 이름 대신 this 를 사용하여 생성자 호출 형태를 갖추고
* 필요한 파라미터를 전달하면 됨
* - 주의! 생성자 this() 는 생성자 내에서 첫번째로 실행되어야 하며, 단 한 번만 사용 가능
*/
MyDate d = new MyDate();
d.printDate();
System.out.println("-------------------------------");
// 인스턴스 생성 시 MyDate(int year) 생성자 호출
MyDate d2 = new MyDate(2000);
d2.printDate();
System.out.println("-------------------------------");
// 인스턴스 생성 시 MyDate(int year, int month) 생성자 호출
MyDate d3 = new MyDate(2010, 5);
d3.printDate();
System.out.println("-------------------------------");
// 인스턴스 생성 시 MyDate(int year, int month, int day) 생성자 호출
MyDate d4 = new MyDate(2020, 5, 27);
d4.printDate();
}
}
class MyDate {
int year;
int month;
int day;
public MyDate() {
// 인스턴스 변수를 초기화하는 코드가 중복됨
// this.year = 1900;
// this.month = 1;
// this.day = 1;
// 파라미터 3개를 전달받는 생성자를 호출하여 대신 초기화하면 코드 중복 제거가 가능하다
// MyDate(int, int, int) 생성자를 호출하여 초기화할 값을 전달 후 대신 초기화 수행
// MyDate(1900, 1, 1); // 오류 발생! 생성자를 생성자명으로 직접 호출이 불가능!
// 생성자 this 를 사용하여 파라미터 3개짜리 생성자를 호출할 수 있다!
this(1900, 1, 1);
System.out.println("MyDate() 생성자 호출됨!");
// this(1900, 1, 1); // 오류 발생! 생성자 this() 는 생성자 내에서 첫번째로 실행되어야 한다!
}
public MyDate(int year) {
this(year, 1, 1);
System.out.println("MyDate(int) 생성자 호출됨!");
// this.year = year;
// this.month = 1;
// this.day = 1;
}
public MyDate(int year, int month) {
this(year, month, 1);
System.out.println("MyDate(int, int) 생성자 호출됨!");
// this.year = year;
// this.month = month;
// this.day = 1;
}
public MyDate(int year, int month, int day) {
System.out.println("MyDate(int, int, int) 생성자 호출됨!");
this.year = year;
this.month = month;
this.day = day;
}
public void printDate() {
System.out.println(year + "/" + month + "/" + day);
}
}
public class Test {
public static void main(String[] args) {
}
}
class Account {
private String accountNo;
private String ownerName;
private int balance;
public Account() {
accountNo = "111-1111-111"; // 중복되는 로컬변수가 없으므로 this.accountNo 와 동일함
ownerName = "홍길동"; // 중복되는 로컬변수가 없으므로 this.ownerName 과 동일함
balance = 0; // 중복되는 로컬변수가 없으므로 this.balance 와 동일함
}
public Account(String accountNo) {
this.accountNo = accountNo;
ownerName = "홍길동";
balance = 0;
}
public Account(String accountNo, String ownerName) {
this.accountNo = accountNo;
this.ownerName = ownerName;
balance = 0;
}
public Account(String accountNo, String ownerName, int balance) {
this.accountNo = accountNo;
this.ownerName = ownerName;
this.balance = balance;
}
public String getAccountNo() {
return accountNo;
}
public void setAccountNo(String accountNo) {
this.accountNo = accountNo;
}
public String getOwnerName() {
return ownerName;
}
public void setOwnerName(String ownerName) {
this.ownerName = ownerName;
}
public int getBalance() {
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
}
public class Test2 {
public static void main(String[] args) {
Account2 acc1 = new Account2();
// System.out.println("계좌번호 : " + acc1.getAccountNo());
// System.out.println("예금주명 : " + acc1.getOwnerName());
// System.out.println("현재잔고 : " + acc1.getBalance() + "원");
acc1.showAccountInfo();
System.out.println("-----------------");
// 계좌번호를 전달받는 생성자 Account2(String) 호출
Account2 acc2 = new Account2("555-5555-555");
acc2.showAccountInfo();
System.out.println("-----------------");
// 계좌번호, 예금주명을 전달받는 생성자 Account2(String, String) 호출
Account2 acc3 = new Account2("777-7777-777", "이순신");
acc3.showAccountInfo();
System.out.println("-----------------");
// 계좌번호, 예금주명, 현재잔고를 전달받는 생성자 Account2(String, String, int) 호출
Account2 acc4 = new Account2("777-7777-777", "이순신", 99999);
acc4.showAccountInfo();
}
}
class Account2 {
private String accountNo;
private String ownerName;
private int balance;
public Account2() {
this("111-1111-111", "홍길동", 0);
}
public Account2(String accountNo) {
this(accountNo, "홍길동", 0);
}
public Account2(String accountNo, String ownerName) {
this(accountNo, ownerName, 0);
}
public Account2(String accountNo, String ownerName, int balance) {
this.accountNo = accountNo;
this.ownerName = ownerName;
this.balance = balance;
}
public String getAccountNo() {
return accountNo;
}
public void setAccountNo(String accountNo) {
this.accountNo = accountNo;
}
public String getOwnerName() {
return ownerName;
}
public void setOwnerName(String ownerName) {
this.ownerName = ownerName;
}
public int getBalance() {
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
// 계좌정보를 출력하는 showAccountInfo() 메서드 정의
public void showAccountInfo() {
System.out.println("계좌번호 : " + accountNo);
System.out.println("예금주명 : " + ownerName);
System.out.println("현재잔고 : " + balance);
}
}
<a href="http://colorscripter.com/info#e" target="_blank" st
|
이번엔 this. 문법을 배워보았는데 앞서 배웠던 Getter/Setter를 배울 때 보았던 문법이었다.
이게 뭐지라고 생각했던 것인데 알고 나니 간단하면서도 좋은 기능을 하는 친구였다.
파라미터로 입력을 할 때 인스턴 수변수의 값을 초기화할 때 입력하는 파라미터의 이름을 인스턴스 변수와 이름을 같게 했을 경우 먼저 저장된 인스턴스 변수를 불러와 이름의 중복이 발생하지 않게 해주는 기능이었다.
배우고 나서 테스트로 Getter/Setter와 저번에 배웠던 은행계좌 클래스를 활용한 메서드를 통해서
실습으로 다듬고 나니 확실히 체득이 된다라고 느꼈다.
여러 클래스와 메서드들이 합쳐지고 활용될 때 헷갈리지 않게 해 주니 잘 기억해놓고 활용해야 하겠다.
'Java' 카테고리의 다른 글
Java - 상속(inheritance),패키지활용 (0) | 2020.06.14 |
---|---|
Java - static 키워드, 싱글톤디자인패턴 (0) | 2020.06.14 |
Java - 생성자, 생성자 오버로딩 (0) | 2020.06.13 |
Java - 가변인자, 접근제한자,Getter/Setter (0) | 2020.06.13 |
Java - 메서드 오버로딩 (0) | 2020.06.13 |