1. 다음은 디자인 패턴(Design Pattern)에 대한 설명이다. 빈칸 ①, ②에 알맞은 용어를 <보기>에서 골라 쓰시오.
( ① ) Pattern | - 생성된 객체를 어디서든지 참조할 수 있도록 하는 패턴이다. - 전역 변수를 사용하지 않고 객체를 하나만 생성하도록 한다. |
( ② ) Pattern | - 객체 구조의 요소들에 수행할 오퍼레이션을 표현한 패턴이다. - 오퍼레이션이 처리할 요소의 클래스를 변경하지 않고도 새로운 오퍼레이션을 정의할 수 있게 한다. |
Adapter, Bridge, Composite, Decorator, Facade, Proxy, Singleton, Visitor |
① Singleton , ② Visitor
* 디자인 패턴(Design Pattern)
- 객체지향 프로그래밍 설계 시 유사한 상황에서 구조적인 문제를 해결할 수 있도록 방안을 제공
[생성 패턴]
- 객체를 생성하는 것과 관련된 패턴으로, 객체의 생성과 변경이 전체 시스템에 미치는 영향을 최소화하도록 만들어주어 유연성을 높일 수 있고 코드를 유지하기 쉬운 편이다.
- 객체의 생성과 참조 과정을 추상화함으로써 시스템을 개발할 때 부담을 덜어준다.
- 클래스나 객체의 생성과 참조과정을 정의하는 패턴
Factory Method | - 객체를 생성하기 위한 인터페이스를 정의하며 어떤 클래스가 인스턴스화될 것인지는 서브 클래스가 결정하도록 함 - 객체를 생성하는 인터페이스와 실제 객체를 생성하는 클래스 분리 가능 - Virtual -Constructor(가상 생성자) 패턴이라도고 함 |
Singleton | - 전역 변수를 사용하지 않고 객체를 하나만 생성하도록 한다. - 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴 |
Prototype | - 원본 객체를 복제하여 객체를 생성하는 패턴 - 일반적인 방법으로 객체를 생성하고 비용이 많이 소요되는 경우에 주로 사용 |
Builder | 작게 분리된 인스턴스를 조립하듯 조합하여 객체를 생성 |
Abstract Factory | - 구체적인 클래스에 의존하지 않고 서로 연관되거나 의존적인 객체들의 조합을 만드는 인터페이스를 제공하는 패턴 - 관련된 서브 클래스를 그룹지어 한 번에 교체할 수 있음 |
[구조 패턴]
- 클래스나 객체를 조합해 더 큰 구조를 만드는 패턴
- 복잡한 형태의 구조를 갖는 시스템을 개발하기 쉽게 만들어주는 패턴
- 새로운 기능을 가진 복합 객체를 효과적으로 작성할 수 있다.
- ex) 서로 다른 인터페이스를 지닌 2개의 객체를 묶어 단일 인터페이스를 제공하거나 객체들을 서로 묶어 새로운 기능을 제공하는 패턴. 프로그램 내의 자료구조나 인터페이스 구조 등을 설계하는데 많이 활용
Composite | 여러 개로 객체로 구성된 복합 객체와 단일 객체를 클라이언트에서 구별없이 다루게 해주는 패턴 |
Adapter | 호환성이 없는 인터페이스 때문에 함께 사용할 수 없는 (기존)클래스를 개조하여 함께 작동할 수 있도록 해주는 패턴 |
Bridge | 기능 클래스 계층과 구현 클래스 계층을 연결하고, 구현부에서 추상 계층을 분리하여 각자 독립적으로 변형할 수 있도록 해주는 패턴 |
Decorator | 객체의 결합을 통해 기능을 동적으로 유연하게 확장할 수 있게 해주는 해턴 |
Facade | - '건물의 (앞쪽)정면' - Facade 인터페이스를 제공하여 facade 객체를 통해서만 모든 관계가 이루어질 수 있도록 인터페이스를 단순화 - 클래스 간 의존 관계가 줄어들고 복잡성이 낮아지는 효과 |
Flyweight | 인스턴스가 필요할 때마다 매번 생성하는 것이 아니고 가능한 한 공유해서 사용함으로써 메모리를 절약하는 패턴 |
Proxy | - '대리인'이라는 뜻으로, 뭔가를 대신해서 처리하는 것 - 접근이 어려운 객체와 여기에 연결하려는 객체 사이에서 인터페이스 역할을 수행하는 패턴 |
[행위 패턴]
- 반복적으로 사용되는 객체들의 상호작용을 패턴화한 것으로, 클래스나 객체들이 상호작용하는 방법과 책임을 분산하는 방법을 정의한다.
- 메세지 교환과 관련된 것으로, 객체 간의 행위나 알고리즘 등과 관련된 패턴을 말한다.
Chain of Responsibility (책임 연쇄) |
- 요청을 처리할 수 있는 객체가 둘 이상 존재하여 한 객체가 처리하지 못하면 다음 객체로 넘어가는 형태의 패턴 - 요청을 처리할 수 있는 각 객체들이 고리(chain)로 묶여 있어 요청이 해결될 때까지 고리를 따라 책임이 넘어감 |
Iterator (반복자) |
- 자료 구조와 같이 접근이 잦은 객체에 대해 동일한 인터페이스를 사용하도록 하는 패턴 - 내부 표현 방법의 노출 없이 복합 객체의 원소를 순차적으로 접근할 수 있는 방법 제공 |
Command (명령) |
- 요청을 객체의 형태로 캡슐화하여 재이용하거나 취소할 수 있도록 요청에 필요한 정보를 저장하거나 로그에 남기는 패턴 - 요청에 사용되는 각종 명령어들을 추상 클래스와 구체 클래스로 분리하여 단순화함 |
Interpreter (해석자) |
- 언어의 문법 표현을 정의하는 패턴 - SQL 이나 통신 프로토콜과 같은 것을 개발할 때 문법 규칙을 클래스화한 구조 |
Memento (기록) |
- 특정 시점에서의 객체 내부 상태를 객체화함으로써 이후 요청에 따라 객체를 해당 시점의 상태로 돌릴 수 있는 기능을 제공하는 패턴 - Ctrl+Z와 같은 되돌리기 기능을 개발할 때 주로 이용 |
Observer (감시자) |
- 한 객체의 상태가 변하면 객체에 상속되어 있는 다른 객체들에게 변화된 상태를 전달하는 패턴 - 객체 사이에 일대다의 존속성을 정의 |
State (상태) |
- 객체의 내부 상태에 따라 동일한 동작을 다르게 처리해야 할 때 사용하는 패턴, 행위를 변경할 수 있게 함 - 이렇게 하면 객체는 마치 클래스를 바꾸는 것처럼 보인다. |
Strategy (전략) |
- 동일한 계열의 알고리즘들을 개별적으로 캡슐화하여 상호 교환할 수 있게 정의하는 패턴 - 클라이언트는 독립적으로 원하는 알고리즘을 선택하여 사용할 수 있으며, 클라이언트에 영향 없이 알고리즘의 변경이 가능함 - 즉, 클라이언트에게 알고리즘이 사용하는 데이터나 그 구조를 숨겨주는 역할을 한다. |
Visitor (방문자) |
- 각 클래스들의 데이터 구조에서 처리 기능을 분리하여 별도의 클래스로 구성하는 패턴 - 즉, 객체 구조의 요소들에 수행할 오퍼레이션을 표현한 패턴 - 분리된 처리 기능은 각 클래스를 방문(visit)하여 수행함 - 오퍼레이션이 처리할 요소의 클래스를 변경하지 않고도 새로운 오퍼레이션을 정의할 수 있게 함 |
Template Method |
- 상위 클래스에서 골격을 정의하고, 하위 클래스에서 세부 처리를 구체화하는 구조의 패턴 - 유사한 서브 클래스를 묶어 공통된 내용을 상위 클래스에서 정의함으로써 코드의 양 축소, 유지보수 용이 |
Mediator (중재자) |
- 수많은 객체들 간의 복잡한 상호작용(interface)을 캡슐화 하여 객체로 정의하는 패턴 - 객체 간의 통제와 지시의 역할을 하는 중재자를 두어 객체지향의 목표를 달성하게 해줌 - 객체 사이의 의존성을 줄여 결합도를 감소시킬 수 있음 |
2024.09.23 - [기술 노트] - [Study] 디자인 패턴(Design Pattern)
2. 데이터베이스 설계 단계를 <보기>에서 골라 순서대로 나열하시오.
ㄱ. 구현 ㄴ. 요구사항분석 ㄷ. 개념설계 ㄹ. 물리설계 ㅁ. 논리설계 |
ㄴ → ㄷ → ㅁ → ㄹ → ㄱ
* 데이터베이스 설계 순서
- 데이터베이스 계획
- 요구사항 분석
- 데이터베이스에 저장된 내용을 정하기 위해 사용자의 요구사항 분석
- 개념적 데이터 설계
- DBMS 독립적 개념 스키마 설계, 트랜잭션 모델링 및 정의
- ERD
- 논리적 데이터 설계
- 목표 DBMS에 맞는 스키마 설계, 트랜잭션 인터페이스 설계
- 정규화
- 물리적 데이터 설계
- 목표 DBMS에 맞는 물리적 구조 설계, 트랜잭션 세부 설계
- 성능 고려, 반정규화
- 구현
3. 다음은 점진적 통합 테스트와 관련된 용어에 대한 설명이다. 빈칸 ①, ②에 알맞은 용어를 쓰시오.
( ① ) | - 하향식 테스트에서 상위 모듈은 존재하나 하위 모듈이 없는 경우의 테스트를 위해 임시 제공되는 모듈이다. - 골격만 있는 또는 특별한 목적의 소프트웨어 컴포넌트를 구현한 것이다. |
( ② ) | - 상향식 테스트에서 하위 모듈을 순서에 맞게 호출하고 호출 시 필요한 매개변수를 제공하여 결과를 전달하는 역할을 하는 모듈이다. |
① 스텁 , ② 드라이버
테스트 드라이버 (Test Driver) | - 상향식 테스트 시 상위 모듈 없이 하위 모듈이 존재할 때 하위 모듈 구동 시 자료 입출력을 제어하기 위한 제어 모듈(소프트웨어)이다. - 컴포넌트나 시스템을 제어하거나 호출하는 컴포넌트를 대체하는 모듈이다. |
테스트 스텁 (Test Stub) | - 하향식 테스트 시 상위 모듈은 존재하나 하위 모듈이 없는 경우의 테스트를 위해 임시 제공되는 모듈이다. - 골격만 있는 또는 특별한목적의 소프트웨어 컴포넌트를 구현한 것을 의미한다. - 스텁을 호출하거나 스텁에 의존적인 컴포넌트를 개발하거나 테스트할 때 사용한다. |
4. 결정 포인트 내의 모든 개별 조건식에 대해 수행하는 테스트 커버리지를 <보기>에서 골라 쓰시오.
ㄱ. 구문 커버리지 ㄴ. 결정 커버리지 ㄷ. 조건 커버리지 ㄹ. 변경/조건 커버리지 ㅁ. 다중 조건 커버리지 ㅂ. 경로 커버리지 |
ㄷ. 조건 커버리지
* 코드 커버리지(Code Coverage)
- 프로그램의 소스 코드의 테스트 수행 정도를 표시한다.
구문 커버리지 (Statement Coverage) | 코드 구조 내의 모든 구문에 대해 한 번 이상 수행하는 테스트 커버리지 |
조건 커버리지 (Condition Coverage) | 결정 포인트 내의 모든 개별 조건식에 대해 수행하는 테스트 커버리지 |
결정 커버리지 (Decision Coverage) | 분기 커버리지(Branch Coverage)라고도 하며, 결정 포인트 내의 모든 분기문에 대해 수행하는 테스트 커버리지 |
변경/조건 커버리지 (MC/DC) | 결정 포인트 내의 다른 개별적인 조건식 결과에 상관없이 독립적으로 전체 조건식의 결과에 영향을 주는 테스트 커버리지 |
다중 조건 커버리지 (Multiple Condition Coverage) | 모든 개별 조건식의 true, false 조합 중 테스트에 의해 실행된 조합을 측정하는 테스트 커버리지 |
경로 커버리지 (All Path Coverage) | 코드 내의 모든 경로를 한 번 이상 수행시키는 테스트 커버리지 |
5. 다음 뷰(VIEW)를 연쇄적으로 제거하는 빈칸에 알맞은 명령을 쓰시오.
DROP VIEW 뷰_이름 ( );
CASCADE
* DROP
- DDL 명령문 중 뷰를 제거하는 명령문인 DROP의 문법은 「DROP VIEW 뷰_이름 [CASCADE | RESTRICT];」이다.
- 객체 제거 시 사용되는 옵션
CASCADE | 삭제할 객체가 사용(참조) 중이더라도 삭제가 이루어지며, 삭제할 객체를 참조 중인 다른 객체도 연쇄적으로 같이 삭제됨 |
RESTRICT | 삭제할 객체가 사용(참조) 중이면 삭제가 이루어지지 않음 |
6. 아래 보기의 <학생> 테이블에 학번 984104, 성명 '한국산', 학년 3, 과목명 '경영학개론', 전화번호 '050-1234-1234' 학생 튜플을 삽입하는 SQL 문을 작성하시오. (단, 성명, 과목명, 전화번호 속성의 데이터는 문자형이고, 학번, 학년 속성의 데이터는 숫자형이다. 문자형 데이터는 작은 따옴표 (' ')로 표시하시오.)
<학생>
학번 | 성명 | 학년 | 과목명 | 전화번호 |
233355 | 강희영 | 2 | 자료구조 | 010-1111-1111 |
244188 | 홍길동 | 1 | 디지털논리회로 | 010-2222-2222 |
INSERT INTO 학생(학번, 성명, 학년, 과목명, 전화번호) VALUES(984104, '한국산', 3, '경영학개론', '050-1234-1234');
* INSERT(삽입문)
- INSERT문은 기존 테이블에 새로운 자료(튜플)을 삽입하는 경우 사용하는 명령문이다.
- 구문
INSERT INTO 테이블_이름[(속성_이름...)]
VALUES (속성값...);
- INSERT INTO 테이블_이름[(속성_이름...)]
- 자료가 삽입될 테이블 이름과 테이블에서 자료가 삽입될 속성 이름들을 기입한다. 삽입될 자료가 테이블의 모든 속성값을 가지고 있는 경우는 속성 이름을 생략해도 되지만 그렇지 않은 경우 속성 이름을 반드시 기입한다.
- VALUES (속성값...)
- 각 속성에 삽입될 실제 속성값들을 기입한다.
7. 대칭키와 비대칭 키 암호화 기법의 대표적인 암호화 알고리즘을 각각 <보기>에서 골라 쓰시오.
AES, ARIA, DES, ECC, RSA, SEED |
대칭키 : AES, ARIA, DES, SEED
비대칭키 : ECC, RSA
* 암호화 기법
대칭키 (비밀키) 기법 | - 암호화, 복호화 할 때 사용하는 키가 동일한 경우 - 알고리즘 방식 : DES, 3-DES, AES, SEED, ARIA, MASK 등 |
비대칭키 (공개키) 기법 | - 암호화 할 때 사용하는 키와 복호화 할 때 사용하는 키가 다른 경우 - 알고리즘 방식 : RSA, DSA 등 |
* 블록암호 알고리즘
DES | 64비트 블록, 56비트 키, 16라운드, Feistel 구조 |
3-DES | 2개의 키, 암호화, 복호화, Feistel 구조 |
AES | 128비트 블록, 80비트 키, 32라운드, Feistel 변형구조 |
SKIPJACK | 64비트 블록, 80비트 키, 32라운드, Feistel 변형구조 |
IDEA | 64비트 블록, 128비트 키, 8라운드, Feistel+SPN구조(스위스) |
SEED | 128비트블록, 128비트 키, 16라운드, Feistel 구조(한국) |
ARIA | 128비트블록, 128/192/256비트 키, 12/14/16라운드, SPN 구조(한국) |
LEA | 128비트블록, 128/192/256비트 키, 24/28/32라운드, SPN 구조(한국, 경량) |
CRYPTON | 128비트블록, 0~256비트 키, 12라운드 |
* 스트림암호 알고리즘
- LFSR : 선형 피드백 시프트 레지스터
- RC4 : 인터넷 보안 프로토콜에서 널리 사용
- A5 : GSM 통신에서 사용
* 공개키암호 알고리즘
- 소인수 분해 : RSA, Rabin
- 이산대수 : Diffie-Hellman, DSA, ELGamal
- 타원곡선 : ECC
* 단방향암호 알고리즘
- MD5 : 빠른 계산 속도, 취약점 발견
- SHA : NIST(미국 국립표준기술연구소)에 의해 개발된 해시 함수
- HAS-160 : 한국에서 개발된 해시 함수, KCDSA(디지털서명)에 사용
8. 데이터를 고정된 길이의 암호화된 문자열(키)로 변경하는 복호화가 불가능한 방식의 단방향 암호화에서 사용되는 함수를 무엇이라 하는지 쓰시오.
해시 함수, 해시, Hash Function
* 해시 함수(Hash Function)
- 데이터를 고정된 길이의 암호화된 문자열(키)로 변경하는 복호화가 불가능한 방식의 단방향 암호화에 사용되는 함수
- 역할 : 데이터 무결함 인증, 서명 내용 변조 방지, 빠른 데이터 비교
- 해시 함수 종류 : MD4, MD5, MD6, SHA, SHA-1, SHA-2, SHA-3, RIPEMD, WhirlPool
9. 다음은 C언어로 작성된 프로그램이다. 이를 실행한 출력 결과를 쓰시오.
#include <stdio.h>
int main(){
int n[3] = {71, 99, 87};
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");
}
return 0;
}
BCD
- 해당 프로그램은 break; 명령문이 없는 switch~case 분기에 대해 출력하는 프로그램이다.
- 1차원 배열 n의 3개의 요소 값의 합계 257(71+99+87)을 변수 sum에 저장하고 257/30의 결과 8을 구하여 case 8:로 분기한 후 break; 명령문이 없으므로 switch~case문 블록의 마지막 문장까지 실행하여 BCD를 출력한다.
10. 다음은 C언어로 작성된 프로그램이다. 이를 실행한 출력 결과를 쓰시오.
#include <stdio.h>
int main(){
int i;
int cnt = 0;
for (i=1; i<=2023; i++){
if (i%4 == 0) cnt++;
}
printf("%d", cnt);
return 0;
}
505
- 해당 프로그램은 1부터 2023 사이의 정수 중 4의 배수의 개수를 출력하는 프로그램이다.
- 2023/4의 결과 정수 몫인 505개가 4의 배수임을 간단하게 구할 수 있다.
11. 다음은 <출력 결과>같이 출력하는 C언어로 구현된 프로그램이다. 다음 빈칸 ①에 들어갈 가장 적합한 명령을 C언어 코드 형식으로 쓰시오.
<출력 결과>
43215 |
#include <stdio.h>
int main() {
int i;
int n[5] = {5, 4, 3, 2, 1};
for (i = 0; i < 5; i++){
printf("%d", ① );
}
return 0;
}
n[ (i +1) % 5 ]
- 해당 프로그램은 1차원 배열의 첨자를 조작하여 출력하는 프로그램이다.
출력결과(%d) | 배열 n의 요소 값 | i | n[ (i+1)%5 ] |
4 | n[1] | 0 | n[ (0+1)%5 ] |
3 | n[2] | 1 | n[ (1+1)%5 ] |
2 | n[3] | 2 | n[ (2+1)%5 ] |
1 | n[4] | 3 | n[ (3+1)%5 ] |
12. 다음 C언어로 구현된 화폐를 교환하는 프로그램에서 <처리조건>을 적용하여 <출력결과>와 같이 출력하도록 빈칸 ①~④에 들어갈 가장 적합한 명령을 C언어 코드 형식으로 쓰시오.
<처리조건>
1. 4620원을 1000원, 500원, 100원, 10원으로 교환하였을 때의 각 화폐의 개수를 출력하시오. 2. 단, 큰 화폐 단위의 동전 새루를 제일 많게 교환하며 전체 동전의 개수가 최소가 되도록 교환한다. 3. c1000은 1000원의 개수, c500은 500원의 개수, c100은 100원의 개수, c10은 10원의 개수를 의미한다. 4. 빈칸에는 변수 m, 연산자 %와 /, 숫자 0~9만 사용하여 코드를 작성한다. 5. 실행 결과가 일치하더라도 <처리조건>을 적용하지 않은 C언어 코드를 작성하면 오답으로 간주한다. |
<출력 결과>
1000원 : 4개 , 500원 : 1개 , 100원 : 1개 , 10원 : 2개 |
#include <stdio.h>
int main() {
int m = 4620;
int c1000, c500, c100, c10;
c1000 = ① ;
c500 = ② ;
c100 = ③ ;
c10 = ④ ;
printf("1000원 : %d개\n", c1000);
printf(" 500원 : %d개\n", c500);
printf(" 100원 : %d개\n", c100);
printf(" 10원 : %d개\n", c10);
return 0;
}
① m / 1000 , ② ( m % 1000 ) / 500 , ③ ( m % 1000 % 500) / 100 , ④ ( m % 100 ) / 10
- 해당 프로그램은 화폐를 교환하는 프로그램이다.
- 큰 단위의 화폐 순서대로 정해진 화폐의 교환 개수를 출력하도록 화폐별 개수를 구하는 방식을 정수의 나머지(%)와 나눗셈(/) 연산자를 통해 작성하기 위해 다음과 같은 의미로 간결하게 연산식을 작성한다.
변수 c1000 | 4620원의 | 1000의 개수 | 4 | m / 1000 |
변수 c500 | 620원의 | 500의 개수 | 1 | (m%1000) / 500 |
변수 c100 | 120원의 | 100의 개수 | 1 | (m%500) / 100 |
변수 c10 | 20원의 | 10의 개수 | 2 | (m%100) / 10 |
13. 다음 C언어로 구현된 선택정렬의 오름차순 프로그램에서 빈칸 ①에 들어갈 가장 적합한 명령을 C언어 코드 형식으로 쓰시오.
#include <stdio.h>
int main() {
int i, j;
int n = sizeof(E) / sizeof(int);
for (i=0; i<n; i++) {
for (j=i+1; j<n; j++) {
if ( E[i] ① E[j] ) {
int tmp = E[i];
E[i] = E[j];
E[j] = tmp;
}
}
}
for (i=0; i<n; i++){
printf("%3d", E[i]);
}
return 0;
}
>
- 해당 프로그램은 선택정렬의 오름차순을 구하는 프로그램이다.
- 오름차순은 작은 수를 앞에 큰 수가 뒤에 위치하도록 배열의 요소값을 정렬한다.
- 따라서 교환 처리(swap)를 하는 경우는 앞의 값이 뒤의 값보다 큰 경우이므로 빈칸에 알맞은 조건식의 관계 연산자는 >이다.
14. 다음은 C언어로 작성된 프로그램이다. 이를 실행한 출력 결과를 쓰시오.
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 4
int ds[MAX_SIZE];
int top = -1;
int is_full() {
if(top == MAX_SIZE-1) return 1;
return 0;
}
int is_empty() {
if(top == -1) return 1;
return 0;
}
void into(int num) {
if(is_full()) {
printf("Stack is Full");
exit(0);
} else {
ds[++top] = num;
}
}
int take() {
if(is_empty()) {
printf("Stack is Empty");
exit(0);
} else {
return ds[top--];
}
}
int main() {
into(5);
into(2);
while(!is_empty()){
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(후입선출) 방식으로 삽입 연산과 삭제 연산을 하는 선형 자료구조이다. 해당 프로그램에서의 함수는 삽입 연산을 into() 함수를 통해, 삭제 연산은 take() 함수를 통해 구현하여 main() 함수 내에서 차례대로 호출한 후 실행 결과를 출력한다.
15. 다음은 C언어로 작성된 프로그램이다. 이를 실행하여 "홍영희 → 김영희 → 박영희" 순으로 입력하였을 때의 출력 결과를 쓰시오.
#include <stdio.h>
char n[30];
char* getName() {
printf("입력: ");
gets(n);
return n;
}
int main() {
char* s1 = getName();
char* s2 = getName();
char* s3 = getName();
printf("%s\n", s1);
printf("%s\n", s2);
printf("%s\n", s3);
return 0;
}
박영희
박영희
박영희
- 해당 프로그램은 전역 변수로 선언된 1차원 문자열 배열에 함수호출을 통해 입력받은 문자열을 저장하고 출력하는 프로그램이다.
- getName() 함수를 호출을 3회 실행하며 각각 s1, s2, s3에 문자열 배열의 시작 주소를 전달하지만 모두 같은 배열을 가르치기 때문에 결과는 최종 입력한 문자열 "박영희"가 3회 출력된다.
16. 다음은 Java로 작성된 프로그램이다. 이를 실행한 출력 결과를 쓰시오.
public class Exam {
public static void main(String[] args){
String s1 = "Programming";
String s2 = "Programming";
String s3 = new String ("Programming");
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s1.equals(s3));
System.out.println(s2.equals(s3));
}
}
true
false
true
true
- 자바에서는 모든 문자열 리터럴은 컴파일 시 클래스 파일에 저장된다. 같은 내용의 문자열 리터럴은 한 번만 등록되고 해당 문자열 리터럴의 주소값을 가르키는 구조로 재사용된다. s1과 s2는 "Programming"이라는 하나의 문자열 리터럴을 참조한다. 따라서 처음 출력되는 s1 == s2는 true이다.
- new String("Programming") 명령은 실행 시 힙 메모리에 인스턴스(객체)로 저장된다. 따라서 s1 == s3의 결과는 false이다.
- String 클래스는 객체의 내용을 비교하는 기능의 equals 메소드를 제공한다. s1, s2, s3의 내용은 "Programming"으로 같으므로 s1.equals(s3), s2.eqauls(s3)의 결과는 모두 true이다.
17. 다음은 Python언어로 작성된 프로그램이다. 이를 실행한 출력 결과를 쓰시오.
s1 = "engineer information programming"
s2 = s1[:3]
s3 = sq[4:6]
s4 = s1[29:]
s5 = s2 +s3 + s4
print(s5)
engneing
- Python의 문자열 추출(Slicing) 연산자 문제이다. 문자열[시작인덱스:끝인덱스] 결과는 시작 인덱스를 포함한 위치부터 끝 인덱스 이전 위치까지의 문자열을 추출한다. 문자열의 시작 인덱스는 0부터이다.
- s2 = eng (s1[:3]의 결과 0번째부터 2(3-1)번째 문자열)
- s3 = ne (s1[4:6]의 결과 4번째부터 5(6-1)번째 문자열)
- s4 = ing (s1[29:]의 결과 29번째부터 마지막번째 문자열)
- s5 = engneing
18. 다음은 HDLC(High-level Data Link Control)에 대한 설명이다. 빈칸 ①~⑤에 각각 <보기>에서 골라 쓰시오.
|
양방향 응답, 단방향 응답, 비동기 응답, 동기 응답, 연결 제어, 동기 균형, 비동기 균형, 익명, 정보, 제어, 감독, 전송, 비번호, 릴레이 |
(1) : 정보
(2) : 감독
(3) : 비번호
(4) : 비동기 균형
(5) : 비동기 응답
* HDLC(High-level Data Link Protocol)
- 비트(Bit) 위주의 프로토콜이다.
- 전송 효율이 좋고 단방향, 반이중, 전이중 방식을 모두 지원한다.
- 신뢰성이 높고 포인트 투 포인트, 멀티 포인트, 루프 방식을 모두 지원한다.
- 전송 제어 제한 없이 비트 정보를 전송할 수 있다.
- 프레임 구성
- 플래그(Flag) : 프레임의 시작과 끝을 나타내며, 항상 '01111110'을 취한다.
- 주소부(Address Field) : 송·수신국을 식별한다.
- 제어부(Control Field) : 프레임 종류를 식별한다.
- 정보부(Information Field) : 실제 정보를 포함한다.
- FCS(Frame Check Sequence Field) : 오류를 검출한다.
- 정보부 필드의 구성
정보 프레임 | I-프레임(Information Frame), 사용자 데이터 전달 |
감독 프레임 | S-프레임(Supervisor Frame), 에러 제어, 흐름 제어 |
비번호 프레임 | U-프레임(Unnumbered Frame), 링크의 동작 모드 설정 및 관리 - 정규 응답 모드(NRM, Normal Response Mode) - 비동기 응답 모드(ARM, Asynchronous Response Mode) - 비동기 평형 모드(ABM, Asynchronous Balanced Mode) |
19. 다음 설명에 해당하는 용어를 빈칸 ①~⑤에 각각 <보기>에서 골라 쓰시오.
① | - 자기 정정 부호로서 오류를 검출하여 1비트의 오류를 수정하는 오류 검출 방식이다. |
② | - '전진 오류 수정'이라고도 하며, 데이터 전송 과정에서 오류가 발생하면 수신측에서 오류를 검출하여 스스로 수정하는 전송 오류 제어 방식이다. - 역채널이 필요 없으며, 연속적인 데이터의 흐름이 가능하다. |
③ | - '후진 오류 수정'이라고도 하며, 데이터 전송 과정에서 오류가 발생하면 송신측에 재전송을 요구하는 전송 오류 제어 방식이다. - 역채널이 필요하다. |
④ | - 데이터 블록에 1비트의 오류 검출 비트를 추가하여 오류를 검출하는 오류 검출 방식이다. |
⑤ | - 집단 오류에 대한 신뢰성 있는 오류 검출을 위해 다항식 코드를 사용하여 오류 검출 방식이다. |
ㄱ. BCD ㄴ. BEC ㄷ. CRC ㄹ. FEC ㅁ. MD5 ㅂ.NAK ㅅ. Hamming Code ㅇ. Parity Check |
(1) : ㅅ. Hamming Code
(2) : ㄹ. FEC
(3) :ㄴ. BEC
(4) :ㅇ. Parity Check
(5) :ㄷ. CRC
BCD | 비수치적 데이터 표시법 중 하나로, 6bit의 컴퓨터의 기본 코드이며 대소문자를 구별하지 못한다. |
BEC (후진 오류 수정) | 데이터 전송 과정에서 오류가 발생하면 송신측에 재전송을 요구하는 전송 오류 제어 방식으로, 역채널이 필요하다. |
CRC (순환 중복 검사) | 집단 오류에 대한 신뢰성 있는 오류 검출을 위해 다항식 코드를 사용하는 오류 검출 방식이다. |
FEC (전진 오류 수정) | 데이터 전송 과정에서 오류가 발생하면 수신측에서 오류를 검출하여 스스로 수정하는 전송 오류 제어 방식으로, 역채널이 필요 없으며 연속적인 데이터의 흐름이 가능하다. |
MD5 (Message Digest Algorithm 5) | 해시 알고리즘의 단방향 방식 중 하나로, 프로그램과 파일의 무결성 검사에 이용된다. |
NAK (Negative AcKnowledge) | 수신된 메시지에 대한 부정 응답이다. |
Hamming Code (해밍 코드 검사) | 자기 정정 부호로서 오류를 검출하여 1비트의 오류를 수정하는 오류 검출 방식이다. |
Parity Check (패리티 검사) | 데이터 블록에 1비트의 오류 검출 비트를 추가하여 오류를 검출하는 오류 검출 방식이다. |
20. 다음 공통으로 설명하는 용어를 쓰시오.
|
템퍼 프루핑(Temper Proofing)
* 템퍼 프루핑(Temper Proofing)
- 소프트웨어의 위·변조 방지 역공학 기술의 일종으로 불법적인 사용자에 의해 소프트웨어가 수정이 이루어졌는지를 검증하기 위해 코드 난독화(Code Obfuscation) 기법을 함께 사용하기도 한다.
- 코드 난독화란 코드를 읽기 어렵게 만들어 역공학을 통한 공격을 막는 기술이다.
해설은 이기적 실기 기본서를 참고하였습니다 :)
728x90
반응형
'정보처리기사' 카테고리의 다른 글
[정보처리기사 실기 기출] 2024년 1회 (6) | 2024.10.17 |
---|---|
[정보처리기사 실기 기출] 2023년 3회 (15) | 2024.10.16 |
[정보처리기사 실기 기출] 2023년 1회 (6) | 2024.10.15 |
[정보처리기사 실기 기출] 2022년 3회 (16) | 2024.10.14 |
[정보처리기사 실기 기출] 2022년 2회 (21) | 2024.10.13 |