ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (JAVA) 자바 변수의 범위(Scope)와 참조 & this
    JAVA/컨셉 , 예제 2018. 8. 24. 11:03

    자바 클래스에서 변수는 멤버 필드 공간과 메서드 내에서 존재할 수 있다. 또한 변수가 속한 범위 (Scope. { 부터 } 까지 ) 내에서 존재하며 참조 가능하다. 다음 코드를 보자.

    메인 함수에서 This 클래스 객체를 생성해 fun 함수를 수행한 결과이다. 
    컴파일러가 num 변수를 찾는 과정에 대해 알아보자.
    1. 컴파일러는 num 변수를 해당 변수가 포함된 블럭에서 처음으로 찾는다. 
    2. fun() 함수 안에 num 변수가 있기 때문에 이를 참조한다. 따라서 200이 출력된다.

    만약 fun()에서 num 변수가 없다면 어떻게 될까?

    1. 컴파일러는 num값을 fun()에서 찾는다.
    2. num값이 fun() 내에서 없기 때문에 해당 블럭 바깥 구역인 This 클래스 내에서 num 변수를 찾는다. 
    3. num 값이 100으로 선언되었기 때문에 100이 출력된다.

     fun() 함수의 영역을 벗어나 클래스 필드에서 num을 참조해 출력한다. 이클립스를 이용하면 해당 변수가 어느 곳을 참조하고 있는지 알 수 있는 방법이 있다. 빨간 박스와 같이 색깔이 같은 변수를 참조하고 있는 것이다. 

    두번째 경우에는 문제될 것이 없지만 첫번째 경우에는 fun() 함수 내에서 This class의 num 값에 접근할 수 있는 방법이 없다. 이를 해결하기 위해 자바는 this 키워드를 지원한다. this 를 이용해 num() 함수 내에서도 This 클래스의 멤버 필드 num 값에 접근할 수 있다. 

    ※ 여기서 멤버 필드와 인스턴스 변수는 거의 같은 의미로 사용되었다. 프로그래밍에서는 같은 것을 여러가지 명칭으로 호칭하고 또한 그 범위도 사용자에 따라 굉장히 가변적이다. 그렇기 때문에 명칭에 크게 구애받지 않고 어느 부분을 말하는지 이해하는 것이 중요하다고 생각한다.

    9라인에서 num 변수 값을 출력하기 위해 참조를 한다. 그냥 num으로 작성했다면 같은 스코프 내에 있는 7번 num의 200이 참조되겠지만 this 키워드를 사용했기 때문에 클래스의 멤버 필드에서 num값을 참조해와 100이 출력되는 것이다.

    프로그래밍 언어에서 배운 Scope 룰과 더불어 공부하니 더 이해가 잘 가게 되었다.


Designed by Tistory.