연습 19(마지막에서 2번째것만)

류한선·2025년 7월 4일

실기연습-2

목록 보기
81/95

좋아! 정보처리기사 실기에서는 기본 문법을 알고 있다고 가정하고, 오히려 기본기의 빈틈을 찌르거나, 사소한 착각으로 실수할 수 있는 코드 문제들이 종종 나와. 그래서 아래 문제들은 겉보기엔 쉬워 보이지만, 실제로는 틀리기 쉬운 포인트들이 숨어 있는 문제야.


✅ 문제 1. 리스트 복사와 참조

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와 같은 리스트 객체를 가리킴 (복사 아님!)
  • 이 시점에서 ab같은 객체를 참조하고 있어.
  • 그러니까 b[0] = 99로 바꾸면 a[0]도 같이 바뀌는 거야.
  • 리스트는 mutable (변경 가능) 객체이기 때문에 이런 일이 생김.
b[0] = 99  # a와 b가 같은 객체이므로 a[0]도 99로 바뀜

결과적으로:

return a  # [99, 2, 3]

정답: ② [99, 2, 3]


✅ 문제 2. 기본값이 리스트인 함수의 함정

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=[]함수가 처음 정의될 때 딱 한 번만 생성됨.
즉, 함수 호출할 때마다 새로운 리스트가 만들어지는 게 아니라, 같은 리스트를 계속 씀.

실행 순서:

  1. add_to_list(1)lst는 기본값인 []1 추가 → [1]
  2. add_to_list(2) → 같은 리스트 → [1, 2]
  3. add_to_list(3) → 같은 리스트 → [1, 2, 3]

정답: ②

[1]
[1, 2]
[1, 2, 3]

✅ 문제 3. is 와 == 구분

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 (객체 다름)

정답: ②


✅ 문제 4. 변수 스코프와 전역 변수

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를 지역변수로 인식하고, 할당 전 참조 에러 발생!

정답: ③ 에러 발생


✅ 문제 5. for 문 안에서 리스트 삭제

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]
  • i = 1 → 홀수 → pass
  • i = 2 → 짝수 → remove(2) → lst = [1, 3, 4, 5]
  • 그런데 for 루프는 기존 인덱스를 기준으로 순회하므로,
  • 다음 i는 3이 아니라 3 건너뛰고 4가 됨

결과적으로 2와 4만 삭제됨

최종 리스트: [1, 3, 5]

정답: ①
하지만 이건 매우 위험한 방식이므로 for i in lst[:] 같은 복사본을 돌리는 게 안전함.


✅ 요약

번호포인트정답
1리스트는 참조
2기본값에 리스트 쓰기
3is vs ==
4스코프 에러
5루프 중 리스트 수정

좋아, 그럼 지금부터 C와 Java 언어로 기본 문법 속 트랩 문제(실수 유도 코드)보안 / 해시 / 포인터 주제별 실수 유도 문제들을 제공할게. 각 문제는 “틀리기 쉬운 포인트”를 중심으로 만들었고, 풀이 + 상세 해설도 함께 해줄게.


✅ [C언어] 포인터 트랩 문제 1

#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의 값이 바뀜

정답: ②


❗ [C언어] 포인터와 배열 트랩 문제 2

#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)
  • C는 배열 범위 체크 안 함
  • *(p + 3)은 그냥 다음 메모리 주소에 있는 값을 출력 → 쓰레기 값 나올 수도 있고, 운 나쁘면 터짐

정답: ② (쓰레기 값)


✅ [Java] 해시 트랩 문제 1

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() 안 재정의했기 때문)
  • HashSet은 동일 객체만 제거 가능하므로, 둘 다 들어감

정답: ②

해결하려면 equals()hashCode()를 오버라이드해야 함


❗ [Java] 문자열 비교 트랩 문제 2 (체크)

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()를 써야 내용 비교

정답: ②


✅ [C언어] 보안 트랩 – 버퍼 오버플로우

#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()는 길이 체크 안 함 → 메모리 침범 가능

정답: ③ 버퍼 오버플로우 발생 가능


0개의 댓글