본문 바로가기
정보처리기사/[최신] 필기 기출

정보처리기사 정처기 | 필기 4과목 프로그래밍 언어 활용 | 기출문제 정리본, 두문자

by YUNI Heo 2023. 2. 27.
반응형

 

✅ 2022년 04월 24일

💡 61. C언어에서 문자열 처리 함수의 서식과 그 기능의 연결로 틀린 것은?

  1. strlen(s):  s의 길이를 구한다.
  2. strcpy(s1, s2):  s2를 s1으로 복사한다.
  3. strcmp(s1, s2): s1과 s2를 연결한다.
  4. strrev(s): s를 거꾸로 변환한다.

 

  • strcmp(s1, s2): 문자열 s1과 문자열 s2를 비교하여, s1이 s2보다 앞에 있으면 음수, s2가 s1보다 앞에 있으면 양수, 같으면 0을 반환하는 함수
  • strcat(s1, s2): 문자열 s2를 문자열 s1의 끝에 연결하는 함수

 

💡 62. 다음 C언어 프로그램이 실행되었을 때, 실행 결과는?

#include <stdio.h>
int main(int argc, char *argv[])
{
    int a = 5, b = 3, c = 12;
    int t1, t2, t3;
    t1 = a && b;
    t2 = a || b;
    t3 = !c;
    printf("%d", t1 + t2 + t3);
    return 0;
}
  1. 14

 

#include <stdio.h>

int main(int argc, char *argv[])
{
    // 변수 선언과 초기화
    int a = 5, b = 3, c = 12;
    int t1, t2, t3;
    
    // 논리 연산 후 결과를 변수에 대입
    t1 = a && b;    // a와 b가 모두 참이면 t1에 1(참)을 대입, 그렇지 않으면 0(거짓)을 대입
    t2 = a || b;    // a와 b 중 하나라도 참이면 t2에 1(참)을 대입, 그렇지 않으면 0(거짓)을 대입
    t3 = !c;        // c가 거짓이면 t3에 1(참)을 대입, 그렇지 않으면 0(거짓)을 대입
    
    // 결과 출력
    printf("%d", t1 + t2 + t3);    // t1, t2, t3를 더한 결과를 출력
    
    // 프로그램 종료
    return 0;
}

 

💡 63. 다음 C언어 프로그램이 실행되었을 때, 실행 결과는?

#include <stdio.h>

struct st
{
    int a;
    int c[10];
}; 

int main(int argc, char *argv[])
{
    int i = 0;
    struct st ob1;
    struct st ob2;
    ob1.a = 0;
    ob2.a = 0;
    for (i = 0; i < 10; i++)
    {
        ob1.c[i] = i;
        ob2.c[i] = ob1.c[i] + i;
    }
    for (i = 0; i < 10; i = i + 2)
    {
        ob1.a = ob1.a + ob1.c[i];
        ob2.a = ob2.a + ob2.c[i];
    }
    printf("%d", ob1.a + ob2.a);
    return 0;
}
  1. 30
  2. 60
  3. 80
  4. 120

 

#include <stdio.h>

struct st
{
    int a;
    int c[10];
};

int main(int argc, char *argv[])
{
    // 변수 선언과 초기화
    int i = 0;
    struct st ob1;
    struct st ob2;
    ob1.a = 0;
    ob2.a = 0;

    // 구조체 변수의 배열에 값 할당
    for (i = 0; i < 10; i++)
    {
        ob1.c[i] = i;
        ob2.c[i] = ob1.c[i] + i;
    }

    // 구조체 변수의 일부 요소를 더하여 다른 변수에 대입
    for (i = 0; i < 10; i = i + 2)
    {
        ob1.a = ob1.a + ob1.c[i];
        ob2.a = ob2.a + ob2.c[i];
    }

    // 두 구조체 변수의 a 요소를 더한 결과 출력
    printf("%d", ob1.a + ob2.a);

    // 프로그램 종료
    return 0;
}

 

💡 64. IP 프로토콜에서 사용하는 필드와 해당 필드에 대한 설명으로 틀린 것은?

  1. Header Length: IP 프로토콜의 헤더 길이를 32비트 워드 단위로 표시한다.
  2. Packet Length: IP 헤더를 제외한 패킷 전체의 길이를 나타내며 최대 크기는 232-1비트이다.
  3. Time To Live: 송신 호스트가 패킷을 전송하기 전 네트워크에서 생존할 수 있는 시간을 지정한 것이다.
  4. Version Number: IP 프로토콜의 버전번호를 나타낸다.

 

패킷 길이(Packet Length)

  • 통신에서 전송되는 데이터를 일정한 크기의 작은 조각으로 나눈 길이
  • IP 헤더 및 데이터를 포함한 IP 패킷 전체 길이를 바이트 단위로 표시
  • 최대 크기는 65,535

 

💡 65. 다음 Python 프로그램의 실행 결과가 [실행결과]와 같을 때, 빈칸에 적합한 것은?

x = 20

if x == 10:
    print('10') 
(빈칸) x == 20:
    print('20')
else:
    print('other')
// 실행결과
20
  1. either
  2. elif
  3. else if
  4. else

 

x = 20

if x == 10:         # x의 값이 10인지 확인
    print('10')     # x의 값이 10이면 '10' 출력
elif x == 20:       # x의 값이 10이 아니고 20인지 확인
    print('20')     # x의 값이 20이면 '20' 출력
else:               # x의 값이 10도 아니고 20도 아닌 경우
    print('other')  # 'other' 출력

 

💡 66. RIP(Routing Information Protocol)에 대한 설명으로 틀린 것은?

  1. 경로 선택 메트릭은 홉 카운트(hop count)이다.
  2. 라우팅 프로토콜을 IGP와 EGP로 분류했을 때 EGP에 해당한다.
  3. 최단 경로 탐색에 Bellman-Ford 알고리즘을 사용한다.
  4. 각 라우터는 이웃 라우터들로부터 수신한 정보를 이용하여 라우팅 표를 갱신한다.

 

RIP, Routing Information Protocol

  • 라우팅(Routing)을 위한 정보 교환 프로토콜
  • 거리 벡터(Distance Vector) 알고리즘을 사용하여 최단 경로를 찾는 라우팅 프로토콜
  • 내부 게이트웨이 프로토콜(IGP, Interior Gateway Protocol)

 

자율 시스템(AS, Autonomous System): 하나 이상의 IP 네트워크와 라우팅 정책을 관리하는 독립된 네트워크 시스템이며,

  • 내부 게이트웨이 프로토콜(IGP, Interior Gateway Protocol): 자율 시스템 내부에서 라우팅 정보를 교환하는 프로토콜
  • 외부 게이트웨이 프로토콜(EGP, Exterior Gateway Protocol): 자율 시스템 간에 라우팅 정보를 교환하는 프로토콜

 

💡 67. 다음에서 설명하는 프로세스 스케줄링은?

최소 작업 우선 기법의 약점을 보완한 비선점 스케줄링 기법으로 다음과 같은 식을 이용해 우선순위를 판별한다.
[우선순위 = (대기한 시간 + 서비스를 받을 시간) / 서비스를 받을 시간]
  1. FIFO, First-In-First-Out 스케줄링: 먼저 도착한 작업을 먼저 처리하는 스케줄링 알고리즘
  2. RR, Round-Robin 스케줄링: 각 프로세스에 일정한 시간 할당량을 부여하고, 할당된 시간이 지나면 다른 프로세스로 전환하는 스케줄링 알고리즘
  3. HRN, Highest Response Ratio Nex 스케줄링: 대기 시간과 서비스 시간을 모두 고려하여 우선순위를 계산하고, 우선순위가 가장 높은 작업을 먼저 처리하는 스케줄링 알고리즘
  4. MQ, Multi-Level Feedback Queue 스케줄링: 여러 개의 큐를 사용하여 각 큐마다 다른 우선순위를 부여하고, 프로세스의 우선순위에 따라 큐를 이동시키며 스케줄링하는 알고리즘

 

💡 68. UNIX 운영체제에 관한 특징으로 틀린 것은?

  1. 하나 이상의 작업에 대하여 백그라운드에서 수행이 가능하다.
  2. Multi-User는 지원하지만 Multi-Tasking은 지원하지 않는다.
  3. 트리 구조의 파일 시스템을 갖는다.
  4. 이식성이 높으며 장치 간의 호환성이 높다.

 

UNIX 운영체제

  • 벨 연구소에서 개발된 멀티태스킹, 멀티유저, 다중 프로그래밍을 지원하는 운영체제
  • 다양한 하드웨어 플랫폼에서 동작함
  • 파일 시스템과 명령어 인터프리터를 통해 사용자와 시스템 간의 인터페이스를 제공
  • 각종 프로그래밍 언어와 통합되어 있어 소프트웨어 개발에 적합함
  • 안정성이 높고 보안성이 강한 운영체제

 

💡 69. UDP(User Datagram Protocol)의 특징이 아닌 것은?

  1. 비연결형 서비스를 제공한다.
  2. 단순한 헤더 구조로 오버헤드가 적다.
  3. 주로 주소를 지정하고, 경로를 설정하는 기능을 한다.
  4. TCP와 같이 트랜스포트 계층에 존재한다.

 

UDP(User Datagram Protocol)

  • 인터넷 프로토콜 스위트에서 전송 계층에서 사용되는 프로토콜
  • 비연결형 프로토콜
  • 신뢰성이 낮지만 처리 속도가 빠름

 

IP(Internet Protocol) 프로토콜

  • 인터넷을 포함한 네트워크에서 데이터를 전송하는 데 사용되는 프로토콜
  • 데이터 그램을 이용하여 호스트 간 통신을 제공
  • 데이터그램의 경로를 결정하는 라우팅 기능을 수행

 

💡 70. Python 데이터 타입 중 시퀀스(Sequence) 데이터 타입에 해당하며 다양한 데이터 타입들을 주어진 순서에 따라 저장할 수 있으나 저장된 내용을 변경할 수 없는 것은?

  1. 복소수(complex) 타입: 실수부와 허수부로 이루어진 숫자 데이터 타입
  2. 리스트(list) 타입: 여러 개의 값을 한 변수에 담을 수 있는 데이터 타입으로, 데이터의 추가/삭제/수정이 가능하며 대괄호([])를 이용하여 표현
  3. 사전(dict) 타입: key-value 쌍으로 이루어진 데이터 타입으로, 키(key)를 이용하여 값을 저장하고 검색할 수 있으며 중괄호({})를 이용하여 표현
  4. 튜플(tuple) 타입: 여러 개의 값을 한 변수에 담을 수 있는 데이터 타입으로, 리스트와 비슷하지만 한 번 생성된 데이터는 변경이 불가능하며 소괄호(())를 이용하여 표현

 

💡 71. 다음 JAVA 프로그램이 실행되었을 때, 실행결과는?

public class Main {
	static int[] marr() {
		int temp[] = new int[4];
		for (int i = 0; i < temp.length; i++)
			temp[i] = i;
		return temp;
	}

	public static void main(String[] args) {
		int arr[];
		arr = marr();
		for (int i = 0; i < arr.length; i++)
			System.out.print(arr[i] + " ");
	}
}
  1. 1 2 3 4
  2. 0 1 2 3
  3. 1 2 3
  4. 0 1 2

 

public class Main {
    // marr() 메소드 선언
    static int[] marr() {
        // temp 배열 선언 및 크기 4 할당
        int temp[] = new int[4];
        // for문을 이용하여 temp 배열에 0~3까지의 값을 할당
        for (int i = 0; i < temp.length; i++)
            temp[i] = i;
        // temp 배열 반환
        return temp;
    }

    // main() 메소드 선언
    public static void main(String[] args) {
        int arr[]; // arr 배열 선언
        arr = marr(); // marr() 메소드의 반환값을 arr 배열에 할당
        // for문을 이용하여 arr 배열의 값을 출력
        for (int i = 0; i < arr.length; i++)
            System.out.print(arr[i] + " ");
    }
}

 

💡 72. 다음 JAVA 프로그램이 실행되었을 때의 결과는?

public class Main {
	public static void main(String[] args) {
		int a = 1, b = 2, c = 3, d = 4;
		int mx, mn;
		mx = a < b ? b : a;
		if (mx == 1) {
			mn = a > mx ? b : a;
		}
		else {
			mn = b < mx ? d : c;
		}
		System.out.println(mn);
	}
}
  1. 1
  2. 2
  3. 3
  4. 4

 

public class Main {
    public static void main(String[] args) {
        // 변수 a, b, c, d를 선언하고 각각 1, 2, 3, 4를 할당
        int a = 1, b = 2, c = 3, d = 4;
        int mx, mn; // 변수 mx, mn을 선언

        // 조건 연산자를 이용하여 a와 b 중 큰 값을 mx에 할당
        mx = a < b ? b : a;

        // mx가 1인 경우
        if (mx == 1) {
            // 삼항 연산자를 이용하여 a와 b 중 작은 값을 mn에 할당
            mn = a > mx ? b : a;
        }
        // mx가 1이 아닌 경우
        else {
            // 삼항 연산자를 이용하여 b와 c 중 큰 값을 mx에 할당
            mx = b < mx ? mx : c;
            // 삼항 연산자를 이용하여 c와 d 중 작은 값을 mn에 할당
            mn = c > d ? d : c;
        }
        // mn을 출력
        System.out.println(mn);
    }
}

 

💡 73. 다음 중 Myers가 구분한 응집도(Cohesion)의 정도에서 가장 낮은 응집도를 갖는 단계는?

  1. 순차적 응집도(Sequential Cohesion):  모듈 내의 처리 요소들이 순차적으로 연결되어 있는 응집도
  2. 기능적 응집도(Functional Cohesion): 모듈 내부의 모든 요소들이 동일한 기능을 수행하는 응집도
  3. 시간적 응집도(Temporal Cohesion): 모듈 내부의 요소들이 같은 시간 대에 수행되어야 하는 응집도
  4. 우연적 응집도(Coincidental Cohesion): 모듈 내부의 요소들이 관련성 없이 우연히 함께 묶인 응집도

 

모듈의 응집도

  • 기능적 응집도(Functional Cohesion): 응집도 높음
  • 순차적 응집도(Sequential Cohesion)
  • 교환적 응집도(Communicational Cohesion)
  • 절차적 응집도(Procedural Cohesion)
  • 시간적 응집도(Temporal Cohesion)
  • 논리적 응집도(Logical Cohesion)
  • 우연적 응집도(Coincidental Cohesion): 응집도 낮음

 

💡 74. 다음 C언어 프로그램이 실행되었을 때, 실행 결과는?

#include <stdio.h>
int main(int arge, char *argv[])
{
    int n1 = 1, n2 = 2, n3 = 3;
    int r1, r2, r3;

    r1 = (n2 <= 2) || (n3 > 3);
    r2 = !n3;
    r3 = (n1 > 1) && (n2 < 3);

    printf("%d", r3 - r2 + r1);
    return 0;
}
  1. 0
  2. 1
  3. 2
  4. 3

 

#include <stdio.h>

int main(int arge, char *argv[])
{
    // 변수 n1, n2, n3를 선언하고 각각 1, 2, 3을 할당
    int n1 = 1, n2 = 2, n3 = 3;
    int r1, r2, r3;
    
    // 논리 연산자를 이용하여 r1에 true/false 값을 할당
    r1 = (n2 <= 2) || (n3 > 3);
    // 논리 반전 연산자를 이용하여 r2에 true/false 값을 할당
    r2 = !n3;
    // 논리 연산자를 이용하여 r3에 true/false 값을 할당
    r3 = (n1 > 1) && (n2 < 3);

    // r3 - r2 + r1의 결과를 출력
    printf("%d", r3 - r2 + r1);
    return 0;
}

 

💡 75. IP 프로토콜의 주요 특징에 해당하지 않는 것은?

  1. 체크섬(Checksum) 기능으로 데이터 체크섬(Data Checksum)만 제공한다.
  2. 패킷을 분할, 병합하는 기능을 수행하기도 한다.
  3. 비연결형 서비스를 제공한다.
  4. Best Effort 원칙에 따른 전송 기능을 제공한다.

 

IP 프로토콜 체크섬(Checksum)

  • IP 패킷의 헤더 정보에서 오류를 검출하기 위한 무결성 검사 방법
  • 헤더 정보를 바탕으로 생성된 16비트 체크섬 값과 수신 측에서 생성된 체크섬 값을 비교하여 오류를 확인한다.

 

💡 76. 4개의 페이지를 수용할 수 있는 주기억장치가 있으며, 초기에는 모두 비어 있다고 가정한다. 다음의 순서로 페이지 참조가 발생할 때, LRU 페이지 교체 알고리즘을 사용할 경우 몇 번의 페이지 결함이 발생하는가?

페이지 참조 순서: 1, 2, 3, 1, 2, 4, 1, 2, 5

  1. 5회
  2. 6회
  3. 7회
  4. 8회

 

 

LRU, Least Recently USed 페이지 교체 알고리즘

  • 초기화: {_, _, _, _} 
  • 1번 페이지 참조: {1, _, _, _} (페이지 결함: 1)
  • 2번 페이지 참조: {1, 2, _, _} (페이지 결함: 1)
  • 3번 페이지 참조: {1, 2, 3, _} (페이지 결함: 1)
  • 1번 페이지 참조: {1, 2, 3, _} 
  • 2번 페이지 참조: {1, 2, 3, _} 
  • 4번 페이지 참조: {1, 2, 3, 4} (페이지 결함: 1)
  • 1번 페이지 참조: {1, 2, 3, 4} 
  • 2번 페이지 참조: {1, 2, 3, 4} 
  • 5번 페이지 참조: {1, 2, 5, 4} (페이지 결함: 1)
  1. 페이지 폴트가 발생하여 새로운 페이지를 메모리에 적재할 때, 적재할 페이지가 이미 메모리에 존재하는지 확인한다.
  2. 메모리에 적재된 페이지가 있으면, 해당 페이지의 참조 시간을 갱신한다.
  3. 메모리에 적재된 페이지가 없으면, 가장 참조 시간이 오래된 페이지를 교체하고, 새로운 페이지를 적재한다.
  4. 페이지 교체 시, 가장 참조 시간이 오래된 페이지를 결정하기 위해, 메모리 내의 모든 페이지의 참조 시간을 비교한다.
  5. 가장 참조 시간이 오래된 페이지를 교체 대상으로 선택한다.
  6. 새로운 페이지를 메모리에 적재한다.

 

💡 77. 사용자 수준에서 지원되는 스레드(thread)가 커널에서 지원되는 스레드(thread)에 비해 가지는 장점으로 옳은 것은?

  1. 한 프로세스가 운영체제를 호출할 때 전체 프로세스가 대기할 필요가 없으므로 시스템 성능을 높일 수 있다.
  2. 동시에 여러 스레드가 커널에 접근할 수 있으므로 여러 스레드가 시스템 호출을 동시에 사용할 수 있다.
  3. 각 스레드를 개별적으로 관리할 수 있으므로 스레드의 독립적인 스케줄링이 가능하다.
  4. 커널 모드로의 전환 없이 스레드 교환이 가능하므로 오버헤드가 줄어든다.

 

  • 사용자 수준 스레드(User-level thread): 응용 프로그램 내에서 스레드를 구현하며, 커널과는 독립적으로 스케줄링 및 관리를 수행한다.
  • 커널 수준 스레드(Kernel-level thread): 운영체제 커널에서 직접 생성되고 관리되며, 스케줄링 및 동기화 등의 작업에 대한 책임을 가진다.

 

💡 78. 한 모듈이 다른 모듈의 내부 기능 및 그 내부 자료를 참조하는 경우의 결합도는?

  1. 내용 결합도(Content Coupling): 모듈 간의 상호 의존성이 높아져, 한 모듈의 변경이 다른 모듈에 큰 영향을 미치는 결합도
  2. 제어 결합도(Control Coupling): 모듈 간의 상호 의존성이 높아져, 한 모듈이 다른 모듈의 흐름을 직접적으로 제어하는 결합도
  3. 공통 결합도(Common Coupling): 여러 모듈이 하나의 공통된 자료를 참조하고 공유하는 결합도
  4. 스탬프 결합도(Stamp Coupling): 데이터 구조체를 공유하는 결합도로, 모듈 간의 데이터 구조체 참조 관계가 높아져 결합도 높음

 

💡 79. a[0]의 주소값이 10일 경우 다음 C언어 프로그램이 실행되었을 때의 결과는? (단, int 형의 크기는 4Byte로 가정한다.)

#include <stdio.h>
int main(int argc, char *argv[])
{
    int a[] = {14, 22, 30, 38};
    printf("%u, ", (unsigned int *)&a[2]);
    printf("%u", a);
    return 0;
}
  1. 14, 10
  2. 14, 14
  3. 18, 10
  4. 18, 14

 

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a[] = {14, 22, 30, 38};
    printf("%u, ", (unsigned int *)&a[2]); // 배열 a의 세 번째 요소(30)의 주소를 출력
    printf("%u", a); // 배열 a의 시작 주소를 출력
    return 0;
}
  • 첫 번째 printf 문: &a[2]를 사용하여 배열 a의 세 번째 요소(30)의 주소를 구하고 정수형으로 출력한다.
    • a[2]의 주소값은 a[0]의 주소값 + 2 * sizeof(int) = 10 + 8 = 18이다.
  • 두 번째 printf 문: 배열 a의 시작 주소를 출력한다.
    • a[0]의 주소값은 10이다.

 

💡 80. 모듈화(Modularity)와 관련한 설명으로 틀린 것은?

  1. 시스템을 모듈로 분할하면 각각의 모듈을 별개로 만들고 수정할 수 있기 때문에 좋은 구조가 된다.
  2. 응집도는 모듈과 모듈 사이의 상호의존 또는 연관 정도를 의미한다.
  3. 모듈 간의 결합도약해야 독립적인 모듈이 될 수 있다.
  4. 모듈 내 구성 요소들 간의 응집도강해야 좋은 모듈 설계이다.

 

  • 모듈화(Modularization): 큰 프로그램을 작은 모듈 단위로 분해하여 설계하고, 개발하는 기법
  • 결합도(Coupling): 하나의 모듈이 다른 모듈에 얼마나 의존하고 있는지를 나타내는 정도
  • 응집도(Cohesion): 하나의 모듈 내부에서 서로 얼마나 관련된 요소들이 연결되어 있는지를 나타내는 정도

 

✅ 2022년 03월 05일

💡 61. IP 주소체계와 관련한 설명으로 틀린 것은?

  1. IPv6의 패킷 헤더는 32 octet의 고정된 길이를 가진다.
  2. IPv6는 주소 자동설정(Auto Configuration) 기능을 통해 손쉽게 이용자의 단말을 네트워크에 접속시킬 수 있다.
  3. IPv4는 호스트 주소를 자동으로 설정하며 유니캐스트(Unicast)를 지원한다.
  4. IPv4는 클래스별로 네트워크와 호스트 주소의 길이가 다르다.

 

  • IPv4(Internet Protocol version 4): 인터넷에서 사용하는 주요 프로토콜 중 하나로, 32비트 주소 체계를 사용하여 인터넷에서 패킷을 전송한다.
  • IPv6(Internet Protocol version 6): IPv4의 주소 고갈 문제를 해결하기 위해 개발된 다음 세대 인터넷 프로토콜로, 128비트 주소 체계를 사용하여 보안, 신뢰성, 품질 등의 기능을 개선하며, 대규모 IoT(Internet of Things) 환경에서의 기기 간 통신에 적합하다.

 

💡 62. 다음 C언어 프로그램이 실행되었을 때, 실행 결과는?

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    int arr[2][3] = {1, 2, 3, 4, 5, 6};
    int(*p)[3] = NULL;
    p = arr;
    printf("%d", *(p[0] + 1) + *(p[1] + 2));
    printf("%d", *(*(p + 1) + 0) + *(*(p + 1) + 1));
    return 0;
}
  1. 7, 5
  2. 8, 5
  3. 8, 9
  4. 7, 9

 

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    int arr[2][3] = {1, 2, 3, 4, 5, 6}; // 2행 3열의 2차원 배열 arr을 초기화
    int(*p)[3] = NULL; // 3개의 정수형 배열을 가리키는 포인터 p를 선언하고 NULL로 초기화
    p = arr; // 배열 arr의 시작 주소를 p에 할당
    printf("%d", *(p[0] + 1) + *(p[1] + 2)); // arr[0][1] + arr[1][2]를 계산하여 출력
    printf("%d", *(*(p + 1) + 0) + *(*(p + 1) + 1)); // arr[1][0] + arr[1][1]을 계산하여 출력
    return 0;
}

 

💡 63. OSI 7 계층 중 이터 링크 계층(Data Link Layer)에 해당되는 프로토콜이 아닌 것은?

  1. HTTP: 응용 계층(Application Layer)
  2. HDLC: 데이터 링크 계층(Data Link Layer)
  3. PPP: 데이터 링크 계층(Data Link Layer)
  4. LLC: 데이터 링크 계층(Data Link Layer)

 

  • 물리 계층(Physical Layer): 케이블, 허브 등의 하드웨어적인 특성을 이용해 데이터를 전송한다. 
    • 프로토콜: Ethernet, Wi-Fi 등
  • 데이터 링크 계층(Data Link Layer): 물리 계층에서 전송된 데이터의 오류를 검출하고 수정하며, MAC 주소 기반의 통신을 제공한다.
    • 프로토콜: PPP, HDLC, Ethernet 등
  • 네트워크 계층(Network Layer): 데이터를 목적지까지 가장 안전하고 빠르게 전달하는 경로를 선택하며, IP 주소를 기반으로 라우팅을 수행한다.
    • 프로토콜: IP, ICMP, ARP 등
  • 전송 계층(Transport Layer): 종단 간의 신뢰성 있는 데이터 전송을 보장하며, 포트 번호를 기반으로 프로세스 간 통신을 제공한다.
    • 프로토콜: TCP, UDP 등
  • 세션 계층(Session Layer): 통신하는 양 끝단의 응용 프로그램이 통신을 관리하고, 데이터 교환의 경계를 설정한다.
    • 프로토콜: SSL, TLS 등
  • 표현 계층(Presentation Layer): 데이터의 형식을 정의하고 변환한다.
    • 프로토콜: JPEG, MPEG 등
  • 응용 계층(Application Layer): 응용 프로그램에서 사용하는 프로토콜을 정의하고, 사용자 인터페이스를 제공한다.
    • 프로토콜: HTTP, FTP, SMTP, DNS 등

 

💡 64. C언어에서 두 개의 논리 값 중 하나라도 참이면 1을, 모두 거짓이면 0을 반환하는 연산자는?

  1. ||(논리합 연산자): 두 개의 논리값 중 하나 이상이 참(true) 일 때, 전체 논리식의 결과를 참으로 반환한다.
  2. &&(논리곱 연산자): 두 개의 논리값이 모두 참(true) 일 때, 전체 논리식의 결과를 참으로 반환한다.
  3. **(거듭제곱 연산자): 왼쪽 피연산자를 오른쪽 피연산자만큼 거듭제곱한 값을 반환한다.
  4. !=(같지 않음 연산자): 두 개의 피연산자가 같지 않으면 참(true)을 반환하고, 같으면 거짓(false)을 반환한다.

 

💡 65. IPv6에 대한 특성으로 틀린 것은?

  1. 표시방법은 8비트씩 4 부분의 10진수로 표시한다.
  2. 2128개의 주소를 표현할 수 있다.
  3. 등급별, 서비스별로 패킷을 구분할 수 있어 품질보장이 용이하다.
  4. 확장기능을 통해 보안 기능을 제공한다.

 

IPv6

  • IPv4의 32비트 주소체계를 128비트 주소체계로 확장하여 많은 주소 공간을 제공한다.
  • IPsec 프로토콜이 기본적으로 지원되므로, 데이터의 기밀성, 무결성, 인증 등을 보장한다.
  • QoS(Quality of Service) 기능이 기본적으로 제공되어, 네트워크의 효율성을 향상한다.
  • IPv4와의 호환성을 보장한다.
  • 자동 구성 기능을 제공하여, 호스트와 라우터의 구성을 자동으로 처리한다.
  • 모바일 네트워크에서의 이동성을 지원한다.
  • 단일 인터페이스에 다수의 IPv6 주소를 할당한다.
  • 멀티캐스트 기능이 기본적으로 지원되어, 멀티캐스트 그룹에 속한 호스트에게 데이터를 효율적으로 전달한다.

 

💡 66. JAVA의 예외(Exception)와 관련한 설명으로 틀린 것은?

  1. 문법 오류로 인해 발생한 것
  2. 오동작이나 결과에 악영향을 미칠 수 있는 실행 시간 동안에 발생한 오류
  3. 배열의 인덱스가 그 범위를 넘어서는 경우 발생하는 오류
  4. 존재하지 않는 파일을 읽으려고 하는 경우에 발생하는 오류

 

  • 문법 오류컴파일 시 에러가 발생하여 프로그램의 정상적인 실행이 불가능하므로 예외 조건에 부합하지 않는다.

 

💡 67. TCP/IP 계층 구조에서 IP의 동작 과정에서의 전송 오류가 발생하는 경우에 대비해 오류 정보를 전송하는 목적으로 사용하는 프로토콜은?

  1. ECP, Error Checking Protocol: 데이터 전송 과정에서 발생한 오류를 검출하고 수정하기 위한 프로토콜
  2. ARP, Address Resolution Protocol: IP 주소를 물리적인 MAC 주소로 변환하기 위한 프로토콜
  3. ICMP, Internet Control Message Protocol: IP 네트워크에서 제어 메시지를 전송하기 위한 프로토콜로, 오류 및 제어 정보 전달을 담당한다.
  4. PPP, Point-to-Point Protocol: 포인트 투 포인트(Point-to-Point) 라인을 통해 전송되는 데이터를 다루기 위한 프로토콜로, 인증 및 암호화 기능을 제공한다.

 

💡 68. 좋은 소프트웨어 설계를 위한 소프트웨어의 모듈 간의 결합도(Coupling)와 모듈 내 요소 간 응집도(Cohesion)에 대한 설명으로 옳은 것은?

  1. 응집도는 낮게, 결합도는 높게 설계한다.
  2. 응집도는 높게, 결합도는 낮게 설계한다.
  3. 양쪽 모두 낮게 설계한다.
  4. 양쪽 모두 높게 설계한다.

 

💡 69. 다음과 같은 형태로 임계 구역의 접근을 제어하는 상호배제 기법은?

P(S) : while S <= 0 do skip;  
       S := S - 1;          

V(S) : S := S + 1;
  1. 데커(Dekker) 알고리즘: 두 개의 프로세스가 공유 자원을 번갈아 가며 사용할 수 있도록 하는 상호 배제(mutex) 알고리즘
  2. 램퍼드(Lamport) 알고리즘: 전역적인 시간 개념을 이용하여 분산 시스템에서의 상호 배제(mutex) 문제를 해결하는 알고리즘
  3. 피터슨(Peterson) 알고리즘: 두 개의 프로세스가 공유 자원을 번갈아 가며 사용할 수 있도록 하는 상호 배제(mutex) 알고리즘
  4. 세마포어(Semaphore): 프로세스나 스레드 등이 공유 자원에 접근할 때, 상호 배제를 위한 동기화 기법 중 하나로, 카운트 값을 사용하여 프로세스나 스레드의 진입을 제어한다.

 

P(S) :
while S <= 0 do  // S가 0 이하인 경우에는 계속해서 반복문을 실행하여 대기한다.
    skip;
S := S - 1;      // S의 값 1 감소
    
V(S) :
S := S + 1;      // S의 값 1 증가

 

💡 70. 소프트웨어 개발에서 모듈(Module)이 되기 위한 주요 특징에 해당하지 않는 것은?

  1. 다른 것들과 구별될 수 있는 독립적인 기능을 가진 단위(Unit)이다.
  2. 독립적인 컴파일이 가능하다.
  3. 유일한 이름을 가져야 한다.
  4. 다른 모듈에서의 접근이 불가능해야 한다.

 

모듈(Module)

  • 독립성(Independence): 모듈은 다른 모듈과 독립적으로 존재한다.
  • 캡슐화(Encapsulation): 모듈은 자신만의 내부 데이터와 함수를 가지며, 외부에서의 접근을 제한한다.
  • 응집성(Cohesion): 모듈 내부의 요소들은 동일한 목적을 가지고 서로 연관성이 높아야 한다.
  • 결합도(Coupling): 모듈 간의 인터페이스를 최소화한다.
  • 가독성(Readability): 모듈은 코드의 가독성을 높이고, 유지보수를 용이하게 한다.
  • 재사용성(Reusability): 모듈은 다른 프로젝트에서도 사용될 수 있도록 일반적으로 작성한다.
  • 테스트 가능성(Testability): 모듈은 독립적으로 테스트 가능해야 하며, 모듈 단위의 테스트를 수행한다.
  • 확장성(Scalability): 모듈은 시스템의 확장에 따라 쉽게 변경되거나 대체한다.

 

💡 71. 빈 기억공간의 크기가 20KB, 16KB, 8KB, 40KB 일 때 기억장치 배치 전략으로 'Best Fit'을 사용하여 17KB의 프로그램을 적재할 경우 내부단편화의 크기는 얼마인가?

  1. 3KB: 20KB의 기억공간에서 17KB를 적재한다.
  2. 23KB: 40KB의 기억공간에서 17KB를 적재한다.
  3. 64KB
  4. 67KB

 

Best Fit

  • 메모리 할당 방법
  • 프로세스를 가장 작게 분할 가능한 공간에 할당하는 방식
  • 가능한 공간 중에서 프로세스 크기와 가장 근접한 공간을 찾아 할당한다.
  • 내부 단편화를 최소화하는 것이 목적이다.
  • 할당 가능한 모든 공간을 탐색해야 하므로, 탐색 시간이 길다.

 

💡 72. 다음 C언어 프로그램이 실행되었을 때, 실행 결과는?

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    int i = 0;
    while (1)
    {
        if (i == 4)
        {
            break;
        }
        ++i;
    }
    printf("i = %d", i);
    return 0;
}
  1. i = 0
  2. i = 1
  3. i = 3
  4. i = 4

 

#include <stdlib.h>
int main(int argc, char *argv[])
{
    int i = 0;                      // 변수 i를 0으로 초기화
    while (1)                       // 무한 반복문 시작
    {
        if (i == 4)                 // 만약 i가 4와 같으면
        {
            break;                  // 반복문 탈출
        }
        ++i;                        // i를 1 증가시킴
    }
    printf("i = %d", i);            // 반복문을 빠져나온 후, i의 값을 출력
    return 0;
}

 

💡 73. 다음 JAVA 프로그램이 실행되었을 때, 실행 결과는?

public class Main {
	static void rs(char a[]) {
		for (int i = 0; i < a.length; i++) {
			if (a[i] == 'B') {
				a[i] = 'C';
			} else if (i == a.length - 1) {
				a[i] = a[i - 1];
			} else {
				a[i] = a[i + 1];
			}
		}
	}

	static void pca(char a[]) {
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i]);
		}
		System.out.println();
	}

	public static void main(String[] args) {
		char c[] = { 'A', 'B', 'D', 'D', 'A', 'B', 'C' };
		rs(c);
		pca(c);
	}
}
  1. BCDABCA
  2. BCDABCC
  3. CDDACCC
  4. CDDACCA

 

public class Main {
    // rs 메소드: 주어진 char 배열을 변경하는 메소드
    static void rs(char a[]) {
        for (int i = 0; i < a.length; i++) { // 주어진 배열 a의 모든 요소에 대해서 반복
            if (a[i] == 'B') {              // 요소가 'B'인 경우
                a[i] = 'C';                 // 요소를 'C'로 변경
            } else if (i == a.length - 1) { // 요소가 배열의 마지막인 경우
                a[i] = a[i - 1];            // 요소를 배열의 마지막 - 1번째 요소로 변경
            } else {                        // 그 외의 경우
                a[i] = a[i + 1];            // 요소를 다음 요소로 변경
            }
        }
    }

    // pca 메소드: 주어진 char 배열을 출력하는 메소드
    static void pca(char a[]) {
        for (int i = 0; i < a.length; i++) { // 주어진 배열 a의 모든 요소에 대해서 반복
            System.out.print(a[i]);         // 요소를 출력
        }
        System.out.println();               // 줄바꿈
    }

    public static void main(String[] args) {
        char c[] = { 'A', 'B', 'D', 'D', 'A', 'B', 'C' }; // char 배열 c를 선언하고 초기화
        rs(c);                                           // rs 메소드를 호출하여 배열 c의 요소를 변경
        pca(c);                                          // pca 메소드를 호출하여 배열 c의 요소를 출력
    }
}

 

💡 74. 개발 환경 구성을 위한 빌드(Build) 도구에 해당하지 않는 것은?

  1. Ant: 자바 프로젝트를 빌드하기 위한 Apache 소프트웨어 재단의 빌드 도구
  2. Kerberos: 클라이언트와 서버 간 안전한 인증을 제공하는 프로토콜
  3. Maven: 자바 프로젝트를 관리하기 위한 Apache 소프트웨어 재단의 빌드 도구
  4. Gradle: 자바와 안드로이드를 포함한 다양한 언어의 프로젝트를 빌드하기 위한 오픈소스 빌드 도구

 

💡 75. 3개의 페이지 프레임을 갖는 시스템에서 페이지 참조 순서가 1, 2, 1, 0, 4, 1, 3 일 경우 FIFO 알고리즘에 의한 페이지 교체의 경우 프레임의 최종 상태는?

  1. 1, 2, 0
  2. 2, 4, 3
  3. 1, 4, 2
  4. 4, 1, 3

 

FIFO(First-In-First-Out) 알고리즘: 먼저 들어온 페이지를 먼저 교체하는 방식

  • 초기 페이지 프레임 상태: [ ], [ ], [ ]
  • 페이지 참조 1: [ 1 ], [ ], [ ] 
  • 페이지 참조 2: [ 1 ], [ 2 ], [ ] 
  • 페이지 참조 1: [ 1 ], [ 2 ], [ ] 
  • 페이지 참조 0: [ 1 ], [ 2 ], [ 0 ]
  • 페이지 참조 4: [ 4 ], [ 2 ], [ 0 ] (1 대신 4를 적재)
  • 페이지 참조 1: [ 4 ], [ 1 ], [ 0 ] (2 대신 1을 적재)
  • 페이지 참조 3: [ 4 ], [ 1 ], [ 3 ] (0 대신 3을 적재)

 

💡 76. 다음 C언어 프로그램이 실행되었을 때, 실행 결과는?

#include <stdio.h> 
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
    char str1[20] = "KOREA";
    char str2[20] = "LOVE";
    char *p1 = NULL;
    char *p2 = NULL;

    p1 = str1;
    p2 = str2;

    str1[1] = p2[2];
    str2[3] = p1[4];

    strcat(str1, str2);

    printf("%c", *(p1+2));

    return 0;
}
  1. E
  2. V
  3. R
  4. O

 

#include <stdio.h> 
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
    char str1[20] = "KOREA";  // 문자열 str1을 선언하고 초기화
    char str2[20] = "LOVE";   // 문자열 str2을 선언하고 초기화
    char *p1 = NULL;          // char 포인터 p1을 NULL로 초기화
    char *p2 = NULL;          // char 포인터 p2을 NULL로 초기화

    p1 = str1;  // p1이 str1을 가리키도록 설정
    p2 = str2;  // p2가 str2을 가리키도록 설정

    str1[1] = p2[2];  // str1의 두 번째 요소를 p2의 세 번째 요소로 변경
    str2[3] = p1[4];  // str2의 네 번째 요소를 p1의 다섯 번째 요소로 변경

    strcat(str1, str2);  // str1 끝에 str2를 이어붙임

    printf("%c", *(p1+2));  // p1의 세 번째 요소를 출력

    return 0;
}

 

💡 77. 다음 Python 프로그램이 실행되었을 때, 실행 결과는?

a = 100
list_data = ['a', 'b', 'c']
dict_data = {'a': 90, 'b': 95}
print(list_data[0]) 
print(dict_data['a'])
  1. a
    90
  2. 100
    90
  3. 100
    100
  4. a
    a

 

a = 100 # 변수 a에 100을 할당
list_data = ['a', 'b', 'c'] # list_data에 ['a', 'b', 'c'] 리스트를 할당
dict_data = {'a': 90, 'b': 95} # dict_data에 {'a': 90, 'b': 95} 딕셔너리를 할당

print(list_data[0]) # list_data의 첫 번째 요소를 출력하여 'a'를 출력
print(dict_data['a']) # dict_data의 key 'a'의 value를 출력하여 90을 출력

 

💡 78. C언어에서 정수 변수 a, b에 각각 1, 2가 저장되어 있을 때 다음 식의 연산 결과로 옳은 것은?

a < b + 2 && a << 1 <= b
  1. 0
  2. 1
  3. 3
  4. 5

 

{a < (b + 2)} && {(a << 1) <= b}
// 조건: a = 1, b = 2
// 첫 번째 조건식: a < (b + 2) -> 1 < (2 + 2) -> 1 < 4 -> 참
// 두 번째 조건식: (a << 1) <= b -> (1 << 1) <= 2 -> 2 <= 2 -> 참
// 전체 논리식: 참 && 참 -> 참

 

💡 79. 다음 Python 프로그램이 실행되었을 때, 실행 결과는?

a = ["대", "한", "민", "국"]
for i in a:
    print(i)
  1. 대한민국



  2. 대대대대

 

a = ["대", "한", "민", "국"]
for i in a:
    print(i)  # 리스트 a의 원소 출력

 

💡 80. UNIX 시스템의 쉘(shell)의 주요 기능에 대한 설명이 아닌 것은?

  1. 사용자 명령을 해석하고 커널로 전달하는 기능을 제공한다.
  2. 반복적인 명령 프로그램을 만드는 프로그래밍 기능을 제공한다.
  3. 쉘 프로그램 실행을 위해 프로세스 메모리를 관리한다.
  4. 초기화 파일을 이용해 사용자 환경을 설정하는 기능을 제공한다.

 

 커널(kernel)

  • 프로세스 관리(Process management): 프로세스 생성, 스케줄링, 종료 등을 관리한다.
  • 메모리 관리(Memory management): 가상 메모리(Virtual memory)를 사용하여 프로세스의 메모리 공간을 할당하고, 필요한 경우 페이지 교환(Paging)을 수행한다.
반응형