ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [자바] 유효범위
    자바 2022. 8. 4. 11:44
    728x90

    유효범위

    프로그램이 커지면서 여러가지 이유로 이름이 출돌하는데, 이를 해결하기 위해 유효범위가 생김

     

    유효범위를 보이는 코드

    public class ScopeDemo {
        static void a() {
            int i = 0; // 지역변수
        }
        
        public static void main(String[] args) {
            for(int i = 0; i < 5; i++) {
                a();
                System.out.println(i);
            }
        }
    }

     

    유효범위를 이해하기 위해서는 디렉토리를 생각을 하면 된다.

     

    변수의 유효범위를 통해 for문에 영향을 끼치는 예시 코드 ( 무한 루프 예제 )

    public class ScopeDemo1 {
        static int i; // 전역 변수
        static void a() {
            i = 0; 
        }
        
        public static void main(String[] args) {
            for(i = 0; i < 5; i++) { // for문 안에 int를 생략했다는 점이 다르다
                a();
                System.out.println(i);
            }
        }
    }
    
    // 무한 루프를 일으키지 않는 방법은 기존에 지역변수를 쓰는 방식 or 아래 코드
    public class ScopeDemo1 {
        static int i; // 전역 변수
        static void a() {
            // 이 부분
            int i = 0; 
        }
        
        public static void main(String[] args) {
            // 이 부분
            for(int i = 0; i < 5; i++) { 
                a();
                System.out.println(i);
            }
        }
    }
    // 지역변수로 전언을 하던가 or for문 안에 int를 넣는 방법이 있다

     

    다양한 유효범위

    public class ScopeDemo2 {
        static int i = 5;
        
        static void a() { // 1 - 1
            int i = 10; // a 메소드의 지역변수로 사용이 되지 않는다.
            b(); // 2번
        }
        
        static void b() { // 2번
            // int i = 30;  이렇게 있다면 지역변수 30을 사용해서 30이 호출된다.
            System.out.println(i); // 전역변수 5를 사용한다.
            // 만약 전역변수가 없다면 i는 호출되지 않는다.
        }
        
        public static void main(String[] args) {
            a(); // 1번
        }
    }
    
    // 5를 호출한다 ( 전역변수를 사용한다는 것이다. )

    - 결국 정적인 유효범위는 b안에서 결과를 print하므로 b안의 지역변수 혹은 전역변수를 생각하면 된다.

     

    this

    class C {
        int v = 10;
        
        void m() {
            // int v = 20; 이라는 지역변수가 있다면 지역변수의 우선순위가 전역보다 높으니 20이 출력된다
            // 없다면, v = 10이 출력된다.
            System.out.println(v); // 지역변수 20 출력
            System.out.println(this.v); // 전역 변수 10이 출력
            
            // this가 있으면, 전역의 의미를 갖는다.
        }
    }
    
    public class ScopeDemo {
        public static void main(String[] args) {
            C c1 = new C();
            c.m();
        }
    }
    
    this의 또 다른 예시
    class C {
        int left, right;
        
        public void setOperand(int left, int right) {
            this.left = left; // 인자로 받는 값을 전역변수의 값에(this) 대입을 하여 사용한다는 의미
            this.right = right;
        }
        
        /*
        public void setOperand(int _left, int _right) {
            left = _left; 
            right = _right;
        }    
        this를 쓰기전 변수의 이름이 겹치지 않는다면, this를 쓰지 않아도 이름이 겹치지 않기에 this와 같은 역할이 가능하다
        */
    }
    - 지역변수가 우선순위가 전역변수보다 우선순위가 높다는 말은 값이 조금 더 구체적일수록 우선순위가 높다.
    - this가 있으면, 전역의 의미를 갖는다. ( this가 붙으면 전역변수를 의미한다. )

    '자바' 카테고리의 다른 글

    [자바] 오버로딩, 오버라이딩  (0) 2022.08.05
    [자바] 생성자 및 상속  (0) 2022.08.04
    [자바] 클래스 멤버와 인스턴스 멤버  (0) 2022.08.04
    [자바] 메소드  (0) 2022.08.04
    [자바] 입출력  (0) 2022.07.26
Designed by Tistory.