좋아! 정보처리기사 실기에서는 기본 문법을 알고 있다고 가정하고, 오히려 기본기의 빈틈을 찌르거나, 사소한 착각으로 실수할 수 있는 코드 문제들이 종종 나와. 그래서 아래 문제들은 겉보기엔 쉬워 보이지만, 실제로는 틀리기 쉬운 포인트들이 숨어 있는 문제야.
def func():
a = [1, 2, 3]
b = a
b[0] = 99
return a
print(func())
Q1. 위 코드의 출력 결과는?
① [1, 2, 3]
② [99, 2, 3]
③ 에러 발생
④ [1, 99, 3]
a = [1, 2, 3]
b = a # b는 a와 같은 리스트 객체를 가리킴 (복사 아님!)
a와 b는 같은 객체를 참조하고 있어.b[0] = 99로 바꾸면 a[0]도 같이 바뀌는 거야.b[0] = 99 # a와 b가 같은 객체이므로 a[0]도 99로 바뀜
결과적으로:
return a # [99, 2, 3]
정답: ② [99, 2, 3]
def add_to_list(value, lst=[]):
lst.append(value)
return lst
print(add_to_list(1))
print(add_to_list(2))
print(add_to_list(3))
Q2. 위 코드의 출력 결과는?
①
[1]
[2]
[3]
②
[1]
[1, 2]
[1, 2, 3]
③ 에러 발생
④
[1]
[1, 2]
[2, 3]
이 코드는 기본값이 mutable 객체일 때의 큰 함정을 보여줌.
def add_to_list(value, lst=[]):
lst.append(value)
return lst
여기서 lst=[]는 함수가 처음 정의될 때 딱 한 번만 생성됨.
즉, 함수 호출할 때마다 새로운 리스트가 만들어지는 게 아니라, 같은 리스트를 계속 씀.
add_to_list(1) → lst는 기본값인 [] → 1 추가 → [1]add_to_list(2) → 같은 리스트 → [1, 2]add_to_list(3) → 같은 리스트 → [1, 2, 3]정답: ②
[1]
[1, 2]
[1, 2, 3]
a = [1, 2, 3]
b = [1, 2, 3]
print(a == b)
print(a is b)
Q3. 출력 결과는?
① True, True
② True, False
③ False, True
④ False, False
==는 값이 같은가를 비교is는 같은 객체인가 (메모리 주소가 같은가) 비교a = [1, 2, 3]
b = [1, 2, 3]
두 리스트는 값은 같지만 서로 다른 객체임
a == b → ✅ True (값 같음)a is b → ❌ False (객체 다름)정답: ②
x = 10
def foo():
x = x + 1
return x
print(foo())
Q4. 결과는?
① 11
② 10
③ 에러 발생
④ 1
이 코드는 실행하면 에러가 나.
x = 10 # 전역 변수
def foo():
x = x + 1 # 지역변수 x에 할당하려고 하지만, 선언 이전에 참조해서 에러 발생
x = x + 1를 하면서 x를 읽으려 하니까x를 지역변수로 인식하고, 할당 전 참조 에러 발생!정답: ③ 에러 발생
lst = [1, 2, 3, 4, 5]
for i in lst:
if i % 2 == 0:
lst.remove(i)
print(lst)
Q5. 출력 결과는?
① [1, 3, 5]
② [1, 2, 3, 4, 5]
③ [1, 3, 4, 5]
④ [1, 3, 5] (같지만 의도는 틀림)
이 문제는 리스트를 for 루프에서 순회하면서 동시에 수정하면 생기는 오류를 보여줘.
lst = [1, 2, 3, 4, 5]
lst = [1, 3, 4, 5]결과적으로 2와 4만 삭제됨
최종 리스트: [1, 3, 5]
정답: ①
하지만 이건 매우 위험한 방식이므로 for i in lst[:] 같은 복사본을 돌리는 게 안전함.
| 번호 | 포인트 | 정답 |
|---|---|---|
| 1 | 리스트는 참조 | ② |
| 2 | 기본값에 리스트 쓰기 | ② |
| 3 | is vs == | ② |
| 4 | 스코프 에러 | ③ |
| 5 | 루프 중 리스트 수정 | ① |
좋아, 그럼 지금부터 C와 Java 언어로 기본 문법 속 트랩 문제(실수 유도 코드) 와 보안 / 해시 / 포인터 주제별 실수 유도 문제들을 제공할게. 각 문제는 “틀리기 쉬운 포인트”를 중심으로 만들었고, 풀이 + 상세 해설도 함께 해줄게.
#include <stdio.h>
void change(int* a) {
*a = 10;
}
int main() {
int a = 5;
change(&a);
printf("%d\n", a);
return 0;
}
Q1. 출력 결과는?
① 5
② 10
③ 주소 출력됨
④ 컴파일 에러 발생
change(&a) → 주소 전달*a = 10 → 포인터가 가리키는 값 = 10→ 결국 a의 값이 바뀜
정답: ②
#include <stdio.h>
int main() {
int arr[3] = {1, 2, 3};
int* p = arr;
printf("%d\n", *(p + 3));
return 0;
}
Q2. 출력 결과는?
① 3
② 쓰레기 값
③ 컴파일 에러
④ 0
arr[3]은 존재하지 않음 (범위: 0~2)*(p + 3)은 그냥 다음 메모리 주소에 있는 값을 출력 → 쓰레기 값 나올 수도 있고, 운 나쁘면 터짐정답: ② (쓰레기 값)
import java.util.*;
class Person {
String name;
Person(String name) {
this.name = name;
}
}
public class Main {
public static void main(String[] args) {
HashSet<Person> set = new HashSet<>();
set.add(new Person("John"));
set.add(new Person("John"));
System.out.println(set.size());
}
}
Q3. 출력 결과는?
① 1
② 2
③ 컴파일 에러
④ NullPointerException
Person("John") 객체 두 개는 다른 객체로 인식됨 (equals(), hashCode() 안 재정의했기 때문)정답: ②
해결하려면
equals()와hashCode()를 오버라이드해야 함
public class Main {
public static void main(String[] args) {
String a = "hello";
String b = new String("hello");
if (a == b) System.out.println("Equal");
else System.out.println("Not Equal");
}
}
Q4. 출력 결과는?
① Equal
② Not Equal
③ 에러 발생
④ NullPointerException
==는 참조 비교 → a는 상수 풀, b는 힙 객체 → 다름equals()를 써야 내용 비교정답: ②
#include <stdio.h>
#include <string.h>
int main() {
char buf[5];
strcpy(buf, "overflow");
printf("%s\n", buf);
return 0;
}
Q5. 예상되는 문제는?
① 정상 출력됨
② 경고만 나옴
③ 버퍼 오버플로우 발생 가능
④ 문자열이 잘림
buf[5] → 5바이트 공간"overflow"는 널문자까지 9바이트strcpy()는 길이 체크 안 함 → 메모리 침범 가능정답: ③ 버퍼 오버플로우 발생 가능