this의 규칙과 사용이유
예제를 통해 무슨말인지 알아보도록 하자.
우선 인스턴스형 맴버와 정적맴버들을 만들자.
이제 인스턴스형 메소드안과 정적메소드안에서 this를 각각 사용해보도록 하자
우선 인스턴스형 메소드안부터 해보자
▲ 맨 위 this의 규칙에서도 말했지만 this는 자기가 속해있는 클래스를 가리킨다. 즉, this는 곧 클래스라고 생각하면된다. 따라서 우리가 A라는 클래스에서 B라는 클래스를 선언과 동시에 인스턴스화를 하고 나면 B. 으로 B클래스에 소속되어 있는 맴버들을 사용할 수있듯이 this. 하면 해당 this가 소속되어있는 클래스의 모든 맴버들을 사용할 수 있는 것이다.
또한 this의 규칙에서 this는 인스턴스형 맴버에 접근할 때 사용하는 키워드라고 했지만 정적맴버에 접근할 때 사용해도 error가 생기지 않는다. 우리가 정적맴버를 사용할 때 '클래스명.맴버명' 의 형식으로 쓰듯이 어차피 this는 곧 클래스이기 때문이다.
하지만 정적맴버인데 this를 사용한다면 다른 사람이 코드를 보았을 때 this뒤에있는 것이 인스턴스형이라고 생각할 수 있기 때문에 정적맴버사용시에는 사용하지 말자. 또한 프로그램 자체에서도 정적맴버는 static way로 사용하라고 경고를 준다.
이번에는 정적메소드안에서 사용해보자
▲ 정적 메소드안에서 this. 하고 점을 찍으면 아무것도 뜨지 않는다. this는 JVM에서 마지막 단계인 interprter단계에서 생성되기때문에 정적맴버가 생성되는 Class Loader단계에서는 아직 생성이 안되었기 때문이다.
이러한 이유로 this는 인스턴스형 메소드 안에서만 사용해야하는 것이다.
this의 주된 사용이유는 역시나 지역변수와 맴버변수가 충돌할 때이다.
▲ 우리가 제일 위에서 선언했던 int instanceVar를 초기화하기 위하여 인자로 받은 값을 initialize 메소드의 매개변수 instanceVar로 받고 다시 그것을 초기에 선언한 인스턴스형 변수 instanceVar에 대입하려고 하기위해 위와 같은 코드를 썼다.
하지만 위의 코드를 통해서 최초의 instanceVar는 초기화되지 않는다. 왜일까?
바로 위 코드에서는 매개변수 instanceVar로 받은 값을 다시 자기자신인 매개변수에 넣고 있는 것이다.
왜냐하면 초기에 선언한 맴버변수와 현재 initialize라는 메소드 안에있는 지역변수는 instanceVar라는 동일한 이름을 가지고 있다. 이때는 지역변수를 우선해서 인식하기 때문에 initialize라는 메소드안에서 instanceVar는 초기에 생성한 인스턴스형 변수가 아닌 것이다.
▲ 이처럼 지역변수와 맴버변수가 동일할때는 구분을 위해서 this를 사용해주는 것이다. this는 해당 소속 클래스를 뜻하는 것이므로. this.instanceVar 라고 하면 클래스.instanceVar와 동일한 뜻이므로 클래스의 맴버변수를 가리키게된다.
▲ 만일 맴버변수와 지역변수의 이름이 다르면 구분가능하므로 굳이 사용하지 않아도 된다.
▲ 만일 정적맴버와 지역변수가 동일할 때는 this가 아닌 클래스명.정적맴버명 과 같은 방식으로 사용하자.
this를 사용해도 error는 나지 않지만 프로그램도 static맴버들을 static way를 사용하라고 경고도 주고, 무엇보다 다른 개발자들이 코드를 봤을 때 this. 뒤에있는 것을 정적맴버가 아닌 인스턴스형 맴버로 착각할 수 있기때문이다.
'Java' 카테고리의 다른 글
[Java]생성자(Constructor) (0) | 2022.03.11 |
---|---|
[Java]Over loading(중복 정의) (0) | 2022.03.11 |
[Java]캡슐화(Encapsulation) - 진짜 캡슐화 (0) | 2022.03.11 |
[Java]캡슐화(Encapsulation) - Getter와 Setter (0) | 2022.03.11 |
[Java]Date 클래스 (0) | 2022.03.10 |