함정1

류한선·2025년 6월 18일

실기연습-2

목록 보기
3/95

좋아! 그럼 너가 요청한 대로 한 줄도 빠짐없이, 예제를 넣고 변수 값이 어떻게 변하는지도 시각적으로, 마치 디버깅 하듯이 한 줄씩 설명할게.
문제 1번부터 순서대로 천천히 해설해줄게.


✅ 문제 1 – 연산자 우선순위, 전위/후위 연산자

🔢 원본 코드

public class Main {
    public static void main(String[] args) {
        int a = 5;
        int b = 10;
        int c = 0;

        c = a++ + ++b * 2 - b-- / 2 + ++a;

        System.out.println("a = " + a);
        System.out.println("b = " + b);
        System.out.println("c = " + c);
    }
}

🔍 분석 순서 및 디버깅 해설

1️⃣ int a = 5;

  • 변수 a를 선언하고 5로 초기화한다.

  • 이 시점:

    a = 5

2️⃣ int b = 10;

  • 변수 b를 선언하고 10으로 초기화한다.

  • 현재 상태:

    a = 5
    b = 10

3️⃣ int c = 0;

  • 변수 c를 선언하고 0으로 초기화한다.

  • 현재 상태:

    a = 5
    b = 10
    c = 0

🔥 가장 중요한 줄:

c = a++ + ++b * 2 - b-- / 2 + ++a;

이 줄이 핵심이다. 연산자 우선순위와 후위/전위 증감 연산자의 개념이 제대로 되어 있지 않으면 틀리게 된다.


📌 우선순위 기준에 따라 나눠보자:

  1. ++, -- (전위/후위 증감) → 먼저 수행됨 (단항 연산자)
  2. *, / → 그다음 (곱셈/나눗셈)
  3. +, - → 마지막 (덧셈/뺄셈)
  4. 대입 =은 마지막에 변수에 값을 넣는 거야

🚧 이제 하나씩 계산해보자

현재 상태:

a = 5
b = 10

a++

  • 후위 증가: 값을 먼저 사용하고, 그 다음에 a를 증가시킴
  • 사용된 값: 5
  • 이후 a = 6

++b

  • 전위 증가: 먼저 증가시키고 사용
  • b10 → 증가해서 11 → 이 값이 사용됨

++b * 2

  • 계산: 11 * 2 = 22

b--

  • 후위 감소: 값을 먼저 사용 (b = 11인 상태), 그 다음 b = 10로 감소
  • 사용된 값: 11

b-- / 2

  • 계산: 11 / 2 = 5 (정수 나눗셈이므로 몫만 사용)

++a

  • 현재 a = 6 → 증가해서 7, 이 값이 사용됨

전체 수식 정리:

c = a++ + ++b * 2 - b-- / 2 + ++a
  = 5   +   11 * 2  - 11 / 2  + 7
  = 5   +   22      - 5       + 7
  = 29

🌟 최종 변수 상태:

  • a = 7 (→ 5 → 6(후위) → 7(전위))
  • b = 10 (→ 10 → 11(전위) → 10(후위 감소))
  • c = 29

✅ 최종 출력 결과:

a = 7
b = 10
c = 29

좋아, 그럼 아까 낸 5문제 전부Java 초보자가 실수하기 쉬운 포인트 중심으로,
각 줄마다 "무슨 일?", "왜 여기?", "무슨 값?" 기준으로 디버깅 해설 + 예시 계산까지 해줄게.


✅ 문제 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 발생

❌ 결과

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

🧠 고쳐야 할 부분

for (int i = 0; i < arr.length; i++)  // < 로 바꿔야 해!

✅ 정리

항목설명
원래 오류i <= arr.length → i가 5일 때 arr[5] → 범위 초과
해결 방법조건을 i < arr.length로 수정
핵심 개념자바 배열 인덱스는 0 ~ length - 1

✅ 정답:

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

✅ 문제 5 – 반복문 + continue 흐름 제어

🔢 원본 코드

public class Main {
    public static void main(String[] args) {
        int count = 0;
        for (int i = 0; i < 5; i++) {
            if (i % 2 == 0)
                continue;
            count += i;
        }
        System.out.println("count = " + count);
    }
}

🔍 흐름 분석 (i 값 변화 따라가보자)

ii % 2 == 0continue?count += icount 값
00yesX0
11no+11
20yesX1
31no+34
40yesX4

✅ 최종 출력 결과:

count = 4

💡 핵심: continue를 만나면 뒤에 코드 무시하고 다음 반복으로 점프함.
그래서 짝수(i%2==0)일 때는 count += i를 건너뜀.


🔚 전체 요약 정답 모음:

문제 번호정답 또는 에러 메시지
문제 1a = 7
b = 10
c = 29
문제 2ArrayIndexOutOfBoundsException
문제 3크다
조건문 끝
문제 4컴파일 오류: num2 사용 불가
문제 5count = 4

0개의 댓글