
1. (Java) 아래 코드를 확인하여 알맞는 출력값을 작성하시오.
public class Main{
static String[] s = new String[3];
static void func(String[]s, int size){
for(int i=1; i<size; i++){
if(s[i-1].equals(s[i])){
System.out.print("O");
}else{
System.out.print("N");
}
}
for (String m : s){
System.out.print(m);
}
}
public static void main(String[] args){
s[0] = "A";
s[1] = "A";
s[2] = new String("A");
func(s, 3);
}
}
정답: OOAAA
이 문제는 문자열 비교에서 자주 나오는 equals() vs == 개념을 잘 이해하고 있어야 풀 수 있는 문제이다.
equals()는 문자열의 내용을 비교하므로 "A"와 new String("A")도 같다고 본다.
반면 ==는 주소를 비교하므로 이 경우 false가 될 수 있다. (이 코드에서는 사용 안 됨)
static String[] s = new String[3];
- 길이 3짜리 문자열 배열 s 선언하기
s[0] = "A";
s[1] = "A";
s[2] = new String("A");
- s[0], s[1]은 리터럴 문자열 "A" → 자바에서는 같은 문자열 리터럴이면 같은 주소를 가리킨다 (String pool)
- s[2]는 new String("A") → 새로운 메모리 공간에 "A"를 생성한다 → 다른 주소
함수 func(s, 3)
for(int i=1; i<size; i++){
if(s[i-1].equals(s[i])){
System.out.print("O");
} else {
System.out.print("N");
}
}
- s[i-1].equals(s[i])는 값(내용) 비교
- s[0].equals(s[1]) → "A".equals("A") → ✅ true → O
- s[1].equals(s[2]) → "A".equals(new String("A")) → ✅ true → O
- 출력: OO
for (String m : s){
System.out.print(m);
}
- 배열 전체 출력 → "A", "A", "A"
- 출력: AAA
최종 출력 결과
OOAAA
2. 다음은 파이썬에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력값을 작성하시오.
def func(lst):
for i in range(len(lst) // 2):
lst[i], lst[-i-1] = lst[-i-1], lst[i]
lst = [1, 2, 3, 4, 5, 6]
func(lst)
print(sum(lst[::2]) - sum(lst[1::2]))
정답:3
len(lst) = 6, len(lst) // 2 = 3 # 정수부만
for 루프는 [0, 1, 2] # 3 앞까지 돌아감
i = 0일때, lst[0]과 lst[-1] 교환 lst = [6,2,3,4,5,1]
i = 1일때, lst[1]과 lst[-2] 교환 lst = [6,5,3,4,2,1]
i = 2일때, lst[2]과 lst[-3] 교환 lst = [6,5,4,3,2,1]
print(sum(lst[::2]) - sum(lst[1::2))
sum(iterable) 해당 이터러블 내의 요소를 모두 합한다.
짝수 인덱스의 값(6,4,2) - 홀수인덱스의 값들(5,3,1)
12 - 9 = 3
3. 아래의 employee테이블과 project테이블을 참고하여 보기의 SQL명령어에 알맞는 출력 값을 작성하시오.

SELECT
count(*)
FROM employee AS e JOIN project AS p ON e.project_id = p.project_id
WHERE p.name IN (
SELECT name FROM project p WHERE p.project_id IN (
SELECT project_id FROM employee GROUP BY project_id HAVING count(*) < 2
)
);
정답 : 1
4. 다음은 운영체제 페이지 순서를 참고하여 할당된 프레임의 수가 3개일 때 LRU 알고리즘의 페이지 부재 횟수를 작성하시오.
페이지 참조 순서 : 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1

정답: 12
5. 다음은 네트워크 취약점에 대한 문제이다. 알맞는 용어를 작성하시오.
- IP나 ICMP의 특성을 악용하여 엄청난 양의 데이터를 한 사이트에 집중적으로 보냄으로써 네트워크의 일부를 불능 상태로 만드는 공격이다.
- 여러 호스트가 특정 대상에게 다량의 ICMP Echo Reply 를 보내게 하여 서비스거부(DoS)를 유발시키는 보안공격이다.
- 공격 대상 호스트는 다량으로 유입되는 패킷으로 인해 서비스 불능 상태에 빠진다.
정답: 스머핑(Smurfing)
6. GoF 디자인 패턴에 관련해서 괄호안에 알맞는 용어를 작성하시오.
- ( ) 패턴은 클래스나 객체들이 서로 상호작용하는 방법이나 책임 분배 방법을 정의하는 패턴이다.
- ( ) 패턴은 객체들 간의 통신 방법을 정의하고 알고리즘을 캡슐화하여 객체 간의 결합도를 낮춘다.
- ( ) 패턴은 Chain of Responsibility나 Command 또는 Observer 패턴이 있다.
행위
7. (C언어) 아래 코드를 확인하여 알맞는 출력값을 작성하시오.
#include <stdio.h>
int func(){
static int x =0;
x+=2;
return x;
}
int main(){
int x = 1;
int sum=0;
for(int i=0;i<4;i++) {
x++;
sum+=func();
}
printf("%d", sum);
return 0;
}
정답 : 20
- func() 함수 안의 변수 x는 static이기 때문에 한 번만 초기화되며 함수가 호출될 때마다 값을 유지한다.
- main() 함수 안의 x는 별개의 변수입니다. 이 x++는 반복마다 증가하지만 결과값과는 상관없다.
- func()는 호출될 때마다 x += 2를 하고 현재 값을 반환한다.
func() 내부의 static 변수 x의 변화만 보면 된다.
- 1st call: x = 0 + 2 = 2 → return 2
- 2nd call: x = 2 + 2 = 4 → return 4
- 3rd call: x = 4 + 2 = 6 → return 6
- 4th call: x = 6 + 2 = 8 → return 8
따라서 sum = 2 + 4 + 6 + 8 = 20
8. 다음은 무결성제약조건에 대한 문제이다. 아래 표에서 어떠한 ( ) 무결성을 위반하였는지 작성하시오.

정답 : 개체
개체 무결성 위반 (Entity Integrity Violation)
👉 기본키(PK)가 null이거나 중복될 때 발생하는 오류이다.
한마디로 요약하면 "기본키는 비워둘 수도, 겹칠 수도 없다."
9. 다음은 URL 구조에 관한 문제이다 . 아래 보기의 순서대로 URL에 해당하는 번호를 작성하시오.

- query : 서버에 전달할 추가 데이터
- path : 서버 내의 특정 자원을 가리키는 경로
- scheme : 리소스에 접근하는 방법이나 프로토콜
- authority : 사용자 정보, 호스트명, 포트 번호
- fragment : 특정 문서 내의 위치
정답 : 43125
10. (Python) 아래 코드를 확인하여 알맞는 출력값을 작성하시오.
def func(value):
if type(value) == type(100): # 정수형
return 100
elif type(value) == type(""): # 문자열
return len(value)
else:
return 20 # 그 외의 타입
a = '100.0' # 문자열
b = 100.0 # 실수 (float)
c = (100, 200) # 튜플
print(func(a) + func(b) + func(c))
정답 : 45
a는 문자열이니까 len('100.0') 해서 5
b는 실수형이라서 else 블럭으로 가서 20
c는 튜플형이므로 else 블럭으로 가서 20 리턴
총 합은 5 + 20 + 20 = 45
11. (Java) 아래 코드를 확인하여 알맞는 출력값을 작성하시오.
public class Main{
public static void main(String[] args){
Base a = new Derivate();
Derivate b = new Derivate();
System.out.print(a.getX() + a.x + b.getX() + b.x);
}
}
class Base{
int x = 3;
int getX(){
return x * 2;
}
}
class Derivate extends Base{
int x = 7;
int getX(){
return x * 3;
}
}
정답 : 52
- 필드(변수)는 오버라이딩되지 않는다. → 필드는 선언된 타입에 따라 접근한다.
- 메서드는 오버라이딩된다. → 메서드는 실제 객체 타입에 따라 호출된다.
Base a = new Derivate();
Derivate b = new Derivate();
- a는 Base 타입이지만 Derivate 객체 참조
- b는 Derivate 타입이고 Derivate 객체 참조
System.out.print(
a.getX() // 메서드는 오버라이딩 → Derivate.getX() → 7 * 3 = 21
+ a.x // 필드는 Base 타입 기준 → Base.x = 3
+ b.getX() // Derivate.getX() → 7 * 3 = 21
+ b.x // Derivate 타입 기준 → Derivate.x = 7
);
- a.getX() = 21
- a.x = 3
- b.getX() = 21
- b.x = 7
합계 = 21 + 3 + 21 + 7 = 52
12. (C언어) 아래 코드를 확인하여 알맞는 출력값을 작성하시오.
#include <stdio.h>
struct Node {
int value;
struct Node* next;
};
void func(struct Node* node){
while(node != NULL && node->next != NULL){
int t = node->value;
node->value = node->next->value;
node->next->value = t;
node = node->next->next;
}
}
int main(){
struct Node n1 = {1, NULL};
struct Node n2 = {2, NULL};
struct Node n3 = {3, NULL};
n1.next = &n3;
n3.next = &n2;
func(&n1);
struct Node* current = &n1;
while(current != NULL){
printf("%d", current->value);
current = current->next;
}
return 0;
}
정답 : 312
[구조체 선언]
struct Node {
int value;
struct Node* next;
};
struct Node n1 = {1, NULL};
struct Node n2 = {2, NULL};
struct Node n3 = {3, NULL};
n1.next = &n3;
n3.next = &n2;
구조체 정의 후 메인함수에서 노드 세 개를 정의하고 있다.
[연결구조]
n1 (1) → n3 (3) → n2 (2) → NULL
[func 함수 로직]
void func(struct Node* node){
while(node != NULL && node->next != NULL){
int t = node->value;
node->value = node->next->value;
node->next->value = t;
node = node->next->next;
}
}
인접한 두 노드의 값을 바꾸고 그 다음 두 칸 건너뛰기
[⚙️ func(&n1) 실행 흐름]
n1 (1) → n3 (3) → n2 (2)
■ 첫번째 반복 (node = n1)
- node = n1, node->next = n3
- Swap n1.value ↔ n3.value → n1 = 3, n3 = 1
- node = node->next->next → node = n2
■ 두 번째 2nd 반복 (node = n2)
- node = n2, but node->next = NULL → 루프 종료
최종 연결 상태
n1.value = 3
n1.next.value = 1
n1.next.next.value = 2
출력 순서: 3 1 2
13. 다음은 테스트 커버리지에 대한 문제이다. 아래 내용에 알맞는 답을 보기에서 골라 작성하시오.
1. 테스트를 통해 프로그램의 모든 문장을 최소한 한 번씩 실행했는지를 측정
2. 프로그램 내의 모든 분기(조건문)의 각 분기를 최소한 한 번씩 실행했는지를 측정
3. 복합 조건 내의 각 개별 조건이 참과 거짓으로 평가되는 경우를 모두 테스트했는지를 측정
[보기]
ㄱ. 조건 ㄴ. 경로 ㄷ. 결정 ㄹ. 분기 ㅁ.함수 ㅂ. 문장 ㅅ. 루프
정답
1. 문장 / 2. 분기 / 3. 조건
14.아래는 UML클래스의 관계에 관한 문제이다. 보기를 보고 알맞는 관계를 선택하여 작성하시오.

정답
(1) 연관 (2) 일반화 (3) 의존
15. 다음은 데이터베이스에 관한 문제이다. 아래 내용을 읽고 알맞는 답을 보기에서 찾아 골라 작성하시오
(1) 다른 테이블, 릴레이션의 기본 키를 참조하는 속성 또는 속성들의 집합
(2) 테이블에서 각 행을 유일하게 식별할 수 있는 최소한의 속성들의 집합
(3) 후보 키 중에서 선정된 기본 키를 제외한 나머지 후보 키
(4) 테이블에서 각 행을 유일하게 식별할 수 있는 속성들의 집합
[보기]
ㄱ. 슈퍼키 ㄴ. 외래키 ㄷ. 대체키 ㄹ. 후보키
정답
(1) 외래키 / (2) 후보키 / (3) 대체키 / (4) 슈퍼키
16. (C언어) 아래 코드를 확인하여 알맞는 출력값을 작성하시오.
#include <stdio.h>
void func(int** arr, int size){
for(int i=0; i<size; i++){
*(*arr + i) = (*(*arr+i) + i) % size;
}
}
int main(){
int arr[] = {3,1, 4, 1, 5};
int* p = arr;
int** pp = &p;
int num = 6;
func(pp, 5);
num = arr[2];
printf("%d", num);
return 0;
}
정답 : 1
int arr[] = {3, 1, 4, 1, 5}; // 크기 5
int* p = arr; // p → arr 배열의 첫 번째 원소
int** pp = &p; // pp는 p를 가리킴 → 결국 pp → arr
→ func(pp, 5)이 호출된다.
[func() 함수]
for(int i = 0; i < size; i++) {
*(*arr + i) = (*(*arr + i) + i) % size;
}
이건 결국 arr[i] = (arr[i] + i) % size 와 같은 의미이다.
[계산 과정]
- (size = 5)
- arr[0] = (3 + 0) % 5 = 3
- arr[1] = (1 + 1) % 5 = 2
- arr[2] = (4 + 2) % 5 = 6 % 5 = 1
- arr[3] = (1 + 3) % 5 = 4
- arr[4] = (5 + 4) % 5 = 9 % 5 = 4
[변경된 배열]
arr = {3, 2, 1, 4, 4}
[이후]
num = arr[2]; // num = 1
printf("%d", num);
17. 다음 아래 내용을 보고 알맞는 용어를 작성하시오. (3글자로 작성)
- 공용 네트워크를 통해 사설 네트워크를 확장하는 기술이다.
- 사용자의 IP 주소를 숨기고, 사용자가 어디에서 접속하는지를 추적하기 어렵게 만든다.
- 종류로는 IPsec 또는 SSL, L2TP 등이 있다.
정답 : VPN
18. (Java) 아래 코드를 확인하여 알맞는 출력값을 작성하시오.
public class ExceptionHandling {
public static void main(String[] args) {
int sum = 0;
try {
func();
} catch (NullPointerException e) {
sum = sum + 1;
} catch (Exception e) {
sum = sum + 10;
} finally {
sum = sum + 100;
}
System.out.print(sum);
}
static void func() throws Exception {
throw new NullPointerException();
}
}
정답 : 101
- NullPointerException은 Exception의 하위 클래스이다.
- func()는 NullPointerException을 throw 한다.
- 따라서 try에서 예외가 발생하고 NullPointerException catch 블록이 실행된다.
- 그 다음 finally 블록은 무조건 실행된다.
💡 실행 순서
- func() 호출 → NullPointerException 발생
- catch (NullPointerException e) 실행 → sum += 1 → sum = 1
- finally 블록 실행 → sum += 100 → sum = 101
19. (Java) 아래 코드를 확인하여 알맞는 출력값을 작성하시오. ⭐⭐⭐⭐⭐
class Main {
public static class Collection<T>{
T value;
public Collection(T t){
value = t;
}
public void print(){
new Printer().print(value);
}
class Printer{
void print(Integer a){
System.out.print("A" + a);
}
void print(Object a){
System.out.print("B" + a);
}
void print(Number a){
System.out.print("C" + a);
}
}
}
public static void main(String[] args) {
new Collection<>(0).print();
}
}
정답 : B0
듣도 보도 못한 제네릭 문제
Container은 클래스 이름
오버로딩 = 이름 같은데 파라미터 갯수/타입 다름 = 중복정의
Printer 클래스에는 파라미터에 따라 오버로딩
저 앞에 해당되는 객체의 형태에 따라서 다른 것이 출력됨
Container 이라는 제네릭 클래스를 사용해서 사용해서 0 을 전달했을 때 과연 Integer로 인식할 것인가?
public static void main(String[] args) {
new Collection<>(0).print();
}
메인 함수는 이거 한 줄 이다. `new container <>(0).print();`
컨테이너 객체를 만들었는데 뉴 컨테이너에 0을 넣고 타입을 추상화해서 넣고 여기 클래스 안에 정의되어 있는 print()라는 메서드를 실행했다.
public static class Collection<T>{
T value;
public Collection(T t){
value = t;
}
public void print(){
new Printer().print(value);
}
}
그 아래 Container 클래스를 보자.
여기서 value는 T 타입인데, 제네릭 타입은 컴파일 타임에 타입이 지워진다.
여기서 0은 int 로 Integer로 바뀌기는 하는데 (박싱) 하지만 제네릭 타입으로 들어가는 순간 컴파일 타임에 타입이 소거된다. 이를 타입 소거(type erasure)라고 하는데 구체적으로 타입을 작성하지 않고 T로 하면, 상위타입인 Object로 바뀌는 현상이다.
즉, Integer로 들어가지 않고 오버로딩 되었을 때 value 가 Object가 되어 오브젝트형으로 오버로딩 된다.
즉, 컴파일러는 print(Object a)를 호출하고, "B" + 0 은 문자열화되어 B0이 됨
다시 메서드 오버로딩을 정리하자면
void print(Integer a) { System.out.print("A" + a); }
void print(Object a) { System.out.print("B" + a); }
void print(Number a) { System.out.print("C" + a); }
🔥 이건 오버로딩이지 오버라이딩이 아니다.
🔥 오버로딩에서는 컴파일 타임의 타입이 중요하다.
🔥 value는 런타임에는 Integer지만, **컴파일 타임에는 Object**로 간주된다. (type erasure 때문)
20. 다음은 네트워크에 대한 문제이다. 아래 내용을 보고 알맞는 용어를 작성하시오.
- 중앙 관리나 고정된 인프라 없이 임시로 구성되는 네트워크이다.
- 일반적으로 무선 통신을 통해 노드들이 직접 연결되어 데이터를 주고받는다.
- 긴급 구조, 긴급 회의, 군사적인 상황 등에서 유용하게 활용될 수 있다.
[보기]
ㄱ.Infrastructure Network ㄴ. Firmware Network ㄷ. Peer-to-Peer Network
ㄹ. Ad-hoc Network ㅁ. Mesh Network ㅂ.Sensor Network ㅅ.Virtual Private Network
정답 : ㄹ
'정보처리기사' 카테고리의 다른 글
[C언어] 포인터, Call by Reference, 2차원 배열 행 대표주소, 구조체 정리 (0) | 2025.04.19 |
---|---|
[C언어] 변수의 유효범위, 논리연산자, 증감연산자, static 변수, global 변수 주의사항 정리 (3) | 2025.04.10 |
[정보처리기사] 비트연산자 정리 - AND, OR, XOR, NOT, 왼쪽 시프트(<<), 오른쪽시프트(>>) 연산 (6) | 2025.04.06 |
[정보처리기사] 동기/비동기 전송, 흐름제어, 오류 제어, OSI 참조 모델, 프로토콜 등 (10) | 2025.04.05 |
[정보처리기사] 운영체제/ 기억장치 / 프로세스 / 스레드 / 교착상태 (2) | 2025.04.05 |

1. (Java) 아래 코드를 확인하여 알맞는 출력값을 작성하시오.
public class Main{ static String[] s = new String[3]; static void func(String[]s, int size){ for(int i=1; i<size; i++){ if(s[i-1].equals(s[i])){ System.out.print("O"); }else{ System.out.print("N"); } } for (String m : s){ System.out.print(m); } } public static void main(String[] args){ s[0] = "A"; s[1] = "A"; s[2] = new String("A"); func(s, 3); } }
정답: OOAAA
이 문제는 문자열 비교에서 자주 나오는 equals() vs == 개념을 잘 이해하고 있어야 풀 수 있는 문제이다.
equals()는 문자열의 내용을 비교하므로 "A"와 new String("A")도 같다고 본다.
반면 ==는 주소를 비교하므로 이 경우 false가 될 수 있다. (이 코드에서는 사용 안 됨)
static String[] s = new String[3];
- 길이 3짜리 문자열 배열 s 선언하기
s[0] = "A"; s[1] = "A"; s[2] = new String("A");
- s[0], s[1]은 리터럴 문자열 "A" → 자바에서는 같은 문자열 리터럴이면 같은 주소를 가리킨다 (String pool)
- s[2]는 new String("A") → 새로운 메모리 공간에 "A"를 생성한다 → 다른 주소
함수 func(s, 3)
for(int i=1; i<size; i++){ if(s[i-1].equals(s[i])){ System.out.print("O"); } else { System.out.print("N"); } }
- s[i-1].equals(s[i])는 값(내용) 비교
- s[0].equals(s[1]) → "A".equals("A") → ✅ true → O
- s[1].equals(s[2]) → "A".equals(new String("A")) → ✅ true → O
- 출력: OO
for (String m : s){ System.out.print(m); }
- 배열 전체 출력 → "A", "A", "A"
- 출력: AAA
최종 출력 결과
OOAAA
2. 다음은 파이썬에 대한 문제이다. 아래 코드를 확인하여 알맞는 출력값을 작성하시오.
def func(lst): for i in range(len(lst) // 2): lst[i], lst[-i-1] = lst[-i-1], lst[i] lst = [1, 2, 3, 4, 5, 6] func(lst) print(sum(lst[::2]) - sum(lst[1::2]))
정답:3
len(lst) = 6, len(lst) // 2 = 3 # 정수부만
for 루프는 [0, 1, 2] # 3 앞까지 돌아감
i = 0일때, lst[0]과 lst[-1] 교환 lst = [6,2,3,4,5,1]
i = 1일때, lst[1]과 lst[-2] 교환 lst = [6,5,3,4,2,1]
i = 2일때, lst[2]과 lst[-3] 교환 lst = [6,5,4,3,2,1]
print(sum(lst[::2]) - sum(lst[1::2))
sum(iterable) 해당 이터러블 내의 요소를 모두 합한다.
짝수 인덱스의 값(6,4,2) - 홀수인덱스의 값들(5,3,1)
12 - 9 = 3
3. 아래의 employee테이블과 project테이블을 참고하여 보기의 SQL명령어에 알맞는 출력 값을 작성하시오.

SELECT count(*) FROM employee AS e JOIN project AS p ON e.project_id = p.project_id WHERE p.name IN ( SELECT name FROM project p WHERE p.project_id IN ( SELECT project_id FROM employee GROUP BY project_id HAVING count(*) < 2 ) );
정답 : 1
4. 다음은 운영체제 페이지 순서를 참고하여 할당된 프레임의 수가 3개일 때 LRU 알고리즘의 페이지 부재 횟수를 작성하시오.
페이지 참조 순서 : 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1

정답: 12
5. 다음은 네트워크 취약점에 대한 문제이다. 알맞는 용어를 작성하시오.
- IP나 ICMP의 특성을 악용하여 엄청난 양의 데이터를 한 사이트에 집중적으로 보냄으로써 네트워크의 일부를 불능 상태로 만드는 공격이다.
- 여러 호스트가 특정 대상에게 다량의 ICMP Echo Reply 를 보내게 하여 서비스거부(DoS)를 유발시키는 보안공격이다.
- 공격 대상 호스트는 다량으로 유입되는 패킷으로 인해 서비스 불능 상태에 빠진다.
정답: 스머핑(Smurfing)
6. GoF 디자인 패턴에 관련해서 괄호안에 알맞는 용어를 작성하시오.
- ( ) 패턴은 클래스나 객체들이 서로 상호작용하는 방법이나 책임 분배 방법을 정의하는 패턴이다.
- ( ) 패턴은 객체들 간의 통신 방법을 정의하고 알고리즘을 캡슐화하여 객체 간의 결합도를 낮춘다.
- ( ) 패턴은 Chain of Responsibility나 Command 또는 Observer 패턴이 있다.
행위
7. (C언어) 아래 코드를 확인하여 알맞는 출력값을 작성하시오.
#include <stdio.h> int func(){ static int x =0; x+=2; return x; } int main(){ int x = 1; int sum=0; for(int i=0;i<4;i++) { x++; sum+=func(); } printf("%d", sum); return 0; }
정답 : 20
- func() 함수 안의 변수 x는 static이기 때문에 한 번만 초기화되며 함수가 호출될 때마다 값을 유지한다.
- main() 함수 안의 x는 별개의 변수입니다. 이 x++는 반복마다 증가하지만 결과값과는 상관없다.
- func()는 호출될 때마다 x += 2를 하고 현재 값을 반환한다.
func() 내부의 static 변수 x의 변화만 보면 된다.
- 1st call: x = 0 + 2 = 2 → return 2
- 2nd call: x = 2 + 2 = 4 → return 4
- 3rd call: x = 4 + 2 = 6 → return 6
- 4th call: x = 6 + 2 = 8 → return 8
따라서 sum = 2 + 4 + 6 + 8 = 20
8. 다음은 무결성제약조건에 대한 문제이다. 아래 표에서 어떠한 ( ) 무결성을 위반하였는지 작성하시오.

정답 : 개체
개체 무결성 위반 (Entity Integrity Violation)
👉 기본키(PK)가 null이거나 중복될 때 발생하는 오류이다.
한마디로 요약하면 "기본키는 비워둘 수도, 겹칠 수도 없다."
9. 다음은 URL 구조에 관한 문제이다 . 아래 보기의 순서대로 URL에 해당하는 번호를 작성하시오.

- query : 서버에 전달할 추가 데이터
- path : 서버 내의 특정 자원을 가리키는 경로
- scheme : 리소스에 접근하는 방법이나 프로토콜
- authority : 사용자 정보, 호스트명, 포트 번호
- fragment : 특정 문서 내의 위치
정답 : 43125
10. (Python) 아래 코드를 확인하여 알맞는 출력값을 작성하시오.
def func(value): if type(value) == type(100): # 정수형 return 100 elif type(value) == type(""): # 문자열 return len(value) else: return 20 # 그 외의 타입 a = '100.0' # 문자열 b = 100.0 # 실수 (float) c = (100, 200) # 튜플 print(func(a) + func(b) + func(c))
정답 : 45
a는 문자열이니까 len('100.0') 해서 5
b는 실수형이라서 else 블럭으로 가서 20
c는 튜플형이므로 else 블럭으로 가서 20 리턴
총 합은 5 + 20 + 20 = 45
11. (Java) 아래 코드를 확인하여 알맞는 출력값을 작성하시오.
public class Main{ public static void main(String[] args){ Base a = new Derivate(); Derivate b = new Derivate(); System.out.print(a.getX() + a.x + b.getX() + b.x); } } class Base{ int x = 3; int getX(){ return x * 2; } } class Derivate extends Base{ int x = 7; int getX(){ return x * 3; } }
정답 : 52
- 필드(변수)는 오버라이딩되지 않는다. → 필드는 선언된 타입에 따라 접근한다.
- 메서드는 오버라이딩된다. → 메서드는 실제 객체 타입에 따라 호출된다.
Base a = new Derivate(); Derivate b = new Derivate();
- a는 Base 타입이지만 Derivate 객체 참조
- b는 Derivate 타입이고 Derivate 객체 참조
System.out.print( a.getX() // 메서드는 오버라이딩 → Derivate.getX() → 7 * 3 = 21 + a.x // 필드는 Base 타입 기준 → Base.x = 3 + b.getX() // Derivate.getX() → 7 * 3 = 21 + b.x // Derivate 타입 기준 → Derivate.x = 7 );
- a.getX() = 21
- a.x = 3
- b.getX() = 21
- b.x = 7
합계 = 21 + 3 + 21 + 7 = 52
12. (C언어) 아래 코드를 확인하여 알맞는 출력값을 작성하시오.
#include <stdio.h> struct Node { int value; struct Node* next; }; void func(struct Node* node){ while(node != NULL && node->next != NULL){ int t = node->value; node->value = node->next->value; node->next->value = t; node = node->next->next; } } int main(){ struct Node n1 = {1, NULL}; struct Node n2 = {2, NULL}; struct Node n3 = {3, NULL}; n1.next = &n3; n3.next = &n2; func(&n1); struct Node* current = &n1; while(current != NULL){ printf("%d", current->value); current = current->next; } return 0; }
정답 : 312
[구조체 선언]
struct Node { int value; struct Node* next; }; struct Node n1 = {1, NULL}; struct Node n2 = {2, NULL}; struct Node n3 = {3, NULL}; n1.next = &n3; n3.next = &n2;
구조체 정의 후 메인함수에서 노드 세 개를 정의하고 있다.
[연결구조]
n1 (1) → n3 (3) → n2 (2) → NULL
[func 함수 로직]
void func(struct Node* node){ while(node != NULL && node->next != NULL){ int t = node->value; node->value = node->next->value; node->next->value = t; node = node->next->next; } }
인접한 두 노드의 값을 바꾸고 그 다음 두 칸 건너뛰기
[⚙️ func(&n1) 실행 흐름]
n1 (1) → n3 (3) → n2 (2)
■ 첫번째 반복 (node = n1)
- node = n1, node->next = n3
- Swap n1.value ↔ n3.value → n1 = 3, n3 = 1
- node = node->next->next → node = n2
■ 두 번째 2nd 반복 (node = n2)
- node = n2, but node->next = NULL → 루프 종료
최종 연결 상태
n1.value = 3
n1.next.value = 1
n1.next.next.value = 2
출력 순서: 3 1 2
13. 다음은 테스트 커버리지에 대한 문제이다. 아래 내용에 알맞는 답을 보기에서 골라 작성하시오.
1. 테스트를 통해 프로그램의 모든 문장을 최소한 한 번씩 실행했는지를 측정
2. 프로그램 내의 모든 분기(조건문)의 각 분기를 최소한 한 번씩 실행했는지를 측정
3. 복합 조건 내의 각 개별 조건이 참과 거짓으로 평가되는 경우를 모두 테스트했는지를 측정
[보기]
ㄱ. 조건 ㄴ. 경로 ㄷ. 결정 ㄹ. 분기 ㅁ.함수 ㅂ. 문장 ㅅ. 루프
정답
1. 문장 / 2. 분기 / 3. 조건
14.아래는 UML클래스의 관계에 관한 문제이다. 보기를 보고 알맞는 관계를 선택하여 작성하시오.

정답
(1) 연관 (2) 일반화 (3) 의존
15. 다음은 데이터베이스에 관한 문제이다. 아래 내용을 읽고 알맞는 답을 보기에서 찾아 골라 작성하시오
(1) 다른 테이블, 릴레이션의 기본 키를 참조하는 속성 또는 속성들의 집합
(2) 테이블에서 각 행을 유일하게 식별할 수 있는 최소한의 속성들의 집합
(3) 후보 키 중에서 선정된 기본 키를 제외한 나머지 후보 키
(4) 테이블에서 각 행을 유일하게 식별할 수 있는 속성들의 집합
[보기]
ㄱ. 슈퍼키 ㄴ. 외래키 ㄷ. 대체키 ㄹ. 후보키
정답
(1) 외래키 / (2) 후보키 / (3) 대체키 / (4) 슈퍼키
16. (C언어) 아래 코드를 확인하여 알맞는 출력값을 작성하시오.
#include <stdio.h> void func(int** arr, int size){ for(int i=0; i<size; i++){ *(*arr + i) = (*(*arr+i) + i) % size; } } int main(){ int arr[] = {3,1, 4, 1, 5}; int* p = arr; int** pp = &p; int num = 6; func(pp, 5); num = arr[2]; printf("%d", num); return 0; }
정답 : 1
int arr[] = {3, 1, 4, 1, 5}; // 크기 5 int* p = arr; // p → arr 배열의 첫 번째 원소 int** pp = &p; // pp는 p를 가리킴 → 결국 pp → arr
→ func(pp, 5)이 호출된다.
[func() 함수]
for(int i = 0; i < size; i++) { *(*arr + i) = (*(*arr + i) + i) % size; }
이건 결국 arr[i] = (arr[i] + i) % size 와 같은 의미이다.
[계산 과정]
- (size = 5)
- arr[0] = (3 + 0) % 5 = 3
- arr[1] = (1 + 1) % 5 = 2
- arr[2] = (4 + 2) % 5 = 6 % 5 = 1
- arr[3] = (1 + 3) % 5 = 4
- arr[4] = (5 + 4) % 5 = 9 % 5 = 4
[변경된 배열]
arr = {3, 2, 1, 4, 4}
[이후]
num = arr[2]; // num = 1 printf("%d", num);
17. 다음 아래 내용을 보고 알맞는 용어를 작성하시오. (3글자로 작성)
- 공용 네트워크를 통해 사설 네트워크를 확장하는 기술이다.
- 사용자의 IP 주소를 숨기고, 사용자가 어디에서 접속하는지를 추적하기 어렵게 만든다.
- 종류로는 IPsec 또는 SSL, L2TP 등이 있다.
정답 : VPN
18. (Java) 아래 코드를 확인하여 알맞는 출력값을 작성하시오.
public class ExceptionHandling { public static void main(String[] args) { int sum = 0; try { func(); } catch (NullPointerException e) { sum = sum + 1; } catch (Exception e) { sum = sum + 10; } finally { sum = sum + 100; } System.out.print(sum); } static void func() throws Exception { throw new NullPointerException(); } }
정답 : 101
- NullPointerException은 Exception의 하위 클래스이다.
- func()는 NullPointerException을 throw 한다.
- 따라서 try에서 예외가 발생하고 NullPointerException catch 블록이 실행된다.
- 그 다음 finally 블록은 무조건 실행된다.
💡 실행 순서
- func() 호출 → NullPointerException 발생
- catch (NullPointerException e) 실행 → sum += 1 → sum = 1
- finally 블록 실행 → sum += 100 → sum = 101
19. (Java) 아래 코드를 확인하여 알맞는 출력값을 작성하시오. ⭐⭐⭐⭐⭐
class Main { public static class Collection<T>{ T value; public Collection(T t){ value = t; } public void print(){ new Printer().print(value); } class Printer{ void print(Integer a){ System.out.print("A" + a); } void print(Object a){ System.out.print("B" + a); } void print(Number a){ System.out.print("C" + a); } } } public static void main(String[] args) { new Collection<>(0).print(); } }
정답 : B0
듣도 보도 못한 제네릭 문제
Container은 클래스 이름
오버로딩 = 이름 같은데 파라미터 갯수/타입 다름 = 중복정의
Printer 클래스에는 파라미터에 따라 오버로딩
저 앞에 해당되는 객체의 형태에 따라서 다른 것이 출력됨
Container 이라는 제네릭 클래스를 사용해서 사용해서 0 을 전달했을 때 과연 Integer로 인식할 것인가?
public static void main(String[] args) { new Collection<>(0).print(); }
메인 함수는 이거 한 줄 이다. new container <>(0).print();
컨테이너 객체를 만들었는데 뉴 컨테이너에 0을 넣고 타입을 추상화해서 넣고 여기 클래스 안에 정의되어 있는 print()라는 메서드를 실행했다.
public static class Collection<T>{ T value; public Collection(T t){ value = t; } public void print(){ new Printer().print(value); } }
그 아래 Container 클래스를 보자.
여기서 value는 T 타입인데, 제네릭 타입은 컴파일 타임에 타입이 지워진다.
여기서 0은 int 로 Integer로 바뀌기는 하는데 (박싱) 하지만 제네릭 타입으로 들어가는 순간 컴파일 타임에 타입이 소거된다. 이를 타입 소거(type erasure)라고 하는데 구체적으로 타입을 작성하지 않고 T로 하면, 상위타입인 Object로 바뀌는 현상이다.
즉, Integer로 들어가지 않고 오버로딩 되었을 때 value 가 Object가 되어 오브젝트형으로 오버로딩 된다.
즉, 컴파일러는 print(Object a)를 호출하고, "B" + 0 은 문자열화되어 B0이 됨
다시 메서드 오버로딩을 정리하자면
void print(Integer a) { System.out.print("A" + a); } void print(Object a) { System.out.print("B" + a); } void print(Number a) { System.out.print("C" + a); }
🔥 이건 오버로딩이지 오버라이딩이 아니다.
🔥 오버로딩에서는 컴파일 타임의 타입이 중요하다.
🔥 value는 런타임에는 Integer지만, **컴파일 타임에는 Object**로 간주된다. (type erasure 때문)
20. 다음은 네트워크에 대한 문제이다. 아래 내용을 보고 알맞는 용어를 작성하시오.
- 중앙 관리나 고정된 인프라 없이 임시로 구성되는 네트워크이다.
- 일반적으로 무선 통신을 통해 노드들이 직접 연결되어 데이터를 주고받는다.
- 긴급 구조, 긴급 회의, 군사적인 상황 등에서 유용하게 활용될 수 있다.
[보기]
ㄱ.Infrastructure Network ㄴ. Firmware Network ㄷ. Peer-to-Peer Network
ㄹ. Ad-hoc Network ㅁ. Mesh Network ㅂ.Sensor Network ㅅ.Virtual Private Network
정답 : ㄹ
'정보처리기사' 카테고리의 다른 글
[C언어] 포인터, Call by Reference, 2차원 배열 행 대표주소, 구조체 정리 (0) | 2025.04.19 |
---|---|
[C언어] 변수의 유효범위, 논리연산자, 증감연산자, static 변수, global 변수 주의사항 정리 (3) | 2025.04.10 |
[정보처리기사] 비트연산자 정리 - AND, OR, XOR, NOT, 왼쪽 시프트(<<), 오른쪽시프트(>>) 연산 (6) | 2025.04.06 |
[정보처리기사] 동기/비동기 전송, 흐름제어, 오류 제어, OSI 참조 모델, 프로토콜 등 (10) | 2025.04.05 |
[정보처리기사] 운영체제/ 기억장치 / 프로세스 / 스레드 / 교착상태 (2) | 2025.04.05 |