(스코프 대량,체크 한거 1개 나머지는 가볍게 눈으로)

류한선·2025년 6월 20일

실기연습-2

목록 보기
12/95

✅ 문제 2 – 배열 인덱스 실수 유도 (체크)

🔢 원본 코드

public class Main {
    public static void main(String[] args) {
        int[] arr = new int[5];
        for (int i = 0; i <= arr.length; i++) {
            arr[i] = i * 2;
        }

        System.out.println("arr[3] = " + arr[3]);
    }
}

🔍 줄별 디버깅 해설

1️⃣ int[] arr = new int[5];

  • 길이가 5인 int 배열을 생성한다.

  • 인덱스는 0~4까지 사용 가능.

  • 현재 상태:

    arr = [0, 0, 0, 0, 0]

2️⃣ for (int i = 0; i <= arr.length; i++)

  • 반복문 시작: 조건이 i <= arr.length다.

  • arr.length == 5이므로,

    i는 0부터 5까지 총 6번 실행됨
    i = 0, 1, 2, 3, 4, 5

⚠️ 문제 발생 시점

  • arr[5]는 존재하지 않는다 (0~4까지 있음)
  • i == 5일 때 arr[5] = 10; 이런 식으로 접근하면 ArrayIndexOutOfBoundsException 발생

❌ 결과

  • 런타임 에러 (예외 발생)
  • 실행 중단됨

✅ 정답:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5

✅ 문제 3 – 조건문 블록 오해 유도

🔢 원본 코드

public class Main {
    public static void main(String[] args) {
        int x = 10;

        if (x > 5)
            System.out.println("크다");
            System.out.println("조건문 끝");

        System.out.println("끝");
    }
}

🔍 디버깅 해설

1️⃣ int x = 10;

  • 변수 x 선언 및 초기화

2️⃣ if (x > 5)

  • 조건식 x > 510 > 5true

3️⃣ System.out.println("크다");

  • if 바로 아래 한 줄만 조건문에 포함됨
  • 중괄호 {} 없으므로 크다만 조건문에 속함

4️⃣ System.out.println("조건문 끝");

  • 이 줄은 조건문과 무관
  • 무조건 실행됨

5️⃣ System.out.println("끝");

  • 마지막 줄, 역시 무조건 실행됨

✅ 최종 출력 결과:

크다
조건문 끝
끝

💡 오답을 유도하는 핵심:
if 조건문에 {}이 없을 때는 딱 한 줄만 조건에 들어감.
실수로 아래 줄도 조건문 안으로 생각하는 경우가 많음.


✅ 문제 4 – 변수 스코프 범위 문제

🔢 원본 코드

public class Main {
    public static void main(String[] args) {
        int num = 20;
        {
            int num2 = 10;
            num = num2 + 5;
        }
        System.out.println(num2);
    }
}

🔍 해설

1️⃣ int num = 20;

  • 변수 nummain 함수 전체에서 사용 가능

2️⃣ { int num2 = 10; ... }

  • 이 중괄호 블록은 지역 블록이므로, 여기 안에서 선언된 num2밖에서 못 씀

  • num2는 이 블록 내부에서만 유효함


3️⃣ System.out.println(num2);

  • 현재 이 줄은 num2를 접근하려고 함
    하지만 num2는 위 블록 안에서 선언되어 스코프 밖

✅ 결과:

컴파일 오류:
Cannot find symbol - variable num2

🔍 스코프(Scope)란?

변수가 선언된 위치에 따라, 어디까지 그 변수를 사용할 수 있는지를 말해.


✅ 스코프의 종류 요약

종류설명예시 사용 가능 위치
클래스 스코프클래스 전체에서 접근 가능 (static 제외)모든 메서드 내부
메서드 스코프해당 메서드 내부에서만 사용 가능지역 변수 등
블록 스코프{} 블록 안에서 선언된 변수 (for, if 등)해당 블록 내부

✅ 실전 예제 1 – if 블록 안 변수 사용

public class Main {
    public static void main(String[] args) {
        if (true) {
            int a = 10;
            System.out.println(a);  // OK
        }

        System.out.println(a);  // ❌ 컴파일 오류 (a는 if블록 안에서만 유효)
    }
}

🧠 해설:

  • int a = 10;if 블록 내부 변수
  • System.out.println(a); (if 밖) → a는 이 위치에서 없음

✅ 실전 예제 2 – for 루프 변수 스코프

public class Main {
    public static void main(String[] args) {
        for (int i = 0; i < 3; i++) {
            System.out.println(i);  // OK
        }

        System.out.println(i);  // ❌ 오류: i는 for문 안에서만 존재
    }
}

🔍 왜 오류?

  • int i = 0for문의 초기식에서 선언됨 → for문의 블록 안에서만 유효

✅ 실전 예제 3 – 변수 이름 충돌 (shadowing)

public class Main {
    static int x = 5;

    public static void main(String[] args) {
        int x = 10;

        System.out.println(x); // 출력값은?
    }
}

💡 출력은?

10

🧠 이유:

  • main 안에서 새로 선언된 int x = 10;
    클래스의 static int x = 5;가려버림(shadowing)

✅ 실전 예제 4 – 함수 파라미터와 로컬 변수 충돌

public class Main {
    public static void printSum(int a) {
        int b = 5;
        int a = 3; // ❌ 오류: 변수 a는 이미 파라미터로 존재
        System.out.println(a + b);
    }
}

❌ 컴파일 오류:

  • a는 이미 파라미터로 선언됨 → 같은 이름의 로컬 변수 선언 불가

✅ 실전 예제 5 – 블록 바깥에서 선언하면?

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

        for (int i = 0; i < 3; i++) {
            int temp = i * 2;
            sum += temp;
        }

        System.out.println(temp); // ❌ temp는 for문 안에서만 사용 가능
    }
}

✅ 실전 예제 6 – 같은 이름 재선언 허용?

public class Main {
    public static void main(String[] args) {
        int a = 5;
        {
            int a = 10; // ❌ 같은 블록 내에서 변수 이름 중복 선언 불가
        }
    }
}

❌ 오류 이유:

  • 같은 이름의 변수는 같은 메서드 스코프 내에서 재선언 불가

✅ 실전 예제 7 – 내부 블록은 바깥 변수 참조 가능

public class Main {
    public static void main(String[] args) {
        int outer = 100;

        {
            int inner = outer + 50; // OK: 외부 스코프 변수 사용 가능
            System.out.println(inner); // 150
        }

        System.out.println(inner); // ❌ inner는 블록 밖에서 사용 불가
    }
}

🧠 핵심 정리

사례변수 접근 가능 여부
바깥 변수 → 안쪽 블록가능 ✅
안쪽 변수 → 바깥 블록불가능 ❌
중첩 블록 안에서 이름 중복불가능 ❌ (같은 스코프 내)
메서드 파라미터와 중복불가능 ❌

🎯 정보처리기사 실기 포인트

  • 스코프 문제는 대부분 컴파일 오류 유도 문제

  • 자주 출제되는 패턴:

    • if나 for 안에서 선언된 변수 바깥에서 사용
    • 파라미터와 같은 이름의 변수 선언
    • 블록 중첩 시 변수 이름 중복
    • shadowing 문제

좋아! 그럼 지금부터 위의 스코프 연습문제 10문제에 대해
하나하나 디버깅 수준으로 상세하게 해설해줄게.
각 줄에서 무슨 일이 일어나는지, 어떤 변수들이 어떤 범위에서 유효한지 모두 설명할게!


✅ 문제 1

public class Main {
    public static void main(String[] args) {
        int x = 5;
        {
            int x = 10;
            System.out.println(x);
        }
    }
}

🔍 해설:

  • int x = 5;main() 안에서 x라는 이름의 변수를 선언함 (메서드 스코프)

  • { int x = 10; ... }같은 스코프 내에 다시 x를 선언하려 함

    • 하지만 자바에서는 같은 메서드 스코프 내에서 변수 이름을 중복 선언할 수 없음.
    • 블록 안이라도 이전 x가 유효한 상태이므로, 컴파일 에러 발생!

❌ 결과: 컴파일 오류

❗ 이유: variable x is already defined in method main(String[])


✅ 문제 2 (체크)

public class Main {
    public static void main(String[] args) {
        {
            int a = 3;
        }
        System.out.println(a);
    }
}

🔍 해설:

  • { int a = 3; } → a는 이 블록 안에서만 살아있는 블록 스코프 변수
  • System.out.println(a); → 이 줄은 a가 선언된 블록 바깥 → 접근 불가

❌ 결과: 컴파일 오류

❗ 이유: a cannot be resolved to a variable


✅ 문제 3

public class Main {
    static int value = 100;

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

🔍 해설:

  • 클래스 스코프에 static int value = 100;
  • 하지만 main() 안에서 int value = 50;을 새로 선언함
  • 이 경우, 로컬 변수가 클래스 변수와 이름이 겹쳐도 덮어쓰기 됨 → shadowing

✅ 출력: 50


✅ 문제 4

public class Main {
    public static void main(String[] args) {
        int x = 1;
        if (x < 10) {
            int y = 5;
        }
        System.out.println(y);
    }
}

🔍 해설:

  • int y = 5;if 블록 안에서 선언됨 → 블록 스코프
  • System.out.println(y);는 if 밖 → y 접근 불가

❌ 결과: 컴파일 오류

❗ 이유: y cannot be resolved to a variable


✅ 문제 5

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

🔍 해설:

  • int sum = ...for 블록 안에서 선언됨 → for문 안에서만 유효
  • 바깥에서 sum을 출력하려고 하므로 → 접근 불가

❌ 결과: 컴파일 오류

❗ 이유: sum cannot be resolved to a variable


✅ 문제 6

public class Main {
    public static void main(String[] args) {
        int a = 1;
        {
            int b = 2;
            {
                int c = 3;
                System.out.println(a + b + c);
            }
            System.out.println(c);
        }
    }
}

🔍 해설:

  • c는 가장 안쪽 블록에서만 유효함
  • System.out.println(c);c가 선언된 블록 바깥 → 접근 불가

❌ 결과: 컴파일 오류

❗ 오류 줄: System.out.println(c);
❗ 이유: c cannot be resolved to a variable


✅ 문제 7

public class Main {
    public static void print(int num) {
        int num = 10;
        System.out.println(num);
    }
}

🔍 해설:

  • 파라미터로 int num이 이미 선언되어 있음
  • 같은 메서드 안에서 같은 이름의 지역변수 재선언 불가

❌ 결과: 컴파일 오류

❗ 이유: variable num is already defined in method print(int)


✅ 문제 8

public class Main {
    static int x = 20;

    public static void test() {
        System.out.println(x);
    }

    public static void main(String[] args) {
        int x = 10;
        test();
    }
}

🔍 해설:

  • main 안의 x = 10은 지역 변수
  • test()는 자신의 지역 x가 없으므로 클래스의 static int x = 20 사용

✅ 출력: 20


✅ 문제 9

public class Main {
    public static void main(String[] args) {
        int a = 1;
        int a = 2;
        System.out.println(a);
    }
}

🔍 해설:

  • 같은 메서드 스코프 안에서 같은 이름의 변수 재선언은 불가

❌ 결과: 컴파일 오류

❗ 이유: variable a is already defined in method main(String[])


✅ 문제 10

public class Main {
    static int x = 10;

    public static void main(String[] args) {
        x = x + 5;  // 클래스 변수 x = 15
        {
            int x = 3;  // 이 x는 지역 변수, 클래스 x를 가림
            x = x + 1;  // 지역 변수 x = 4
        }
        System.out.println(x); // 출력되는 것은 클래스 변수 x = 15
    }
}

✅ 출력: 15


✅ 정리 요약

문제정답이유 요약
1컴파일 오류같은 스코프 내에서 변수 이름 중복 선언
2컴파일 오류블록 밖에서 지역 변수 접근
350지역 변수가 클래스 변수 shadowing
4컴파일 오류if 블록 바깥에서 y 접근
5컴파일 오류for 블록 바깥에서 sum 접근
6컴파일 오류중첩 블록 안의 c는 바깥에서 접근 불가
7컴파일 오류파라미터와 같은 이름 변수 재선언
820test()는 클래스 변수 x 사용
9컴파일 오류같은 스코프에서 변수 중복 선언
1015지역변수 x는 블록 안에서만 유효, 바깥은 클래스 변수

0개의 댓글