🐢 꼬부기 LV.1 | 개념•기초/💧물대포(핵심개념)

프로그래밍 언어 시험 오답노트 01

서화 2025. 10. 30. 23:41

오답노트 만드는방법

1. 틀린이유

2. 문제가 요구하는것

3.풀이

[2] 아래의 코드를 수행한 결과로 옳은 것을 고르세요
public static void main(String[] args) {
int a=10;
int b=11;
if(++a%2==0 || b++%2==0) {
System.out.println("로그A");
System.out.println("a: "+a);
System.out.println("b: "+b);
}
else {
System.out.println("로그B");
System.out.println("a: "+a);
System.out.println("b: "+b);
}
int c=a++*--b;
System.out.println("a: "+a);
System.out.println("b: "+b);
System.out.println("c: "+c);
}

1. 틀린이유

내가 선택한 답 로그A  a: 11 b: 12 a: 12 b: 11 c: 121

지난번 시험에서 이미 나왔던 문제라 블로그에 오답노트 작성해둔걸 보고 답을 선택했는데 블로그에 로그B의 값과 로그C의 값만 포스팅해두어 로그A가 헷갈렸다. 문제를 좀 더 생각해봤다면, 디버깅표를 그려봤다면 로그A가 실행되지 않는다는것을 알았을 것이다

2. 문제에서 원하는것은 a의 값이 10이고 b의값이 11일때 해당 이프문의 조건(증가한 a값을 2로 나눴을때 0과 같고  증가한 b의 값을 2로 나눴을때 값이 0과 같은가) 이 실행되는가?이다

3. 문제풀이

로그 A 실행시 a가 ++a가 되어 a의 값이 11로 증가한다 11%2=1 이므로 0에 해당하지 않는다 = false

연산자의 우선순위로 먼저실행된 a값을 현재 b값과 비교한다 현재  b값이 11이므로 11%2 =1에 해당한다 이는 0에 해당하지 않으므로 false다  ++b 연산자 실행으로 b값이 12가된다

a와 b모두 false이므로 if문은 다음 블럭인 else를 실행한다

디버깅표

  a b  
++a 실행 10 → 11 11 a를 1 증가시키고 11%2=1 → false
앞 조건이 false → b++ 실행 11 11 → 12 b의 현재값(11)로 계산 후 1 증가. 11%2=1 → false
false   false → false 11

위의 디버깅표로 인하여 로그B의 값이 a = 11 b = 12 로 변경되었음을 알수 있다

int c=a++*--b;

연산자의 우선순위가 중요하다 

--b가 전위 감소이기때문에 먼저실행되어 현재 b의 값은 11이다

그다음 산술연산자인 *(곱하기)를 실행하는데 이때 현재 a값인 11과 현재 b의 값인 11을 곱한다

그럼 121이 나온다 c=121이된다 

그뒤에 a가 a++로 증가되어 값이 12로 변한다

  a b c  
--b 실행   12->11   12에서 1을 감소시켜 11이 된다 
a++*--b 실행 11 11 121 현재 a값과 현재 b값을 곱한다 
a++ 실행 11->12     a값이 증가되어 12가 됬다

그래서 답은 로그B a: 11 b: 12 a: 12 b: 11 c: 121가 된다

-------------------------------------

[4] 아래의 코드에는 문제가 있습니다. 코드에 대한 문제에 답변해주세요.
1 public static void main(String[] args) {
2 ArrayList datas=new ArrayList();
3 for(int i=1;i<=5;i++) {
4 datas.add(i); // [1,2,3,4,5]
5 }
6 int total=0;
7 for(int v:datas) {
8 total+=v;
9 }
10 System.out.println("total: "+total); // total: 15
11 }
몇 번 라인에서 문제가 발생하나요?
코드의 에러를 제거하기 위해서 무엇을 해야 하나요?

1. 틀린이유

이문제를 보다가 7번이 문제인가 2번이 문제인가 고민하다가 블로그를 참고하려 했지만 배열의 선언 방식이 다르고  ArrayList에 대한 이해가 부족하여 문제를 풀지못했다

2. 문제에서 원하는 의도는 문제가 발생한 코드를 찾을수 있고 그에대한  해결방법을 말할수있는가? 라고 생각한다

3. 문제풀이

AraayList는 배열을 대신하여 사용할수 있으므로 서로 같은 자료형을 사용하거나 관련된 데이터에 사용할수 있다

자료형을 받을때는 타입을 <>안에 적어줘야한다 따라서 현재 문제의 코드 2번 단락이 ArrayList<Integer>datas=new ArrayList<>()가 되어야한다 고로 에러가 어디서 나는지 잘은 모르겟지만 ArrayList에 제네릭이 없다는걸 발견한다면 문제의 발견이 될수 있지만 저렇게 쓴다고 해서 오류가 나지는않는다

그렇기때문에 실질적으로 에러가 나는 곳은 7번이다 왜냐하면 ArrayList에 제네릭을 쓰지 않았기 때문에 현재 Object인상황이기때문이다 따라서 forEach문을 사용할수 없기때문에 7번단락이 문제가 발생하는 코드이다

코드의 에러를 제거하기 위해서는 ArrayList에 <Integer>를 지정해주면된다

<Integer> 추가하기

1 public static void main(String[] args) {
2 ArrayList<Integer> datas=new ArrayList<>();
3 for(int i=1;i<=5;i++) {
4 datas.add(i); // [1,2,3,4,5]
5 }
6 int total=0;
7 for(int v:datas) {
8 total+=v;
9 }
10 System.out.println("total: "+total); // total: 15
11 }

-------------------------------------

[5] 다음의 코드를 보고, Console에 출력될 내용을 작성하세요.
public static void main(String[] args) {
ArrayList<Integer> datas=new ArrayList<Integer>();;
datas.add(-5);
datas.add(-1);
datas.add(0);
datas.add(1);
datas.add(5);
System.out.println(datas);
for(int i=-1;i<5;i++) {
try {
System.out.println(10/datas.get(i));
} catch(Exception e) {
if(i<0) {
System.out.println("HELLO");
}
else {
System.out.println("JAVA");
				}
			}
		}
	}
[ Console ]
[-5, -1, 0, 1, 5]

 1. 틀린이유

이문제를 볼때 이해를 위해 한글로 메모장에 배열안에 값이 다섯개가 있고  배열을 전체돌면서 10을 나눴을때 나와야하는 출력값이 어떻게 되는가 였다 문제에 10나누기datas.get(index) 하라고 적혀있는데도  -5, -1이런애들로 나누기 10을 할수있나?를 생각했고 음 안나눠질것같은데? 싶어서 JAVA  JAVA  HELLO JAVA HELLO 를 답으로 제출했다

문제를 이해하려는 노력이 부족했고 이문제 역시 디버깅표를 그려서 확인해봤어야했다 저 문자들이 다 나와야 되는걸로 문제를 잘못 이해한 탓도 있을것이다  그리고 답은 6개를 입력했어야한다 

2. 이 문제가 원하는것은 트라이캐치문을 통한 예외처리와 디버깅표를 그릴수 있는가를 물어본다고 생각한다

3. 문제 풀이

배열안에 값이[-5, -1, 0, 1, 5] 5개가 있고 이 값은 순서대로 0,1,2,3,4 의 인덱스를 가지고 있다 이문제의 for문의 인덱스는 -1부터 시작한다 현재 배열의 인덱스 시작이 0부터이기 때문에 -1번째 인덱스는 존재하지 않고 IndexOutOfBoundsException이 발생한다 바로 catch문으로 이동해 if문 인덱스가 0보다 작니?를 실행하여 HELLO를 출력하게 된다

인덱스 0번은 -5이다 따라서 10을 -5로 나누는것이 된다 그러면 값이 -2가 나오는데 이는 정상적으로 코드가 실행 되었으며 글자를 출력할 필요가 없다

인덱스 1번은 -1이다 10을 -1 로 나누면 -10이 된다 역시 코드가 정상실행되었기 때문에 글자를 출력할 필요가 없다

인덱스 2번은 0이다  10을 0으로 나눌수 없기때문에 ArithmeticException(정수 나눗셈에서 분모가 0일 때)이 발생하여 catch문으로 바로 이동해서 예외처리를 시작한다 이 경우 인덱스가 0보다 커서 catch의 else JAVA를 출력하게 된다

인덱스 3번은 1이고 10으로 나누게 되면 값이 10이라서 코드가 정상실행되었다 마찬가지로 인덱스4번인 5 또한 10을 5로 나눴을때 값이 2가 나온다

디버깅표

인덱스 번호 배열의값  인덱스가 5보다 작니?(i<5) i++ 10/datas.get(i)  
-1   IndexOutOfBoundsException 발생 -> catch if(i<0) 실행 0   HELLO 출력
0 -5 0<5 TRUE 1 -2  
1 -1 1<5 TRUE 2 -10  
2 0  ArithmeticException 발생 -> catch if(i<0)실행 3   JAVA 출력
3 1 3<5 TRUE 4 10  
4 5 4<5 TRUE 5 2  
5   FALSE      
console
[-5, -1, 0, 1, 5]

HELLO
-2
-10
JAVA
10
2