자바

[자바] 유효범위

j9972 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가 붙으면 전역변수를 의미한다. )