Scope 형 변환

황상익·2024년 3월 19일

Inflearn JAVA

목록 보기
7/61

스코프
지금까지 정리한 내용들은 지역변수를 갖고 학습. 지역변수는 이름 그래동 특정 지역지역에서만 사용 할 수 있는 변수. 특정 지역을 벗어나면 사용 할 수 없다.
지역이 바로 변수가 선언된 코드 블록 {}. 지역변수는 자신이 선언된 코드 블록 {} 안에서만 생존, 선언된 코드 블록을 벗어나면 제거

public class Scope1 {
    public static void main(String[] args) {
        int m = 10; //m 생존 시작
        if (true){
            int x = 20; //x 생존 시작
            System.out.println("If m = " + m);
            System.out.println("If x = " + x);
        } //x 생존 끝

        //System.out.println("x = " + x); -> x는 접근 불가
        System.out.println("m = " + m); //-> 접근가능
    }
}

정리하자면 지역변수는 본인의 코드 블록 안에서만 생존. 그리고 자신의 코드 블록 안에서는 언제든지 접근 할 수 있다.

변수의 접근 가능 범위를 Scope라고 한다.

public class Scope2 {
    public static void main(String[] args) {
        int m = 10;
        for (int i = 0; i < 2; i++) {
            System.out.println("for m = " + m);
            System.out.println("for i = " + i);
        }// i 생존 끝

        //System.out.println("i` = " + i); -> i 접근 불가능
        System.out.println("main m = " + m);
    }
}

for 문 안에서 초기식에 직접 변수를 선언할 수 있다.
선언한 변수는 for문 코드 블록 안에서만 사용 가능하다.

그렇다면 스코프는 왜 필요할까 ?

public class Scope3_1 {
    public static void main(String[] args) {
        int m = 10;
        int tmp = 0;

        if (m > 10) {
            tmp = m * 2;
            System.out.println("tmp = " + tmp);
        }
        System.out.println("m = " + m);
    }
}

우선 좋은 코드일까 ???
아니라고 볼 수 있다. tmp 변수는 임시변수로 if문 안에서만 잠시 사용하는 것인다. 그런데 임시 변수가 main 변수에 선언되어 있다.

  • 비효율적 메모리 사용
    코드 블록이 종료 될때 까지 메모리에 유지. 불필요한 메모리 낭비.
  • 코드 복잡성 증가
    tmp는 if 코드 블록에서만 필요하고, 만약 if 코드 블록안에 temp를 선언, if
    가 끝나고 나면 생각 굳이 안해도 된다.
public class Scope3_2 {
    public static void main(String[] args) {
        int m = 10;

        if (m > 10) {
            int tmp = m * 2;
            System.out.println("tmp = " + tmp);
        }
        System.out.println("m = " + m);
    }
}

tmp를 if 코드 블록 안에 선언. scope 범위 줄어든다. 유지 보수 하기 조금더 좋아진 코드를 볼 수 있다.

While vs for

while

public class While2_3 {
    public static void main(String[] args) {
        int sum = 0;
        int i = 1;
        int endNum = 3;

        while (i <= endNum){
            sum = sum + i;
            System.out.println("i = " + i);
            System.out.println("sum = " + sum);
            i++;
        }
    }
}

for

public class For2 {
    public static void main(String[] args) {
        int sum = 0;
        int endNum = 3;

        for (int i = 0; i <= endNum ; i++) {
            sum += i;
            System.out.println("i = " + i);
            System.out.println("sum = " + sum);
        }
    }
}

둘 차이점은 뭘까 ??
while문의 경우 변수 i가 스코프 main 메서드 전체가 된다. for문의 경우 변수 i의 스코프가 for문으로 한정
따라서 변수 i와 같이 for문 안에서만 사용되는 카운터 변수가 있다면, while문 보다는 for문을 사용해서 scope범위를 제한

profile
개발자를 향해 가는 중입니다~! 항상 겸손

0개의 댓글