자바를 공부하다보면 this라는 것이 나온다. 이는 파이썬에서 self와 비슷하다.
하지만 왜 쓰는지 이유가 햇갈릴 때가 있다.
어떠한 개념이 나왔다는 것은 어떠한 문제점이 발생하여 해당 개념을 도입했다는 것이다.
발생한 문제점이 무엇인지 먼저 살펴보자.
Problem)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class Main {
public static void main(String args[]) {
User u = User("회원1", 1);
}
}
class User {
private String name;
private int num;
public User(String name, int num){
name = name;
num = num;
}
}
|
cs |
* 실행 로직
1. Main 클래스에서 u객체는 User를 참조하여 회원1, 1 이라는 객체를 생성한다.
2. User() 메소드 즉 생성자에서 String name과, int num 을 받는다.
(문제 발생)
3. 하지만 이 때 필드에서 선언된 private String name과 private int num;과 이름이 중복된다.
private String name = null;(초기값)
private int num = 0;(초기값)
이 때 User("회원1", 1)로 들어오게 되면
name = "회원1" - > name = "회원1"로 담는 현상이 발생
num = 1 - > num = 1 로 담는 현상이 발생
즉, 자기 자신이 자기 자신을 담는 현상이 발생한 것이다.
그렇기에 컴파일 순서로 인해 결과적으로 null과 0으로 출력이 되어버린다.
그렇다면
"회원1"과 1을 출력할려면 어떻게 해야할까?
Solution)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class Main {
public static void main(String args[]) {
User u = User("회원1", 1);
}
}
class User {
private String name;
private int num;
public User(String name, int num){
this.name = name;
this.num = num;
}
}
|
cs |
A)
수행 객체를 명확하게 지정해주는 this를 쓰면 된다.
this.name은 필드 name을 가리킨다. 즉 초기 값 null을 가리킴
this.num은 필드 num을 가리킨다. 즉 초기 값 0을 가리킴
즉, 명확한 주체를 지정해주는 것이다.
[ 그림으로 이해하기 ]
< this >
name : null
num : 0
< User >
name : 회원1
num : 1
그러면 자동적으로 null을 회원1로 바꾸어 실행순서에 알맞게 회원1이 출력된다.
정 리
this란?
- 객체를 명확하게 지정해준다.
'* Web > [Back] Java' 카테고리의 다른 글
[Java] 자바 : 메소드 오버로딩(Overloading) vs 메소드 오버라이딩(Overiding) 차이점? (0) | 2021.03.18 |
---|---|
[Java] 자바 : (상속) 업 캐스팅 개념? (0) | 2021.03.18 |
[Java] 자바 : 접근 제한자 private을 우회적으로 접근하는 getter, setter 이해하기 (0) | 2021.03.17 |
[Java] 자바 : 접근 제한자 큰 그림 이해하기 (0) | 2021.03.17 |
[Java] 자바 : static의 개념은 무엇이고 왜 사용할까? (0) | 2021.03.16 |
댓글