[2023년 2회] 정보처리기사 실기 복원 문제 해설
문제 1. C언어 배열 순환 출력
문제 코드
int main(void) {
int n[5];
int i;
for (i = 0; i < 5; i++) {
printf("숫자를 입력해주세요 : ");
scanf("%d", &n[i]);
}
for (i = 0; i < 5; i++) {
printf("%d", ( ) );
}
return 0;
}
조건: 입력값이 54321일 경우 출력값이 43215로 출력되어야 한다.
정답
n[(i+1) % 5]
해설
입력과 출력 분석:
입력: 54321 → 배열에 저장
n[0] = 5n[1] = 4n[2] = 3n[3] = 2n[4] = 1
출력: 43215 (한 칸씩 왼쪽으로 순환)
출력 과정:
| i | (i+1) % 5 | 출력값 |
|---|---|---|
| 0 | 1 | n[1] = 4 |
| 1 | 2 | n[2] = 3 |
| 2 | 3 | n[3] = 2 |
| 3 | 4 | n[4] = 1 |
| 4 | 0 | n[0] = 5 |
배열 순환 시각화:
초기: [5][4][3][2][1]
↑ ↑ ↑ ↑ ↑
0 1 2 3 4
출력: 4 3 2 1 5
↑ ↑ ↑ ↑ ↑
i=1 i=2 i=3 i=4 i=0모듈로 연산:
(i+1) % 5로 인덱스를 한 칸씩 이동- 마지막 인덱스(4) 다음은 0으로 순환
핵심 개념:
- 모듈로 연산: 순환 인덱스 생성
- 배열 순환: 마지막 요소 다음은 첫 요소로
문제 2. Java 거스름돈 계산
문제 코드
public class Problem{
public static void main(String[] args){
m = 4620;
a = ( ); // 1000원짜리 4장
b = ( ); // 500원짜리 1개
c = ( ); // 100원짜리 1개
d = ( ); // 10원짜리 2개
System.out.println(a); // 4 출력
System.out.println(b); // 1 출력
System.out.println(c); // 1 출력
System.out.println(d); // 2 출력
}
}
조건: 변수 m, 연산자 /, %, 괄호, 정수 1000, 500, 100, 10만 사용
정답
- a = m / 1000
- b = (m % 1000) / 500
- c = (m % 500) / 100
- d = (m % 100) / 10
해설
거스름돈 계산 과정:
총 금액: m = 4620원
1000원 개수:
m / 1000=4620 / 1000=4(정수 나눗셈)a = 4
500원 개수:
m % 1000=4620 % 1000=620(1000원 제외한 나머지)(m % 1000) / 500=620 / 500=1b = 1
100원 개수:
m % 500=4620 % 500=120(500원 제외한 나머지)(m % 500) / 100=120 / 100=1c = 1
10원 개수:
m % 100=4620 % 100=20(100원 제외한 나머지)(m % 100) / 10=20 / 10=2d = 2
계산 과정 표:
| 단계 | 계산 | 결과 | 설명 |
|---|---|---|---|
| 1 | 4620 / 1000 | 4 | 1000원 개수 |
| 2 | 4620 % 1000 | 620 | 1000원 제외한 나머지 |
| 3 | 620 / 500 | 1 | 500원 개수 |
| 4 | 620 % 500 | 120 | 500원 제외한 나머지 |
| 5 | 120 / 100 | 1 | 100원 개수 |
| 6 | 120 % 100 | 20 | 100원 제외한 나머지 |
| 7 | 20 / 10 | 2 | 10원 개수 |
검증:
4 × 1000 + 1 × 500 + 1 × 100 + 2 × 10= 4000 + 500 + 100 + 20= 4620✓
문제 3. C언어 포인터와 전역 변수
문제 코드
#include<stdio.h>
#include<stdlib.h>
char n[30];
char *test() {
printf("입력하세요 : ");
gets(n);
return n;
}
int main()
{
char * test1;
char * test2;
char * test3;
test1 = test();
test2 = test();
test3 = test();
printf("%s\n",test1);
printf("%s\n",test2);
printf("%s\n",test3);
}
조건: 입력값은 홍길동, 김철수, 박영희 순서로 주어진다.
정답
박영희
박영희
박영희해설
문제 원인:
전역 변수 사용:
char n[30]은 전역 변수- 모든 함수 호출이 같은 메모리 공간 사용
포인터 반환:
test()함수는 항상 같은 주소(n)를 반환test1,test2,test3모두 같은 주소를 가리킴
실행 과정:
| 호출 | 입력 | n 배열 내용 | 반환 주소 |
|---|---|---|---|
test1 = test() |
"홍길동" | "홍길동" | &n |
test2 = test() |
"김철수" | "김철수" | &n (덮어씀) |
test3 = test() |
"박영희" | "박영희" | &n (덮어씀) |
메모리 상태:
전역 변수 n[30]:
초기: [빈 배열]
test1: ["홍길동"]
test2: ["김철수"] (덮어씀)
test3: ["박영희"] (덮어씀)
포인터:
test1 → &n
test2 → &n (같은 주소)
test3 → &n (같은 주소)출력:
test1,test2,test3모두&n을 가리킴n의 최종 값은 "박영희"- 따라서 모두 "박영희" 출력
해결 방법:
- 지역 변수 사용
- 동적 메모리 할당 (
malloc) - 배열 복사
문제 4. SQL INSERT
문제
테이블 구조:
CREATE TABLE 학생 (
학번 int,
이름 varchar(20),
학년 int,
전공 varchar(30),
전화번호 varchar(20)
);
삽입할 데이터:
| 학번 | 이름 | 학년 | 전공 | 전화번호 |
|------|------|------|------|---------|
| 9830287 | 뉴진스 | 3 | 경영학개론 | 010-1234-1234 |
조건: 문자열일 경우 작은따옴표 사용
정답
INSERT INTO 학생(학번, 이름, 학년, 전공, 전화번호)
VALUES(9830287, '뉴진스', 3, '경영학개론', '010-1234-1234');
해설
INSERT 문법:
INSERT INTO 테이블명(컬럼1, 컬럼2, ...)
VALUES(값1, 값2, ...);
데이터 타입별 처리:
| 데이터 타입 | 값 표기 | 예시 |
|---|---|---|
| 정수 | 따옴표 없음 | 9830287, 3 |
| 문자열 | 작은따옴표 | '뉴진스', '경영학개론' |
INSERT 실행 결과:
삽입 전:
| 학번 | 이름 | 학년 | 전공 | 전화번호 |
|------|------|------|------|---------|
| (비어있음) | | | | |
삽입 후:
| 학번 | 이름 | 학년 | 전공 | 전화번호 |
|------|------|------|------|---------|
| 9830287 | 뉴진스 | 3 | 경영학개론 | 010-1234-1234 |
주의사항:
- 컬럼 순서와 값 순서 일치
- 문자열은 작은따옴표 필수
- 숫자는 따옴표 없음
문제 5. C언어 switch문 (break 없음)
문제 코드
#include <stdio.h>
void main(){
int n[3] = {73, 95, 82};
int sum = 0;
for(int i=0;i<3;i++){
sum += n[i];
}
switch(sum/30){
case 10:
case 9: printf("A");
case 8: printf("B");
case 7:
case 6: printf("C");
default: printf("D");
}
}
정답
BCD
해설
실행 과정:
합계 계산:
sum = 73 + 95 + 82 = 250
switch 조건:
sum / 30=250 / 30=8(정수 나눗셈)
switch 실행:
case 8:로 이동- break가 없으므로 아래 모든 case 실행
case 8:→printf("B")→ B 출력case 7:→ 건너뜀case 6:→printf("C")→ C 출력default:→printf("D")→ D 출력
switch문 실행 흐름:
switch(8):
case 10: (건너뜀)
case 9: (건너뜀)
case 8: → "B" 출력
case 7: (건너뜀)
case 6: → "C" 출력
default: → "D" 출력switch문 특징:
break가 없으면 다음 case로 계속 실행 (fall-through)default는 항상 실행됨
출력 순서:
- B (case 8)
- C (case 6)
- D (default)
최종 출력: BCD
문제 6. 테스트 커버리지
문제
프로그램 내에 있는 결정포인트 내의 모든 각 개별 조건식에 대한 모든 가능한 결과(참/거짓)에 대해 적어도 한번 수행한다.
소프트웨어 테스트 수행시 소스코드를 어느 수준까지 수행하였는가를 나타내는 기준을 나타낸다.
실제 업무에서는 다양한 툴을 사용하여 테스팅 수행한다.
True/False에 충분한 영향을 줄 수 없는 경우가 발생 가능한 한계점을 지닌다.
보기: ㄱ. 구문 커버리지, ㄴ. 경로 커버리지, ㄷ. 조건/결정 커버리지, ㄹ. 변형 조건/결정 커버리지, ㅂ. 다중 조건 커버리지, ㅅ. 결정 커버리지, ㅇ. 조건 커버리지
정답
ㅇ. 조건 커버리지 (Condition Coverage)
해설
테스트 커버리지 종류:
| 커버리지 | 설명 | 측정 대상 |
|---|---|---|
| 구문 커버리지 | 모든 문장 실행 | 문장 |
| 분기 커버리지 | 모든 분기 실행 | 분기 |
| 조건 커버리지 | 각 조건식의 참/거짓 실행 | 조건 |
| 결정 커버리지 | 모든 결정의 참/거짓 실행 | 결정 |
| 조건/결정 커버리지 | 조건과 결정 모두 커버 | 조건 + 결정 |
| 변형 조건/결정 커버리지 | 각 조건이 독립적으로 영향 | 조건의 독립성 |
| 다중 조건 커버리지 | 모든 조건 조합 테스트 | 조건 조합 |
조건 커버리지 특징:
| 특징 | 설명 |
|---|---|
| 목적 | 각 개별 조건식의 참/거짓 테스트 |
| 측정 | 조건식의 참/거짓 결과 |
| 한계 | True/False에 충분한 영향 없는 경우 발생 |
| 도구 | 다양한 테스팅 툴 사용 |
예시 코드:
if (a > 0 && b < 10) { // 조건: a > 0, b < 10
statement1;
}
조건 커버리지 테스트:
a > 0= truea > 0= falseb < 10= trueb < 10= false
조건 커버리지 vs 결정 커버리지:
| 구분 | 조건 커버리지 | 결정 커버리지 |
|---|---|---|
| 대상 | 개별 조건식 | 전체 결정(조건문) |
| 측정 | 각 조건의 참/거짓 | 결정의 참/거짓 |
| 예시 | a > 0의 참/거짓 |
if (a > 0 && b < 10)의 참/거짓 |
문제 7. C언어 4의 배수 개수
문제 코드
#include <stdio.h>
int main(){
int c = 0;
for(int i = 1; i <= 2023; i++) {
if(i % 4 == 0) c++;
}
printf("%d", c);
}
정답
505
해설
계산 과정:
4의 배수 개수:
- 1부터 2023까지의 4의 배수 개수
- 4, 8, 12, 16, ..., 2020
계산 방법:
- 첫 번째 4의 배수: 4
- 마지막 4의 배수: 2020 (2023보다 작거나 같은 최대값)
- 개수:
2020 / 4 = 505
검증:
2023 / 4 = 505.75→ 정수 부분: 505- 4의 배수: 4, 8, 12, ..., 2020
- 총 505개
4의 배수 목록 (일부):
4, 8, 12, 16, 20, ..., 2016, 2020수식:
⌊2023 / 4⌋ = 505
문제 8. 템퍼프루핑 (Tamper-Proofing)
문제
소프트웨어에서 워터마크 삭제등과 같이 소프트웨어가 불법으로 변경(unauthorized modifications)되었을 경우, 그 소프트웨어가 정상 수행되지 않게 하는 기법이다.
소프트웨어 변조 공격을 방어하기 위해 프로그램에 변조검증코드(tamper-proofing code)를 삽입하는 것도 한 방법으로
변조검증코드의 용도는 첫째 프로그램이 변경되었는지를 탐지하는 것이고, 둘째는 변조가 탐지되었다면 프로그램이 실행되지 않게 한다.
소프트웨어의 위변조 방지 역공학 기술의 일종으로 디지털 콘텐츠의 관련 산업이나 전자상거래 또는 보호해야 할 소프트웨어가 있는 다양한 산업 분야에 적용된다.
정답
템퍼프루핑 (Tamper-Proofing)
해설
템퍼프루핑 특징:
| 특징 | 설명 |
|---|---|
| 목적 | 소프트웨어 변조 방지 |
| 방법 | 변조검증코드 삽입 |
| 기능 | 변조 탐지 및 실행 차단 |
| 적용 | 디지털 콘텐츠, 전자상거래, 보호 소프트웨어 |
템퍼프루핑 동작 과정:
[정상 프로그램]
↓
[변조 시도]
↓
[변조검증코드 실행]
↓
[변조 탐지]
↓
[프로그램 실행 차단]변조검증코드 기능:
| 기능 | 설명 |
|---|---|
| 탐지 | 프로그램 변경 여부 확인 |
| 차단 | 변조 시 실행 중단 |
템퍼프루핑 적용 분야:
- 디지털 콘텐츠 보호
- 전자상거래 보안
- 중요 소프트웨어 보호
- 라이선스 관리
관련 기술:
- 워터마킹
- 코드 난독화
- 역공학 방지
문제 9. C언어 스택 구현
문제 코드
#include <stdio.h>
#define MAX_SIZE 10
int isWhat[MAX_SIZE];
int point = -1;
int isEmpty() {
if (point == -1) return 1;
return 0;
}
int isFull() {
if (point == 10) return 1;
return 0;
}
void into(int num) {
if (point >= 10) printf("Full");
else isWhat[++point] = num;
}
int take() {
if (isEmpty() == 1) printf("Empty");
else return isWhat[point--];
return 0;
}
int main(int argc, char const *argv[]){
int e;
into(5); into(2);
while(!isEmpty()){
printf("%d", take());
into(4); into(1); printf("%d", take());
into(3); printf("%d", take()); printf("%d", take());
into(6); printf("%d", take()); printf("%d", take());
}
return 0;
}
정답
213465
해설
스택 동작 (LIFO - Last In First Out):
초기 상태:
point = -1
스택: [ ]실행 과정:
into(5); into(2);into(5):point = 0,isWhat[0] = 5into(2):point = 1,isWhat[1] = 2- 스택:
[5, 2](아래에서 위로)
while(!isEmpty())시작첫 번째 반복:
printf("%d", take()):take()→2반환,point = 0→ 2 출력into(4):point = 1,isWhat[1] = 4into(1):point = 2,isWhat[2] = 1- 스택:
[5, 4, 1] printf("%d", take()):take()→1반환,point = 1→ 1 출력into(3):point = 2,isWhat[2] = 3- 스택:
[5, 4, 3] printf("%d", take()):take()→3반환,point = 1→ 3 출력printf("%d", take()):take()→4반환,point = 0→ 4 출력into(6):point = 1,isWhat[1] = 6- 스택:
[5, 6] printf("%d", take()):take()→6반환,point = 0→ 6 출력printf("%d", take()):take()→5반환,point = -1→ 5 출력isEmpty()=true→ 루프 종료
스택 상태 변화:
| 연산 | 스택 상태 | point | 출력 |
|---|---|---|---|
| 초기 | [ ] | -1 | - |
| into(5) | [5] | 0 | - |
| into(2) | [5, 2] | 1 | - |
| take() | [5] | 0 | 2 |
| into(4) | [5, 4] | 1 | - |
| into(1) | [5, 4, 1] | 2 | - |
| take() | [5, 4] | 1 | 1 |
| into(3) | [5, 4, 3] | 2 | - |
| take() | [5, 4] | 1 | 3 |
| take() | [5] | 0 | 4 |
| into(6) | [5, 6] | 1 | - |
| take() | [5] | 0 | 6 |
| take() | [ ] | -1 | 5 |
출력 순서:
- 2 → 1 → 3 → 4 → 6 → 5
- 213465
문제 10. 데이터베이스 설계 순서
문제
데이터베이스 설계 순서에 관한 내용이다. 보기를 이용하여 괄호안에 알맞은 내용을 작성하시오.
보기: 구현, 요구조건 분석, 개념적 설계, 물리적 설계, 논리적 설계
정답
요구조건 분석 → 개념적 설계 → 논리적 설계 → 물리적 설계 → 구현
해설
데이터베이스 설계 단계:
| 단계 | 설명 | 주요 작업 |
|---|---|---|
| 1. 요구조건 분석 | 사용자 요구사항 수집 및 분석 | 인터뷰, 문서 분석 |
| 2. 개념적 설계 | E-R 모델링, 개념적 스키마 작성 | 개체, 관계, 속성 정의 |
| 3. 논리적 설계 | 관계형 모델로 변환 | 릴레이션 스키마 설계 |
| 4. 물리적 설계 | 저장 구조 및 인덱스 설계 | 파일 구조, 접근 방법 |
| 5. 구현 | 실제 데이터베이스 생성 | DDL, DML 작성 |
설계 단계 다이어그램:
[요구조건 분석]
↓
[개념적 설계] (E-R 모델)
↓
[논리적 설계] (관계형 모델)
↓
[물리적 설계] (저장 구조)
↓
[구현] (실제 DB 생성)각 단계 설명:
1. 요구조건 분석:
- 사용자 요구사항 수집
- 데이터 및 처리 요구사항 분석
2. 개념적 설계:
- E-R 다이어그램 작성
- 개체, 관계, 속성 정의
- 개념적 스키마 작성
3. 논리적 설계:
- E-R 모델을 관계형 모델로 변환
- 릴레이션 스키마 설계
- 정규화 수행
4. 물리적 설계:
- 저장 구조 결정
- 인덱스 설계
- 접근 방법 선택
5. 구현:
- DDL로 스키마 생성
- 데이터 입력
- 애플리케이션 개발
문제 11. 디자인 패턴
문제
1.
생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다.
주로 공통된 객체를 여러개 생성해서 사용하는 DBCP(DataBase Connection Pool)와 같은 상황에서 많이 사용한다.
2.
호스트 객체의 내부 상태에 접근할 수 있는 방법을 제공하여 호스트 객체에 연산을 추가할 수 있도록 한다.
이 패턴은 보통 합성 구조의 원소들과 상호 작용하는 데 사용되며, 기존 코드를 변경하지 않고 새로운 기능을 추가하는 방법이다.
보기:
- 생성패턴: Singleton, Factory Method, Builder
- 구조패턴: Adapter, Bridge, Decorator
- 행위패턴: Observer, Strategy, Visitor
정답
1. Singleton (싱글톤)
2. Visitor (방문자)
해설
디자인 패턴 분류:
| 패턴 유형 | 설명 | 예시 |
|---|---|---|
| 생성 패턴 | 객체 생성 방법 정의 | Singleton, Factory, Builder |
| 구조 패턴 | 클래스/객체 조합 방법 | Adapter, Decorator, Bridge |
| 행위 패턴 | 객체 간 상호작용 방법 | Observer, Strategy, Visitor |
1. Singleton 패턴:
특징:
- 인스턴스가 하나만 생성
- 전역 접근점 제공
- DBCP 등에서 사용
구조:
class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
사용 예시:
- 데이터베이스 연결 풀
- 로깅 객체
- 설정 관리자
2. Visitor 패턴:
특징:
- 객체 구조와 연산 분리
- 새로운 연산 추가 용이
- 기존 코드 변경 없음
구조:
[Visitor] → [Element] → [ConcreteElement]
↓
[ConcreteVisitor]사용 예시:
- 컴파일러 (AST 순회)
- 문서 구조 처리
- 합성 구조 연산
Visitor 패턴 장점:
- 새로운 연산 추가 용이
- 관련 연산을 한 곳에 모음
- 복잡한 객체 구조 처리
문제 12. 오류 제어
문제
1. Code는 데이터 전송시 1 비트의 에러를 정정할 수 있는, 오류정정부호의 일종으로 미국의 Bell 연구소의 Hamming에 의해 고안되었다. 선형블록부호 및 순회부호에 속한다.
2. 은/는 송신측이 전송할 문자나 프레임에 부가적 정보(Redundancy)를 첨가하여 전송하고 수신측이 이 부가적 정보를 이용하여 에러검출 및 에러정정을 하는 방식이다.
3. 은/는 데이터 전송 과정에서 오류가 발생하면 송신 측에 재전송을 요구하는 방식이다. 오류를 검출하는 방법은 Parity검사와 CRC, 블록 합 검사 등이 있다.
4. 은/는 데이터가 저장장치 내의 한 장소에서 다른 장소로 이동되거나, 컴퓨터들간에 전송될 때, 데이터가 유실 또는 손상되었는지 여부를 점검하는 기술과 관련된 용어이다.
5. 은/는 네트워크 등을 통하여 데이터를 전송할 때 전송된 데이터에 오류가 있는지를 확인하기 위한 체크값을 결정하는 방식을 말한다.
보기: EAC, FEC, hamming, CRC, PDS, parity, BEC
정답
1. hamming (해밍 코드)
2. FEC (Forward Error Correction)
3. BEC (Backward Error Correction)
4. parity (패리티)
5. CRC (Cyclic Redundancy Check)
해설
오류 제어 방식 비교:
| 방식 | 설명 | 특징 |
|---|---|---|
| FEC | 전진 오류 정정 | 부가 정보로 오류 정정 |
| BEC | 후진 오류 정정 | 재전송 요구 |
| 해밍 | 1비트 오류 정정 | 해밍이 고안 |
| 패리티 | 오류 검출 | 유실/손상 점검 |
| CRC | 체크값 결정 | 순환 중복 검사 |
1. 해밍 코드 (Hamming Code):
특징:
- 1비트 오류 정정 가능
- Bell 연구소 Hamming 고안
- 선형블록부호, 순회부호
2. FEC (Forward Error Correction):
특징:
- 부가 정보 첨가
- 수신측에서 오류 정정
- 재전송 불필요
3. BEC (Backward Error Correction):
특징:
- 오류 발생 시 재전송 요구
- Parity, CRC, 블록 합 검사 사용
- ARQ (Automatic Repeat Request)
4. 패리티 (Parity):
특징:
- 데이터 유실/손상 점검
- 단순 오류 검출
- 짝수/홀수 패리티
5. CRC (Cyclic Redundancy Check):
특징:
- 체크값 결정 방식
- 순환 중복 검사
- 높은 오류 검출률
오류 제어 방식 분류:
오류 제어
├─ FEC (전진 오류 정정)
│ └─ 해밍 코드
├─ BEC (후진 오류 정정)
│ └─ ARQ
└─ 오류 검출
├─ 패리티
└─ CRC문제 13. HDLC 프로토콜
문제
1. 프레임은 Seq, Next, P/F의 필드를 가진다. 또한 맨 처음 비트를 0으로 가진다. Seq는 송신용 순서번호를 가지고 있다. Next는 응답용 순서번호를 가진다. P/F는 P가 1로 설정된 경우 주국에서 종국에 데이터 전송을 허용하는 것을 의미하고 F가 1로 설정된 경우 종국에서 주국으로 데이터 전송을 하는 것을 의미한다.
2. 프레임은 맨 앞의 필드가 1로 되어 있어 정보 프레임이 아니라는 것을 나타내고 다음 비트가 0이 나와있다. Type의 경우에는 2비트를 가지고 있어 4가지의 종류로 나누어진다. 데이터를 보내는 역할이 아니라 응답의 기능을 수행하므로 Seq에 대한 값은 필요가 없고 다음 프레임을 요구하는 Next만 존재한다.
3. 프레임은 순서 번호가 없는 프레임을 의미한다. 첫 번째 비트와 두 번째 비트가 모두 1로 설정되어 있다. 여러 종류를 가지고 있는데 Type의 2비트와 Modifier의 3비트를 합쳐 5비트를 통해 종류를 나눈다.
4. 은/는 두 호스트 모두 혼합국으로 동작한다. 양쪽에서 명령과 응답을 전송할 수 있다.
5. 은/는 불균형 모드로 주국의 허락 없이 종국에서 데이터를 전송할 수 있다.
보기: ㄱ. 연결제어, ㄴ. 감독, ㄷ. 정보, ㄹ. 양방향 응답, ㅁ. 익명, ㅂ. 비번호, ㅅ. 릴레이, ㅇ. 동기균형, ㅈ. 동기응답, ㅊ. 비동기균형, ㅋ. 비동기응답
정답
1. ㄷ. 정보 (Information)
2. ㄴ. 감독 (Supervisory)
3. ㅂ. 비번호 (Unnumbered)
4. ㅊ. 비동기균형 (Asynchronous Balanced Mode)
5. ㅋ. 비동기응답 (Asynchronous Response Mode)
해설
HDLC 프레임 종류:
| 프레임 | 첫 비트 | 두 번째 비트 | 특징 |
|---|---|---|---|
| 정보 프레임 | 0 | - | Seq, Next, P/F 필드 |
| 감독 프레임 | 1 | 0 | Type 2비트, Next만 존재 |
| 비번호 프레임 | 1 | 1 | 순서 번호 없음, Type+Modifier 5비트 |
1. 정보 프레임 (Information Frame):
특징:
- 첫 비트: 0
- Seq: 송신용 순서번호
- Next: 응답용 순서번호
- P/F: 폴링/최종 비트
2. 감독 프레임 (Supervisory Frame):
특징:
- 첫 비트: 1, 두 번째 비트: 0
- Type: 2비트 (4가지 종류)
- Next만 존재 (Seq 없음)
- 응답 기능 수행
3. 비번호 프레임 (Unnumbered Frame):
특징:
- 첫 비트: 1, 두 번째 비트: 1
- 순서 번호 없음
- Type 2비트 + Modifier 3비트 = 5비트
HDLC 동작 모드:
| 모드 | 설명 | 특징 |
|---|---|---|
| 비동기응답 | 불균형 모드 | 종국이 주국 허락 없이 전송 |
| 비동기균형 | 균형 모드 | 양쪽 모두 혼합국, 명령/응답 전송 |
HDLC 프레임 구조:
정보 프레임: 0 | Seq | Next | P/F | 데이터
감독 프레임: 1 | 0 | Type | Next | P/F
비번호 프레임: 1 | 1 | Type | Modifier | P/F문제 14. Java 문자열 비교
문제 코드
public class Main{
public static void main(String[] args) {
String str1 = "Programming";
String str2 = "Programming";
String str3 = new String("Programming");
System.out.println(str1 == str2);
System.out.println(str1 == str3);
System.out.println(str1.equals(str3));
System.out.print(str2.equals(str3));
}
}
정답
true
false
true
true해설
실행 과정:
String str1 = "Programming":- 문자열 리터럴
- 문자열 풀(String Pool)에 저장
String str2 = "Programming":- 문자열 리터럴
- 같은 문자열이므로 풀에서 재사용
str1과 같은 객체 참조
String str3 = new String("Programming"):new연산자로 새 객체 생성- 힙 메모리에 새 객체 생성
- 다른 객체 참조
비교 연산:
| 비교 | 연산자 | 결과 | 설명 |
|---|---|---|---|
str1 == str2 |
== |
true | 같은 객체 참조 |
str1 == str3 |
== |
false | 다른 객체 참조 |
str1.equals(str3) |
equals() |
true | 내용이 같음 |
str2.equals(str3) |
equals() |
true | 내용이 같음 |
메모리 상태:
문자열 풀:
"Programming" ← str1, str2가 참조
힙 메모리:
new String("Programming") ← str3가 참조== vs equals():
| 구분 | == | equals() |
|---|---|---|
| 비교 대상 | 참조 (주소) | 내용 (값) |
| 문자열 리터럴 | 같은 객체면 true | 내용 같으면 true |
| new String() | 항상 false | 내용 같으면 true |
출력:
true(str1 == str2)false(str1 == str3)true(str1.equals(str3))true(str2.equals(str3))
문제 15. 암호화 알고리즘 분류
문제
대칭키와 비대칭키에 해당하는 보기의 내용을 작성하시오.
보기: DES, RSA, AES, ECC, ARIA, SEED
정답
대칭키: DES, AES, ARIA, SEED
비대칭키: RSA, ECC
해설
암호화 알고리즘 분류:
| 구분 | 알고리즘 | 설명 |
|---|---|---|
| 대칭키 | DES, AES, ARIA, SEED | 암호화/복호화에 같은 키 사용 |
| 비대칭키 | RSA, ECC | 공개키/개인키 쌍 사용 |
대칭키 암호화:
| 알고리즘 | 설명 | 특징 |
|---|---|---|
| DES | Data Encryption Standard | 56비트 키, 구식 |
| AES | Advanced Encryption Standard | 128/192/256비트 키, 표준 |
| ARIA | 한국 표준 암호 알고리즘 | 128/192/256비트 키 |
| SEED | 한국 표준 암호 알고리즘 | 128비트 키 |
비대칭키 암호화:
| 알고리즘 | 설명 | 특징 |
|---|---|---|
| RSA | Rivest-Shamir-Adleman | 큰 수의 소인수분해 기반 |
| ECC | Elliptic Curve Cryptography | 타원곡선 기반, 효율적 |
대칭키 vs 비대칭키:
| 구분 | 대칭키 | 비대칭키 |
|---|---|---|
| 키 개수 | 1개 | 2개 (공개키/개인키) |
| 속도 | 빠름 | 느림 |
| 용도 | 대용량 데이터 | 키 교환, 인증 |
| 보안 | 키 관리 중요 | 수학적 난이도 기반 |
암호화 방식 비교:
대칭키:
[평문] → [암호화] → [암호문] → [복호화] → [평문]
(같은 키) (같은 키)
비대칭키:
[평문] → [공개키 암호화] → [암호문] → [개인키 복호화] → [평문]문제 16. 해시 (Hash)
문제
( ) 란 임의의 크기를 가진 데이터(Key)를 고정된 크기의 데이터(Value)로 변화시켜 저장하는 것이다.
키에 대한 ( ) 값을 사용하여 값을 저장하고 키-값 쌍의 갯수에 따라 동적으로 크기가 증가한다.
( ) 값 자체를 index로 사용하기 때문에 평균 시간복잡도가 O(1)로 매우 빠르다.
( ) 함수는 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수이다.
( ) 함수는 큰 파일에서 중복되는 레코드를 찾을 수 있기 때문에 데이터베이스 검색이나 테이블 검색의 속도를 가속할 수 있다.
정답
해시 (Hash) 또는 해싱 (Hashing)
해설
해시 특징:
| 특징 | 설명 |
|---|---|
| 변환 | 임의 크기 → 고정 크기 |
| 저장 | 키-값 쌍으로 저장 |
| 크기 | 동적으로 증가 |
| 속도 | O(1) 평균 시간복잡도 |
| 용도 | 빠른 검색, 중복 검사 |
해시 테이블 구조:
키 (Key) 해시 함수 인덱스 (Index) 값 (Value)
"apple" → hash() → 3 → "사과"
"banana" → hash() → 1 → "바나나"
"cherry" → hash() → 5 → "체리"해시 함수 특징:
| 특징 | 설명 |
|---|---|
| 입력 | 임의의 길이 |
| 출력 | 고정된 길이 |
| 용도 | 데이터 매핑 |
해시 활용:
| 활용 | 설명 |
|---|---|
| 해시 테이블 | 빠른 검색 (O(1)) |
| 데이터베이스 | 인덱스, 검색 가속 |
| 중복 검사 | 파일 중복 레코드 찾기 |
| 암호화 | 해시 함수 (SHA, MD5) |
해시 충돌:
- 서로 다른 키가 같은 해시값을 가질 수 있음
- 해결 방법: 체이닝, 개방 주소법
문제 17. SQL DROP VIEW CASCADE
문제
보기:
DROP VIEW 학생 ( )
학생 테이블을 참조하는 다른 VIEW나 제약 조건까지 모두 삭제되어야 한다.
정답
CASCADE
해설
DROP VIEW 문법:
DROP VIEW 뷰명 [CASCADE | RESTRICT];
CASCADE vs RESTRICT:
| 옵션 | 설명 |
|---|---|
| CASCADE | 참조하는 객체까지 모두 삭제 |
| RESTRICT | 참조하는 객체가 있으면 삭제 불가 (기본값) |
CASCADE 동작:
[학생 VIEW]
↓ 참조
[다른 VIEW 1]
[다른 VIEW 2]
[제약 조건]
DROP VIEW 학생 CASCADE
↓
모든 참조 객체 삭제예시:
-- 학생 VIEW 삭제
DROP VIEW 학생 CASCADE;
-- 결과:
-- 학생 VIEW 삭제
-- 학생을 참조하는 다른 VIEW들 삭제
-- 관련 제약 조건 삭제
주의사항:
- CASCADE는 신중하게 사용
- 참조하는 모든 객체가 삭제됨
- 데이터 손실 가능성
문제 18. 선택 정렬 (Selection Sort)
문제 코드
#include <stdio.h>
int main() {
int E[] = {64, 25, 12, 22, 11};
int n = sizeof(E) / sizeof(E[0]);
int i = 0;
do {
int j = i + 1;
do {
if (E[i] ( ) E[j]) {
int tmp = E[i];
E[i] = E[j];
E[j] = tmp;
}
j++;
} while (j < n);
i++;
} while (i < n-1);
for(int i=0; i<=4; i++)
printf("%d ", E[i]);
}
보기: <, <=, =>, >, ==, /, %
정답
>
해설
선택 정렬 알고리즘:
오름차순 정렬:
- 현재 위치(i)보다 큰 값(j)을 찾아 교환
E[i] > E[j]일 때 교환
정렬 과정:
초기 배열: [64, 25, 12, 22, 11]
1회전 (i=0):
- j=1:
64 > 25→ 교환 →[25, 64, 12, 22, 11] - j=2:
25 > 12→ 교환 →[12, 64, 25, 22, 11] - j=3:
12 > 22→ 안함 - j=4:
12 > 11→ 교환 →[11, 64, 25, 22, 12]
2회전 (i=1):
- j=2:
64 > 25→ 교환 →[11, 25, 64, 22, 12] - j=3:
25 > 22→ 교환 →[11, 22, 64, 25, 12] - j=4:
22 > 12→ 교환 →[11, 12, 64, 25, 22]
최종: [11, 12, 22, 25, 64]
선택 정렬 알고리즘:
for i = 0 to n-2:
for j = i+1 to n-1:
if E[i] > E[j]:
swap(E[i], E[j])시간 복잡도:
- 최선: O(n²)
- 평균: O(n²)
- 최악: O(n²)
문제 19. Python 문자열 슬라이싱
문제 코드
a = "engineer information processing"
b = a[:3]
c = a[4:6]
d = a[28:]
e = b + c + d
print(e)
정답
engneing
해설
문자열 인덱스:
문자열: "engineer information processing"
인덱스: 0123456789...슬라이싱:
b = a[:3]:- 인덱스 0부터 2까지 (3 전까지)
"eng"
c = a[4:6]:- 인덱스 4부터 5까지 (6 전까지)
"ne"
d = a[28:]:- 인덱스 28부터 끝까지
"ing"
e = b + c + d:"eng" + "ne" + "ing""engneing"
문자열 슬라이싱:
| 표현식 | 의미 | 결과 |
|---|---|---|
a[:3] |
처음부터 인덱스 2까지 | "eng" |
a[4:6] |
인덱스 4부터 5까지 | "ne" |
a[28:] |
인덱스 28부터 끝까지 | "ing" |
문자열 연결:
+연산자로 문자열 연결"eng" + "ne" + "ing"="engneing"
문제 20. 스텁과 드라이버
문제
1.
하향식 테스트 시 상위 모듈은 존재하나 하위 모듈이 없는 경우의 테스트를 위해 임시 제공되는 모듈이다.
특별한 목적의 소프트웨어를 구현하는 것으로 컴포넌트를 개발하거나 테스트할 때 사용된다.
서버-클라이언트 구조에서 서버만 구현된 상태로 테스트를 해보고 싶을때 단순히 값만 넘겨주는 가상의 클라이언트를 만들어서 테스트 할 수 있다.
2.
상향식 테스트 시 상위 모듈 없이 하위 모듈이 존재할 때 하위 모듈 구동 시 자료 입출력을 제어하기 위한 제어 모듈(소프트웨어)이다.
서버-클라이언트 구조에서 클라이언트만 구현된 상태로 테스트를 해보고 싶을때 접속 인증 등의 간단한 기능만 하는 가상의 서버를 만들어서 테스트 할 수 있다.
정답
1. 스텁 (Stub)
2. 드라이버 (Driver)
해설
테스트 더미 (Test Dummy) 비교:
| 구분 | 스텁 (Stub) | 드라이버 (Driver) |
|---|---|---|
| 사용 시점 | 하향식 테스트 | 상향식 테스트 |
| 위치 | 하위 모듈 대체 | 상위 모듈 대체 |
| 기능 | 간단한 값 반환 | 제어 및 입출력 처리 |
| 예시 | 가상 클라이언트 | 가상 서버 |
하향식 테스트 (Top-Down):
[상위 모듈]
↓
[스텁] (하위 모듈 대체)상향식 테스트 (Bottom-Up):
[드라이버] (상위 모듈 대체)
↓
[하위 모듈]스텁 (Stub) 특징:
| 특징 | 설명 |
|---|---|
| 목적 | 하위 모듈 대체 |
| 기능 | 간단한 값 반환 |
| 예시 | 가상 클라이언트 |
드라이버 (Driver) 특징:
| 특징 | 설명 |
|---|---|
| 목적 | 상위 모듈 대체 |
| 기능 | 제어 및 입출력 처리 |
| 예시 | 가상 서버 |
서버-클라이언트 예시:
스텁 (클라이언트 대체):
[서버] ← [스텁] (값만 전달)드라이버 (서버 대체):
[드라이버] (인증 등) → [클라이언트]정리
출제 영역별 분류
| 영역 | 문제 수 | 문제 번호 |
|---|---|---|
| 프로그래밍 언어 | 8 | 1, 2, 3, 5, 7, 9, 14, 18, 19 |
| 데이터베이스 | 3 | 4, 10, 17 |
| 네트워크 | 2 | 12, 13 |
| 소프트웨어 공학 | 4 | 6, 8, 11, 20 |
| 보안 | 1 | 15 |
| 알고리즘 | 1 | 16 |
핵심 개념 정리
- 배열 순환: 모듈로 연산으로 인덱스 순환
- 거스름돈 계산: 나눗셈과 나머지 연산
- 포인터와 전역 변수: 같은 메모리 공간 공유 문제
- SQL INSERT: 문자열은 작은따옴표 사용
- switch문: break 없으면 fall-through
- 조건 커버리지: 각 조건식의 참/거짓 테스트
- 4의 배수: 나눗셈으로 개수 계산
- 템퍼프루핑: 소프트웨어 변조 방지
- 스택: LIFO 구조, push/pop 연산
- DB 설계 순서: 요구조건 → 개념 → 논리 → 물리 → 구현
- Singleton/Visitor: 디자인 패턴
- 오류 제어: 해밍, FEC, BEC, 패리티, CRC
- HDLC: 정보/감독/비번호 프레임
- 문자열 비교: ==는 참조, equals()는 내용
- 암호화 알고리즘: 대칭키/비대칭키 분류
- 해시: O(1) 검색, 키-값 매핑
- DROP VIEW CASCADE: 참조 객체까지 삭제
- 선택 정렬: 최소값 찾아 교환
- 문자열 슬라이싱: 인덱스 범위 지정
- 스텁/드라이버: 테스트 더미 모듈
작성일: 2023년
시험: 정보처리기사 실기 2023년 2회
유형: 복원 문제
'BackEnd > 정보처리기사' 카테고리의 다른 글
| 2022년 1회] 정보처리기사 실기 - 문제 (0) | 2026.02.25 |
|---|---|
| 정보처리기사 실기 - 2023년 3회 - 문제해설 (0) | 2026.02.24 |
| [2023년 1회] 정보처리기사 실기 - 문제 해설 (0) | 2026.02.23 |
| 2024년 정보처리기사 실기 2회 -문제해설 (0) | 2026.02.23 |
| [2024년 1회] 정보처리기사 실기 복원 문제 해설 (0) | 2026.02.22 |