좋아! 그럼 너가 요청한 대로 한 줄도 빠짐없이, 예제를 넣고 변수 값이 어떻게 변하는지도 시각적으로, 마치 디버깅 하듯이 한 줄씩 설명할게.
문제 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);
}
}
int a = 5;변수 a를 선언하고 5로 초기화한다.
이 시점:
a = 5
int b = 10;변수 b를 선언하고 10으로 초기화한다.
현재 상태:
a = 5
b = 10
int c = 0;변수 c를 선언하고 0으로 초기화한다.
현재 상태:
a = 5
b = 10
c = 0
c = a++ + ++b * 2 - b-- / 2 + ++a;
이 줄이 핵심이다. 연산자 우선순위와 후위/전위 증감 연산자의 개념이 제대로 되어 있지 않으면 틀리게 된다.
++, -- (전위/후위 증감) → 먼저 수행됨 (단항 연산자)*, / → 그다음 (곱셈/나눗셈)+, - → 마지막 (덧셈/뺄셈)=은 마지막에 변수에 값을 넣는 거야a = 5
b = 10
a++a를 증가시킴5a = 6++bb는 10 → 증가해서 11 → 이 값이 사용됨++b * 211 * 2 = 22b--b = 11인 상태), 그 다음 b = 10로 감소11b-- / 211 / 2 = 5 (정수 나눗셈이므로 몫만 사용)++aa = 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 = 29a = 7
b = 10
c = 29
좋아, 그럼 아까 낸 5문제 전부를 Java 초보자가 실수하기 쉬운 포인트 중심으로,
각 줄마다 "무슨 일?", "왜 여기?", "무슨 값?" 기준으로 디버깅 해설 + 예시 계산까지 해줄게.
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]);
}
}
int[] arr = new int[5];길이가 5인 int 배열을 생성한다.
인덱스는 0~4까지 사용 가능.
현재 상태:
arr = [0, 0, 0, 0, 0]
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
public class Main {
public static void main(String[] args) {
int x = 10;
if (x > 5)
System.out.println("크다");
System.out.println("조건문 끝");
System.out.println("끝");
}
}
int x = 10;if (x > 5)x > 5 → 10 > 5 → trueSystem.out.println("크다");if 바로 아래 한 줄만 조건문에 포함됨{} 없으므로 크다만 조건문에 속함System.out.println("조건문 끝");System.out.println("끝");크다
조건문 끝
끝
💡 오답을 유도하는 핵심:
if 조건문에{}이 없을 때는 딱 한 줄만 조건에 들어감.
실수로 아래 줄도 조건문 안으로 생각하는 경우가 많음.
public class Main {
public static void main(String[] args) {
int num = 20;
{
int num2 = 10;
num = num2 + 5;
}
System.out.println(num2);
}
}
int num = 20;num은 main 함수 전체에서 사용 가능{ int num2 = 10; ... }이 중괄호 블록은 지역 블록이므로, 여기 안에서 선언된 num2는 밖에서 못 씀
num2는 이 블록 내부에서만 유효함
System.out.println(num2);num2를 접근하려고 함num2는 위 블록 안에서 선언되어 스코프 밖컴파일 오류:
Cannot find symbol - variable num2
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 | i % 2 == 0 | continue? | count += i | count 값 |
|---|---|---|---|---|
| 0 | 0 | yes | X | 0 |
| 1 | 1 | no | +1 | 1 |
| 2 | 0 | yes | X | 1 |
| 3 | 1 | no | +3 | 4 |
| 4 | 0 | yes | X | 4 |
count = 4
💡 핵심:
continue를 만나면 뒤에 코드 무시하고 다음 반복으로 점프함.
그래서짝수(i%2==0)일 때는count += i를 건너뜀.
| 문제 번호 | 정답 또는 에러 메시지 |
|---|---|
| 문제 1 | a = 7 b = 10 c = 29 |
| 문제 2 | ArrayIndexOutOfBoundsException |
| 문제 3 | 크다 조건문 끝 끝 |
| 문제 4 | 컴파일 오류: num2 사용 불가 |
| 문제 5 | count = 4 |