개발새발

정보처리기사 4과목 기출 문제 오답 노트 본문

정보처리기사

정보처리기사 4과목 기출 문제 오답 노트

비숑주인 2026. 1. 24. 03:10

#include <stdio.h>
int main(int argc, char *argv[]) {
    int a = 5, b = 3, c = 12; // 초기화
    int t1, t2, t3;

    t1 = a && b; // 논리 AND 연산자, 두 피연산자가 모두 참(0이 아닌 값) 일 때 참(1)을 반환
    // t1=1
    t2 = a || b; // 논리 OR 연산자, 두 피연산자 중 하나라도 참이면 참(1) 을 반환
    // t2=1
    t3 = !c; // 논리 NOT 연산자, 피연산자가 참이면 거짓(0), 피연산자가 거짓이면 참(1)을 반환
    // t3=0

    printf("%d", t1 + t2 + t3); // 실행 결과 2
    return 0;
}

 

정답: 2

 

#include <stdio.h>

// 구조체 정의: 구조체 st는 정수형 변수 a와 정수형 배열 c[10]을 포함
struct st {
    int a;       // 정수 변수 a
    int c[10];   // 크기가 10인 정수형 배열 c
};

int main(int argc, char *argv[]) {
    int i = 0;
    struct st ob1;            // 구조체 st 타입의 변수 ob1 선언
    struct st ob2;            // 구조체 st 타입의 변수 ob2 선언
    ob1.a = 0;                // ob1의 a를 0으로 초기화
    ob2.a = 0;                // ob2의 a를 0으로 초기화

    for (i = 0; i < 10; i++) {
        ob1.c[i] = i;             // ob1.c[i]에 i 값을 저장
        ob2.c[i] = ob1.c[i] + i; // ob2.c[i]에 ob1.c[i] + i 값을 저장
    }

    // 반복문: 짝수 인덱스의 배열 값으로 ob1.a와 ob2.a를 누적합
    for (i = 0; i < 10; i += 2) {
        ob1.a = ob1.a + ob1.c[i]; // ob1.a에 ob1.c[i] 값을 누적
        ob2.a = ob2.a + ob2.c[i]; // ob2.a에 ob2.c[i] 값을 누적
    }

    printf("%d", ob1.a + ob2.a); // 20 + 40
    return 0;
}

 

ob1.c[i]는 i값을 그대로 저장하고, ob2.c[i]는
ob1.c[i] + i를 저장

// 첫 번째 반복 (i = 0)
ob1.a = ob1.a + ob1.c[0] = 0 + 0 = 0;
ob2.a = ob2.a + ob2.c[0] = 0 + 0 = 0;

// 두 번째 반복 (i = 2)
ob1.a = ob1.a + ob1.c[2] = 0 + 2 = 2;
ob2.a = ob2.a + ob2.c[2] = 0 + 4 = 4;

// 세 번째 반복 (i = 4)
ob1.a = ob1.a + ob1.c[4] = 2 + 4 = 6;
ob2.a = ob2.a + ob2.c[4] = 4 + 8 = 12;

// 네 번째 반복 (i = 6)
ob1.a = ob1.a + ob1.c[6] = 6 + 6 = 12;
ob2.a = ob2.a + ob2.c[6] = 12 + 12 = 24;

// 다섯 번째 반복 (i = 8)
ob1.a = ob1.a + ob1.c[8] = 12 + 8 = 20;
ob2.a = ob2.a + ob2.c[8] = 24 + 16 = 40;

 

int main(int argc, char *argv[]) { // int argc - main() 함수에 전달 되는 데이터의 갯수
//char *argv[] - main() 함수에 전달 되는 실제적인 데이터로 char형 포인터 배열로 구성 됨
	// 중략
}

 

실행 결과: 60

 

 

라우팅 프로토콜을 IGP(Interior Gateway Protocol)와 EGP(Exterior Gateway Protocol)로 분류했을 때, RIP는 IGP에 속한다. EGP는 BGP와 같은 프로토콜을 의미하는데, RIP는 네트워크 내에서의 라우팅을 위한 내부 게이트웨이 프로토콜(IGP)이다. 

 

정답: HRN 스케줄링

 

 

UNIX는 멀티태스킹과 멀티유저를 모두 지원한다. 즉, 여러 사용자가 동시에 시스템을 사용할 수 있으며, 동시에 여러 작업을 처리할 수 있다.

 

UDP는 주소 지정과 경로 설정을 하지 않으며, 오직 데이터를 전송하는 역할 한다. 주소 지정과 경로 설정은 네트워크 계층에서 수행 된다. 

 

UDP는 간단하고 빠르지만 신뢰성 없는 프로토콜로, 실시간 애플리케이션이나 패킷 손실을 감수할 수 있는 서비스
에서 유용하게 사용된다. TCP와 달리 연결을 설정하지 않고 빠른 데이터 전송을 제공하지만, 데이터 전송의 신뢰성
을 보장하지 않으므로 중요한 데이터의 전송에는 적합하지 않는다. 

 

OSI 모델과 TCP/IP 모델의 비교

OSI 모델 TCP/IP 모델
7. 응용 계층 4. 응용 계층
6. 표현 계층 (표현 계층 없음)
5. 세션 계층 (세션 계층 없음)
4. 전송 계층 3. 전송 계층
3. 네트워크 계층 2. 인터넷 계층
2. 데이터 링크 계층 1. 네트워크 인터페이스 계층
1. 물리 계층 (네트워크 인터페이스 계층에 포함)

 

 

  • marr() 메서드 실행
    • temp 배열을 생성: new int[4]
    • Java의 기본값 규칙에 따라, temp 배열의 모든 요소는 0으로 초기화됨: [0, 0, 0, 0]
    • for 문을 이용해 temp[i] = i를 수행하여 배열을 [0, 1, 2, 3]으로 설정
    • temp 배열을 반환
  • main() 메서드 실행
    • iarr는 marr() 메서드에서 반환된 [0, 1, 2, 3] 배열을 참조
    • for 문을 이용해 배열을 출력: 0 1 2 3

Java의 배열 참조 변수 문제임! (C 언어의 포인터 개념과 유사)

 

 

답: 0,1,2,3

 

 

삼항 연산자
변수 = (조건식) ? 참일 때 값 : 거짓일 때 값;
  • mx = a < b ? b : a;
    • 1 < 2이므로 b의 값인 2가 선택됨 → mx = 2
  • if (mx == 1)
    • mx의 값은 2, 2 == 1은 false이므로 else 블록 실행
  • else 블록 실행:
    • b = 2, mx = 2 → b < mx는 false
    • 따라서 mn = c = 3

 

 

응집도(Cohesion)는 모듈 내부 요소들이 서로 관련된 정도를 나타내는 개념
응집도가 높을수록 모듈이 단일 책임 원칙(SRP)을 잘 따르고, 유지보수성이 좋다. 

 

단계 응집도 유형 설명
1 우연적 응집도 (Coincidental Cohesion) 모듈 내부의 기능들이 아무 연관 없이 우연히 묶여 있음. 응집도가 가장 낮음.
2 논리적 응집도 (Logical Cohesion) 비슷한 유형의 작업이 같은 모듈에 있지만, 서로 관련이 없음.
3 시간적 응집도 (Temporal Cohesion) 특정 시점(초기화, 정리 등)에 실행되는 기능들이 모여 있음.
4 절차적 응집도 (Procedural Cohesion) 순차적으로 실행되지만, 서로 밀접한 관련이 없는 기능들이 묶여 있음.
5 순차적 응집도 (Sequential Cohesion) 한 기능의 출력이 다음 기능의 입력으로 사용됨.
6 통신적 응집도 (Communicational Cohesion) 동일한 데이터를 사용하거나, 같은 입출력을 공유하는 기능들이 묶여 있음.
7 기능적 응집도 (Functional Cohesion) 모듈이 하나의 명확한 기능만 수행하며, 응집도가 가장 높음.

 

 

 

  • n2 <= 2 → 2 <= 2 → true (1)
  • n3 > 3 → 3 > 3 → false (0)
  • true || false → 1 || 0 → 1
  • 결과: r1 = 1

 

  • n3 = 3이므로 참(true)
  • !n3 → !3 → false (0)
  • 결과: r2 = 0

 

  • n1 > 1 → 1 > 1 → false (0)
  • n2 < 3 → 2 < 3 → true (1)
  • false && true → 0 && 1 → 0
  • 결과: r3 = 0

 

 

  • LRU (Least Recently Used) 알고리즘 사용 → 가장 오랫동안 사용되지 않은 페이지를 교체

페이지 결함이 발생하는 조건은 현재 프레임에 해당 페이지가 없을 때. 1,2,3,6,9번째 총 5회 페이지 결함이 발생한다.

1.  한 프로세스가 운영체제를 호출할 때 전체 프로세스가 대기할 필요가 없으므로 시스템 성능을 높일 수 있다.
→ 틀린 이유:
사용자 수준 스레드는 운영체제에 의해 직접 관리되지 않으며, 시스템 호출을 하면 프로세스 전체가 블록(block) 된다. 따라서, 시스템 성능을 높일 수 있는 요소가 아니다.

 

2.  동시에 여러 스레드가 커널에 접근할 수 있으므로 여러 스레드가 시스템 호출을 동시에 사용할 수 있다.
→  틀린 이유:
사용자 수준 스레드는 운영체제가 아닌 사용자 라이브러리에서 관리되므로, 커널이 사용자 수준 스레드를 개별적으로 인식하지 않는다. 즉, 여러 스레드가 동시에 커널에 접근할 수 없다. 이는 오히려 커널 수준 스레드의 장점임 

 

3.  각 스레드를 개별적으로 관리할 수 있으므로 스레드의 독립적인 스케줄링이 가능하다.
→  틀린 이유:
사용자 수준 스레드는 운영체제가 아니라 사용자 라이브러리에서 스케줄링을 관리하지만, 한 스레드가 블록되면 전체 프로세스가 블록될 수 있는 문제가 있다. 

 

4.  커널 모드로의 전환 없이 스레드 교환이 가능하므로 오버헤드가 줄어든다.
→ 정답인 이유:
사용자 수준 스레드는 커널의 개입 없이 사용자 공간에서만 실행되고 관리되므로, 스레드 간 전환(context switch) 시 커널 모드로 전환하는 오버헤드가 발생하지 않는다. 이는 사용자 수준 스레드의 주요 장점 중 하나임. 

 

 

결합도는 모듈 간의 의존성(Dependency)을 나타내는 척도로, 결합도가 낮을수록 좋은 설계라고 평가된다. 결합도는 낮을수록 유지보수성과 확장성이 좋아진다. 

 

1. 내용 결합도(Content Coupling) – 정답

  • 한 모듈이 다른 모듈의 내부 데이터나 내부 기능을 직접 참조할 때 발생하는 가장 강한(나쁜) 결합도.
  • 즉, 다른 모듈의 내부 변수를 직접 변경하거나 특정 내부 로직을 직접 참조하는 경우

2. 제어 결합도(Control Coupling) – 오답

  • 한 모듈이 다른 모듈의 수행 흐름을 직접 제어하는 경우.
  • 즉, 특정 값을 넘겨서 다른 모듈 내부에서 실행 흐름을 변경하도록 하는 방식.

3. 공통 결합도(Common Coupling) – 오답

  • 여러 모듈이 **공통 데이터 영역(Global Variable)**을 공유하여 사용하는 경우.
  • 공통 변수를 수정하면 영향을 받는 모듈이 많아 유지보수가 어려워짐.

4. 스탬프 결합도(Stamp Coupling) – 오답

  • 한 모듈이 다른 모듈에 필요 이상의 데이터 구조(Record, Object 등)를 전달하는 경우.
  • 즉, 필요한 데이터만 넘겨주는 것이 아니라 불필요한 데이터까지 포함된 구조체를 넘겨줌.

 

 

 

  • a[0]의 주소가 10이라고 가정하고, int형의 크기가 4Byte라고 주어짐
  • 배열 a는 4개의 정수로 이루어져 있으며, 메모리에서 연속된 주소를 차지한다. 

 

요소값 주소 계산
a[0] 14 10
a[1] 22 10 + 4 = 14
a[2] 30 14 + 4 = 18
a[3] 38 18 + 4 = 22

 

 

1. "시스템을 모듈로 분할하면 각각의 모듈을 별개로 만들고 수정할 수 있기 때문에 좋은 구조가 된다."

올바른 설명

  • 모듈화(Modularity)의 주요 목표 중 하나는 재사용성, 유지보수성 향상 
  • 시스템을 독립적인 모듈로 나누면 각 모듈을 독립적으로 개발, 수정, 테스트할 수 있어 소프트웨어 구조가 개선된다.

2. "응집도는 모듈과 모듈 사이의 상호의존 또는 연결 정도를 의미한다."

틀린 설명 → 정답

  • 응집도(Cohesion)는 모듈 내부 구성 요소 간의 연관성을 의미한다. 
  • 하지만, 이 선택지에서는 응집도를 "모듈과 모듈 사이의 상호의존"으로 잘못 설명하고 있다.
  • 모듈 간의 연결 정도는 결합도(Coupling)라고 부른다. 
  • 올바른 개념 정리:
    • 응집도(Cohesion) → 모듈 내부 요소 간의 연관성
    • 결합도(Coupling) → 모듈 간의 연결성 (의존성)

3.  "모듈 간의 결합도가 약해야 독립적인 모듈이 될 수 있다."

올바른 설명

  • 결합도(Coupling)가 낮을수록(Loose Coupling) 모듈 간 독립성이 증가 
  • 낮은 결합도는 모듈을 독립적으로 수정, 교체, 테스트할 수 있도록 해 유지보수를 쉽게 만든다.

4.  "모듈 내 구성 요소 간의 응집도가 강해야 좋은 모듈 설계이다."

올바른 설명

  • 응집도가 높을수록(Strong Cohesion) 모듈이 단일 기능을 명확하게 수행하여 유지보수성이 향상됨 
  • 좋은 소프트웨어 설계에서는 높은 응집도(High Cohesion)와 낮은 결합도(Low Coupling)가 중요한 원칙