자바 초보부터 B형까지7 -변수의 범위, 지역변수, 전역변수 설정방법-

1. 자바에서 전역변수 선언

 

class내에서 맨 위에 public static이라고 선언한 변수는 global 변수가 된다.

 

그래서 해당 class내의 모든 함수,class내에서 해당 global 변수를 참조할 수 있게 된다

 

public class Main {
    
    //arr은 모든 함수에서 참조할 수 있게 된다
    public static int[] arr = new int[]{1, 2, 3, 4};

    public static int sumAll() {
        int sum = 0;
        for(int i = 0; i < 4; i++)
            sum += arr[i];
        
        return sum;
    }

    public static void main(String[] args) {
        int totalSum = sumAll();
        System.out.println(totalSum);
    }
}

>> 10

 

 

2. 변수의 scope

 

자바도 마찬가지로 함수 안에서 정의한 변수는, 그 함수를 벗어나면 더 이상 쓰일 수 없다.

 

public class Main {
    public static int[] arr = new int[]{1, 2, 3, 4};

    public static int sumAll() {
        int sum = 0;
        for(int i = 0; i < 4; i++)
            sum += arr[i];
        
        return sum;
    }

    public static void main(String[] args) {
        int totalSum = sumAll();
        System.out.println(sum);
    }
}

>> 
Main.java:14: error: cannot find symbol
        System.out.println(sum);
                           ^
  symbol:   variable sum
  location: class Main
1 error

 

특히 자바는 for문도 하나의 local scope로 생각하여 해당 for문 내에서 정의한 변수는 for문을 벗어나면 사용할 수 없다 

 

public class Main {
    public static void main(String[] args) {
        for(int i = 0; i < 4; i++) {
            int sum = 0;
            for(int j = 0; j < 4; j++) {
                int x = j;
                sum += x;
            }
            System.out.println(x);
        }
    }
}


>> 
Main.java:9: error: cannot find symbol
            System.out.println(x);
                               ^
  symbol:   variable x
  location: class Main
1 error

 

 

3. 연습문제

 

다음과 같이 작성된 코드의 출력결과를 예상해본다면?

 

public class Main {
    public static int a = 10, b = 20;

    public static void printAandB() {
        System.out.println(a + " " + b);
    }

    public static void modify(int a, int b) {
        System.out.println(a + " " + b);
        printAandB();
        int temp = a;
        a = b;
        b = temp;
    }

    public static void main(String[] args) {
        modify(50, 60);
        printAandB();
    }
}

 

main이 먼저 수행되어.. modifiy(50,60)이 수행

 

modifiy(50,60)내에서 System.out.println(a + " " + b);가 수행되어 50 60을 출력

 

그리고 printAandB()가 수행되는데...

 

public static void printAandB() {
        System.out.println(a + " " + b);
    }

 

여기 a,b는 어떤 a,b인가..?

 

public static void modify(int a, int b) {

 

modify함수의 int a, int b인가?

 

public static int a = 10, b = 20;

 

global 영역의 int a, int b인가?

 

printAandB()가 a,b를 인자로 받지 않으므로 printAandB()함수는 global 영역의 a,b를 참조하게 된다

 

그래서 10 20이 출력된다

 

그리고 50,60을 swap하지만 함수 밖으로 나가면 끝이지

 

그리고 main의 printAandB()를 수행하는데.. 역시 아무런 인자를 받지 않고 a,b를 참조하고 있으므로,.. 

 

global 변수의 a,b를 참조하여 10 20이 출력된다

 

50 6010 2010 20

 

보통 참조가 가능하며, 가장 가까이에 있는 변수를 먼저 찾게 된다

TAGS.

Comments