← 목록

프로그래밍 언어 활용 · 오답노트

2025년 1회

Q1

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

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

핵심 해설

IPv6는 주소 길이가 128비트(16 octet)로 IPv4의 32비트(4 octet)보다 크게 확장된 체계이다. IPv6의 기본 헤더는 40 octet(320비트) 고정 길이이며, 옵션은 기본 헤더 뒤에 확장 헤더(Extension Header)로 붙는 구조라서 헤더 필드 수가 IPv4보다 오히려 단순하다. 참고로 IPv4 헤더는 20~60 octet의 가변 길이이다. 따라서 '32 octet 고정 길이'라고 한 1번이 틀린 설명이다.

보기별 해설

1. IPv6의 패킷 헤더는 32 octet이 아니라 40 octet(320비트)의 고정 길이이다. 32 octet은 어느 쪽에도 해당하지 않는 값이며, IPv4 헤더가 20~60 octet 가변인 것과 달리 IPv6는 기본 헤더를 40 octet으로 고정하고 부가 기능은 확장 헤더로 분리했다.
2. IPv6의 주소 자동설정(Auto Configuration)은 실제로 제공되는 기능이다. 라우터 광고(RA)를 이용한 무상태 자동설정(SLAAC)으로 단말이 DHCP 서버 없이도 스스로 주소를 만들어 접속할 수 있어 'Plug and Play'라고 부른다.
3. IPv4는 DHCP를 통해 호스트 주소를 자동으로 할당받을 수 있고 유니캐스트(1대1 전송)를 기본으로 지원한다. IPv4의 전송 방식은 유니캐스트·브로드캐스트·멀티캐스트이며, IPv6에서는 브로드캐스트가 없어지고 애니캐스트가 추가된다.
4. IPv4의 클래스별 주소 구분은 맞는 설명이다. A 클래스는 네트워크 8비트·호스트 24비트, B 클래스는 16비트·16비트, C 클래스는 24비트·8비트로 클래스마다 네트워크부와 호스트부의 길이가 다르다.

정리

IPv4 = 32비트 주소·헤더 20~60 octet 가변·클래스 구분·유니캐스트/브로드캐스트/멀티캐스트, IPv6 = 128비트 주소·기본 헤더 40 octet 고정·주소 자동설정·유니캐스트/멀티캐스트/애니캐스트.
#프로그래밍언어활용#IPv6#네트워크
Q2

효과적인 모듈 설계를 위한 유의사항으로 거리가 먼 것은?

1모듈 간의 결합도를 강하게 하면 모듈 독립성이 향상된다.
2복잡도와 중복성을 줄이고 일관성을 유지시킨다.
3모듈의 기능은 예측이 가능해야 한다.
4유지보수가 용이해야 한다. 4
정답 1번 · 모듈 간의 결합도를 강하게 하면 모듈 독립성이 향상된다.

핵심 해설

좋은 모듈 설계의 목표는 모듈의 독립성을 높이는 것이고, 독립성은 결합도(Coupling)는 낮추고 응집도(Cohesion)는 높일 때 커진다. 결합도는 모듈 사이의 상호 의존 정도이므로 결합도가 강해질수록 한 모듈을 고칠 때 다른 모듈까지 영향을 받아 독립성이 떨어진다. 따라서 '결합도를 강하게 하면 독립성이 향상된다'는 1번은 방향이 정반대로 서술된 틀린 항목이다. 나머지는 복잡도·중복 최소화, 예측 가능한 기능, 유지보수 용이성으로 모두 올바른 모듈 설계 지침이다. (4번 끝의 '4'는 PDF 추출 과정에서 붙은 페이지 번호 잡음이다.)

보기별 해설

1. 모듈 간의 결합도를 강하게 하면 독립성은 오히려 낮아진다. 결합도는 모듈 간 의존도를 뜻하므로, 독립성을 높이려면 결합도는 약하게(낮게) 하고 응집도를 강하게(높게) 해야 한다.
2. 복잡도와 중복성을 줄이고 일관성을 유지하는 것은 올바른 설계 지침이다. 중복 코드가 여러 모듈에 흩어져 있으면 변경 지점이 늘어 오류 가능성과 유지보수 비용이 커진다.
3. 모듈의 기능이 예측 가능해야 한다는 것도 올바른 지침이다. 같은 입력에 항상 같은 결과를 내야 재사용과 테스트가 가능하며, 숨겨진 부작용(side effect)이 있으면 통합 시 오류를 낳는다.
4. 유지보수가 용이해야 한다는 것은 모듈화의 핵심 목적 그 자체이다. 기능 단위로 잘 분할된 모듈은 수정 범위가 국소화되어 변경과 확장이 쉬워진다.

정리

모듈 독립성 = 결합도 낮게(Low Coupling) + 응집도 높게(High Cohesion). 결합도를 강화하면 독립성은 떨어진다.
#프로그래밍언어활용
Q3

다음 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; }

130
260
380
4120
정답 2번 · 60

핵심 해설

구조체 배열의 값을 채운 뒤 짝수 인덱스만 골라 더하는 문제이다. 첫 반복문에서 i=0~9 동안 ob1.c[i] = i가 되어 ob1.c는 {0,1,2,...,9}, ob2.c[i] = ob1.c[i] + i = 2i가 되어 ob2.c는 {0,2,4,...,18}이 된다. 두 번째 반복문은 i를 2씩 증가시키므로 i = 0, 2, 4, 6, 8만 누적한다. ob1.a = 0+2+4+6+8 = 20, ob2.a = 0+4+8+12+16 = 40이므로 ob1.a + ob2.a = 60이 출력된다(gcc 실행 결과 60).

보기별 해설

1. 30은 ob1.a(=20)와 ob2.a(=40)의 합이 아니다. 짝수 인덱스 5개만 더한다는 점을 놓치고 계산하면 나오기 쉬운 값이지만 실제 출력과 다르다.
2. 60은 ob1.a = 0+2+4+6+8 = 20과 ob2.a = 0+4+8+12+16 = 40을 더한 값으로, 프로그램이 실제로 출력하는 결과이다. ob2.c[i]가 i+i = 2i이므로 ob2 쪽 합이 ob1 쪽의 정확히 두 배가 된다는 점이 핵심이다.
3. 80은 두 배열의 짝수 인덱스 합계로 나오지 않는 값이다. ob1.c의 짝수 인덱스 합 20과 ob2.c의 짝수 인덱스 합 40을 합치면 60이므로 80이 되려면 누적 범위가 달라야 한다.
4. 120은 이 코드의 어떤 계산으로도 나오지 않는 값이다. i를 1씩 증가시켜 모든 인덱스를 더한 경우와 혼동하기 쉬우나, ob1.a = 0+1+...+9 = 45, ob2.a = 90으로 합이 135이므로 이 역시 아니며, 증가식이 i = i + 2인 것을 확인해야 한다.

정리

for(i=0;i<10;i+=2)는 짝수 인덱스 0·2·4·6·8만 처리한다. ob1.c[i]=i, ob2.c[i]=2i → 20 + 40 = 60.
#프로그래밍언어활용
Q4

다음 중 C 언어에서 우선 순위가 가장 높은 것은?

1비트 연산자
2시프트 연산자
3관계 연산자
4산술 연산자
정답 4번 · 산술 연산자

핵심 해설

C 언어 연산자 우선순위는 단항 → 산술 → 시프트 → 관계 → 비트 → 논리 → 조건 → 대입 → 콤마 순으로 낮아진다. 보기의 네 부류만 놓고 보면 산술 연산자(*, /, %, +, -)가 가장 높고, 그다음이 시프트(<<, >>), 그다음이 관계(<, >, <=, >=, ==, !=), 마지막이 비트 연산자(&, ^, |)이다. 즉 a & b + 1은 a & (b + 1)로, a < b << 2는 a < (b << 2)로 해석된다. 따라서 우선순위가 가장 높은 것은 4번 산술 연산자이다.

보기별 해설

1. 비트 연산자(&, ^, |)는 두 값을 비트 단위로 AND·XOR·OR 하는 연산자로, 이 보기들 중 우선순위가 가장 낮다. 관계 연산자보다도 낮아 a == b & c는 (a == b) & c로 묶이므로 실무에서는 괄호를 명시하는 것이 안전하다.
2. 시프트 연산자(<<, >>)는 비트를 좌우로 밀어 2의 거듭제곱 곱셈·나눗셈 효과를 내는 연산자로, 산술 연산자보다는 낮고 관계 연산자보다는 높다.
3. 관계 연산자(<, >, <=, >=, ==, !=)는 두 값의 크기·같음을 비교해 참(1)/거짓(0)을 내는 연산자로, 시프트보다 낮고 비트 연산자보다 높다.
4. 산술 연산자(*, /, %, +, -)는 네 부류 중 우선순위가 가장 높다. 산술 내부에서도 *, /, %가 +, -보다 먼저 계산되며, 단항 연산자(!, ~, ++, --, 형변환)만이 산술보다 우선한다.

정리

C 우선순위 — 단항 > 산술(*,/,% > +,-) > 시프트 > 관계 > 비트(& > ^ > |) > 논리(&& > ||) > 조건(?:) > 대입 > 콤마.
#프로그래밍언어활용
Q5

다음 파이썬 코드에서 ‘53t44’를 입력했을 때 출력 결과는? a, b = map(int, input().split("t")); print(a, b)

153 t 44
253t44
353 44
453, 44
정답 3번 · 53 44

핵심 해설

input()으로 읽은 문자열 '53t44'에 split("t")를 적용하면 구분자 't'를 기준으로 잘려 ['53', '44'] 리스트가 된다. map(int, ...)이 각 요소를 정수로 변환하고, 언패킹으로 a = 53, b = 44가 대입된다. print는 여러 인수를 출력할 때 기본 구분자 sep=' '(공백 한 칸)을 넣으므로 '53 44'가 출력된다. 실제 python3 실행 결과도 53 44이다.

보기별 해설

1. 53 t 44는 구분자로 쓰인 't'까지 함께 출력된 형태이다. split("t")는 't'를 기준으로 잘라내고 버리므로 결과 문자열에 't'가 남지 않는다.
2. 53t44는 입력받은 원본 문자열 그대로이다. split과 map, 언패킹을 거쳐 두 개의 정수로 나뉜 뒤 print에 두 인수로 전달되므로 원형 그대로 출력되지 않는다.
3. 53 44는 a=53, b=44가 print(a, b)로 출력되어 기본 구분자인 공백 한 칸으로 이어진 결과이다. Python의 print는 인수 사이에 sep 값(기본 ' ')을 넣고 끝에 end 값(기본 '\n')을 붙인다.
4. 53, 44는 쉼표가 구분자로 출력된 형태로, print(a, b, sep=', ')처럼 sep을 직접 지정해야 나온다. 코드에서 쉼표는 인수 구분 문법일 뿐 출력 문자가 아니다.

정리

s.split("t")는 't'를 구분자로 잘라 버리고, print(a, b)는 기본 sep=' '로 이어 붙인다 → '53 44'.
#프로그래밍언어활용
Q6

흐름 제어(Flow Control)에 대한 설명으로 옳지 않은 것은?

1정지대기는- 수신 측의 확인 신호(ACK)를 받은 후에 다음 패 킷을 전송하는 방식이다.
2확인 신호를 이용하여 송신 데이터의 양을 조절하는 방식은 슬라이딩 윈도우이다.
3확인 신호 없이 보낼 수 있는 패킷의 최대치가 윈도우 크기이다.
4이전에 송신한 패킷에 대한 부정 수신 응답(NAK)이 전달된 경우 윈도우 크기가 증가한다.
정답 4번 · 이전에 송신한 패킷에 대한 부정 수신 응답(NAK)이 전달된 경우 윈도우 크기가 증가한다.

핵심 해설

흐름 제어는 송신 측이 수신 측의 처리 능력을 넘는 속도로 데이터를 보내 버퍼 오버플로가 생기는 것을 막는 기법으로, 정지-대기(Stop-and-Wait)와 슬라이딩 윈도우(Sliding Window)가 대표적이다. 슬라이딩 윈도우에서 윈도우 크기는 ACK 없이 연속 전송할 수 있는 프레임 수를 뜻하며, ACK가 정상적으로 도착하면 윈도우를 늘리고 NAK(부정 응답)나 타임아웃으로 전송 오류·혼잡이 감지되면 윈도우를 줄인다. 따라서 NAK가 오면 윈도우 크기가 증가한다고 한 4번이 옳지 않다. (1번의 '정지대기는-'은 PDF 추출 과정에서 '정지-대기는'의 하이픈 위치가 어긋난 것이다.)

보기별 해설

1. 정지-대기(Stop-and-Wait)는 한 개의 패킷을 보낸 뒤 그에 대한 ACK를 받아야만 다음 패킷을 보내는 가장 단순한 흐름 제어 방식이다. 구현이 쉽지만 대기 시간 때문에 전송 효율이 낮아 회선 이용률이 떨어진다.
2. 확인 신호를 이용해 송신 데이터의 양을 조절하는 방식은 슬라이딩 윈도우(Sliding Window)가 맞다. ACK를 받을 때마다 윈도우를 앞으로 미끄러뜨려 다음 프레임을 연속 전송하므로 정지-대기보다 효율이 높다.
3. 확인 신호 없이 보낼 수 있는 패킷의 최대치가 윈도우 크기(Window Size)라는 정의는 맞다. 윈도우 크기가 1이면 정지-대기 방식과 같아진다.
4. 이전에 송신한 패킷에 NAK(부정 수신 응답)가 전달되면 윈도우 크기는 증가가 아니라 감소한다. NAK는 오류나 혼잡을 뜻하므로 전송량을 줄여야 하며, 반대로 ACK가 순조롭게 도착할 때 윈도우 크기를 늘린다.

정리

흐름 제어 — 정지-대기(ACK 받고 1개씩 전송)와 슬라이딩 윈도우(ACK 없이 윈도우 크기만큼 연속 전송). ACK 수신 시 윈도우 증가, NAK 수신 시 윈도우 감소.
#프로그래밍언어활용
Q7

다음 C 언어 프로그램이 실행되었을 때의 결과는? #include <stdio.h> int main(void) { int n = 4; int* pt = NULL; pt = &n; printf("%d", &n + *pt - *&pt + n); return 0; }

10
24
38
412
정답 3번 · 8

핵심 해설

포인터 산술식을 항 단위로 풀어야 한다. n = 4, pt = &n이므로 *pt는 n의 값 4, *&pt는 pt 자신 즉 &n이다. 식 &n + *pt - *&pt + n은 (&n + 4) - (&n) + 4로 정리되는데, 앞의 두 항은 int* 끼리의 뺄셈이므로 결과는 바이트 차이가 아니라 원소 개수 차이인 4가 된다. 여기에 마지막 n = 4를 더해 4 + 4 = 8이 출력된다(gcc 실행 결과 8).

보기별 해설

1. 0은 &n + *pt - *&pt 부분만 상쇄되어 사라진다고 보고 마지막 + n을 빠뜨렸을 때 나오는 값이다. 실제로는 포인터 차이 4가 남고 n = 4가 더해진다.
2. 4는 포인터 차이 (&n+4) - &n = 4만 계산하고 마지막 + n을 더하지 않았거나, 반대로 포인터 차이를 0으로 보고 n만 남긴 경우의 값이다. 두 항을 모두 더해야 하므로 답이 아니다.
3. 8은 포인터 차이 4와 변수 n의 값 4를 더한 값으로, 실제 출력 결과이다. int* 끼리의 뺄셈은 바이트 수(16)가 아니라 sizeof(int)로 나눈 원소 개수(4)를 돌려준다는 점이 핵심이다.
4. 12는 포인터 차이를 원소 개수 4가 아닌 다른 값으로 잘못 계산했을 때 나오는 값이다. 포인터 뺄셈은 자료형 크기로 나눈 값이므로 4바이트 int 배열 기준 4가 된다.

정리

*pt = n의 값, *&pt = pt 자신(&n). 포인터끼리의 뺄셈은 바이트가 아닌 원소 개수 → (&n+4)-&n = 4, 여기에 n=4를 더해 8.
#프로그래밍언어활용
Q8

커널의 버전을 확인할 때 사용하는 리눅스 명령어는?

1ls
2chmod
3rm
4uname - 5
정답 4번 · uname - 5

핵심 해설

리눅스에서 시스템 정보와 커널 버전을 확인하는 명령은 uname이다. uname -r은 커널 릴리스(버전) 번호를, uname -a는 커널 이름·호스트명·릴리스·빌드 정보·아키텍처를 한꺼번에 출력한다. 나머지 보기는 디렉터리 목록 확인, 권한 변경, 파일 삭제 명령으로 커널 정보와는 무관하다. (보기 4번의 'uname - 5'에서 '5'는 PDF 추출 시 붙은 페이지 번호 잡음이며 원래는 'uname'이다.)

보기별 해설

1. ls는 디렉터리 안의 파일과 하위 디렉터리 목록을 출력하는 명령이다. -l로 상세 정보, -a로 숨김 파일까지 표시하며 커널 정보와는 관계없다.
2. chmod는 파일이나 디렉터리의 접근 권한(읽기 r·쓰기 w·실행 x)을 변경하는 명령이다. chmod 755처럼 8진수나 u+x 같은 기호로 지정하며 버전 확인 기능은 없다.
3. rm은 파일이나 디렉터리를 삭제하는 명령이다. -r로 디렉터리를 재귀 삭제하고 -f로 강제 삭제하며, 시스템 정보 출력과는 무관하다.
4. uname은 시스템 정보를 출력하는 명령으로 커널 버전 확인에 쓰인다. uname -r은 커널 릴리스 번호만, uname -a는 커널 이름·호스트명·릴리스·아키텍처 등 전체 정보를 보여준다.

정리

uname = 시스템/커널 정보(-r 커널 버전, -a 전체). ls 목록, chmod 권한 변경, rm 삭제.
#프로그래밍언어활용
Q9

시간 구역성(Temporal Locality)과 거리가 먼 것은?

1루프
2서브루틴
3배열 순회
4스택
정답 3번 · 배열 순회

핵심 해설

구역성(Locality)은 프로세스가 실행 중 특정 부분만 집중적으로 참조하는 성질로, 시간 구역성과 공간 구역성으로 나뉜다. 시간 구역성(Temporal Locality)은 한 번 참조한 기억 장소를 가까운 미래에 다시 참조하는 성질로 루프(Loop), 서브루틴(Subroutine), 스택(Stack), 카운팅·집계에 사용되는 변수가 대표 예이다. 공간 구역성(Spatial Locality)은 참조한 위치와 인접한 위치를 곧이어 참조하는 성질로 배열 순회(Array Traversal), 순차 코드 실행, 프로그램의 순차적 수행이 해당된다. 따라서 배열 순회를 든 3번이 시간 구역성과 거리가 멀다.

보기별 해설

1. 루프(Loop)는 같은 명령어 블록을 반복 실행하므로 동일한 주소를 짧은 시간 안에 여러 번 참조한다. 대표적인 시간 구역성의 예이다.
2. 서브루틴(Subroutine)은 프로그램 여러 곳에서 같은 코드 블록을 반복 호출하므로 그 코드 영역이 거듭 참조된다. 이 역시 시간 구역성에 해당한다.
3. 배열 순회는 인접한 메모리 주소를 차례로 접근하는 패턴이므로 시간 구역성이 아니라 공간 구역성(Spatial Locality)의 대표 예이다. 순차 코드 실행도 같은 범주에 속한다.
4. 스택(Stack)은 push와 pop이 항상 top 근처의 같은 위치를 반복해서 사용하므로 시간 구역성의 예로 꼽힌다. 최근에 참조한 위치가 곧바로 다시 참조되는 전형적인 패턴이다.

정리

시간 구역성 = 루프·서브루틴·스택·집계 변수(같은 위치를 재참조), 공간 구역성 = 배열 순회·순차 코드 실행(인접 위치를 참조).
#프로그래밍언어활용
Q10

다음 C언어 프로그램이 실행되었을 때의 결과는? #include <stdio.h> main() { char* s = "Sinagong"; for (int i = 5; i > 0; i--) printf("%c", *(s + i)); }

1inago
2ogani
3sinagong
4gnoganis
정답 2번 · ogani

핵심 해설

문자열 "Sinagong"은 인덱스 0부터 S(0), i(1), n(2), a(3), g(4), o(5), n(6), g(7)로 저장된다. *(s + i)는 s[i]와 같으므로 i를 5부터 1까지 1씩 줄이며 출력하면 s[5]=o, s[4]=g, s[3]=a, s[2]=n, s[1]=i 순서가 된다. 조건이 i > 0이라 i = 0(문자 'S')은 출력되지 않는다. 이어 붙이면 "ogani"이며, gcc 실행 결과도 ogani이다.

보기별 해설

1. inago는 s[1]부터 s[5]까지 인덱스를 증가시키며 읽었을 때의 결과이다. 반복문이 i--로 감소하므로 실제 출력은 이 문자열을 뒤집은 형태가 된다.
2. ogani는 s[5]=o, s[4]=g, s[3]=a, s[2]=n, s[1]=i를 차례로 출력한 결과로 프로그램의 실제 출력이다. i > 0 조건 때문에 s[0]의 'S'는 포함되지 않는다.
3. sinagong은 문자열 전체를 소문자로 그대로 출력한 형태이다. 원본 첫 글자는 대문자 'S'이고 반복 범위도 인덱스 5~1로 제한되므로 전체가 출력될 수 없다.
4. gnoganis는 문자열 전체를 뒤집은 결과(s[7]부터 s[0]까지)이다. 반복문이 i = 5에서 시작하고 i > 0에서 멈추므로 다섯 글자만 출력된다.

정리

*(s+i) == s[i]. "Sinagong"에서 i = 5→1 역순 출력 = o, g, a, n, i → "ogani" (i > 0이라 s[0] 'S'는 제외).
#프로그래밍언어활용#C언어
Q11

OSI 7계층 모델에서 전송에 필요한 장치 간의 실제 접속과 절단 등 기계적전기적기능적절차적, , , 특성을 정의한 계층은?

1물리 계층
2데이터 링크 계층
3네트워크 계층
4전송 계층
정답 1번 · 물리 계층

핵심 해설

문제 지문의 '기계적전기적기능적절차적, , ,'는 PDF 추출 과정에서 어절 순서가 깨진 것으로, 원문은 '기계적, 전기적, 기능적, 절차적 특성'이다. OSI 7계층에서 장치 간 실제 접속과 절단, 즉 전송 매체와 물리적 연결의 기계적·전기적·기능적·절차적 특성을 규정하는 계층은 물리 계층(Physical Layer, 1계층)이다. 물리 계층은 비트를 전기 신호로 바꿔 전송하며 커넥터 모양, 핀 배치, 전압 레벨, 전송 속도 등을 정의한다. 따라서 답은 1번이다.

보기별 해설

1. 물리 계층(1계층)은 전송 매체를 통해 비트 단위 데이터를 주고받기 위한 기계적·전기적·기능적·절차적 특성을 정의하는 계층이다. 커넥터 규격, 핀 배치, 전압 레벨, 접속과 절단 절차가 여기에 속하며 대표 장비는 리피터와 허브이다.
2. 데이터 링크 계층(2계층)은 인접한 두 노드 사이의 오류 제어, 흐름 제어, 프레임 동기화를 담당하는 계층이다. 전송 단위는 프레임이고 MAC 주소를 사용하며 대표 장비는 브리지와 스위치이다.
3. 네트워크 계층(3계층)은 패킷을 목적지까지 전달하는 경로 설정(라우팅)과 논리 주소 지정을 담당하는 계층이다. IP 주소를 사용하고 대표 장비는 라우터이다.
4. 전송 계층(4계층)은 송신 프로세스와 수신 프로세스 사이의 종단 간(End-to-End) 신뢰성 있는 전달을 책임지는 계층이다. TCP·UDP가 여기에 속하며 포트 번호로 프로세스를 구분한다.

정리

OSI 1계층 물리 = 기계적·전기적·기능적·절차적 특성(비트/리피터·허브), 2계층 데이터 링크 = 프레임·오류 제어(MAC/스위치), 3계층 네트워크 = 라우팅(IP/라우터), 4계층 전송 = 종단 간 신뢰성(TCP·UDP/포트).
#프로그래밍언어활용#OSI7계층
Q12

다음 자바 코드를 실행한 결과는? int x=1, y=6; while (y--) { x++; } System.out.println(“x=” x+“y=” y);

1x=7 y=0
2x=6 y=-1
3x=7 y=-1
4Unresolved compilation problem 오류 발생
정답 4번 · Unresolved compilation problem 오류 발생

핵심 해설

Java는 C와 달리 조건식에 반드시 boolean 타입만 올 수 있고 정수를 참·거짓으로 자동 변환하지 않는다. while (y--)에서 y--는 int 값을 반환하므로 컴파일러가 'int cannot be converted to boolean' 오류를 내고, 이클립스 등에서 실행하면 'Unresolved compilation problem'이 발생한다. 더구나 출력문의 System.out.println("x=" x + "y=" y)도 문자열과 변수 사이에 연결 연산자 +가 빠져 있어 문법 오류이다. 따라서 실행 결과가 아니라 컴파일 오류가 답이며 4번이 옳다. C였다면 y가 0이 될 때 거짓이 되어 x=7, y=-1이 되지만 Java에서는 그 값을 계산할 기회조차 없다.

보기별 해설

1. x=7 y=0은 반복이 6회 돌고 y가 0에서 멈춘다고 본 값이다. y--는 후위 감소라 마지막 판정 후에도 한 번 더 감소하므로 이 값 자체가 성립하지 않고, 애초에 Java에서는 컴파일이 되지 않는다.
2. x=6 y=-1은 x가 6회가 아니라 5회 증가했다고 본 값이다. 초기 x가 1이므로 6회 증가하면 7이 되며, 역시 Java에서는 컴파일 단계에서 막힌다.
3. x=7 y=-1은 이 코드를 C 언어로 옮겼을 때의 결과이다. C는 0이 아닌 정수를 참으로 보므로 y = 6,5,4,3,2,1일 때 6회 반복해 x = 7이 되고 마지막 판정에서 y가 0(거짓)이 된 뒤 한 번 더 감소해 -1이 된다. 그러나 Java에서는 이 값을 얻을 수 없다.
4. Unresolved compilation problem 오류가 실제 결과이다. Java의 while 조건식은 boolean만 허용해 int인 y--를 쓸 수 없고, 출력문에서도 "x="와 x 사이의 + 연산자가 빠져 있어 컴파일이 실패한다.

정리

Java의 조건식(if·while·for)에는 boolean만 올 수 있어 while(y--)처럼 int를 쓰면 컴파일 오류다. C는 0을 거짓, 0 아닌 값을 참으로 자동 해석한다는 점이 결정적 차이다.
#프로그래밍언어활용#Java
Q13

UNIX에서 새로운 프로세스를 생성하는 명령어는?

1ls
2cat
3fork
4chmod
정답 3번 · fork

핵심 해설

UNIX에서 새로운 프로세스를 만드는 시스템 호출은 fork이다. fork는 현재 실행 중인 프로세스(부모)를 그대로 복제해 자식 프로세스를 생성하며, 부모에게는 자식의 PID를, 자식에게는 0을 반환한다. 보통 fork로 프로세스를 만든 뒤 exec 계열 호출로 자식의 메모리 이미지를 다른 프로그램으로 바꾸는 방식(fork-exec)을 사용한다. 나머지 보기는 파일 목록 출력, 파일 내용 출력, 권한 변경 명령이므로 프로세스 생성과 무관하다.

보기별 해설

1. ls는 디렉터리 안의 파일 목록을 출력하는 명령이다. 파일 조회 기능일 뿐 새 프로세스를 생성하는 시스템 호출이 아니다.
2. cat은 파일의 내용을 화면에 출력하거나 여러 파일을 이어 붙이는(concatenate) 명령이다. 파일 입출력용이며 프로세스 생성과 관계없다.
3. fork는 부모 프로세스를 복제해 새로운 자식 프로세스를 생성하는 시스템 호출이다. 부모에게는 자식 PID를, 자식에게는 0을 반환하며 이어서 exec로 다른 프로그램을 적재하는 것이 일반적인 사용 패턴이다.
4. chmod는 파일과 디렉터리의 접근 권한을 변경하는 명령이다. 소유자·그룹·기타 사용자의 읽기·쓰기·실행 권한을 조정할 뿐 프로세스를 만들지는 않는다.

정리

UNIX 프로세스 시스템 호출 — fork(프로세스 복제 생성), exec(다른 프로그램으로 교체), wait(자식 종료 대기), exit(종료).
#프로그래밍언어활용#프로세스
Q14

128.107.176.0/22 네트워크에서 호스트에 의해 사용될 수 있는 서브넷 마스크는?

1255.0.0.0
2255.248.0.0
3255.255.252.0
4255.255.255.255
정답 3번 · 255.255.252.0

핵심 해설

CIDR 표기 /22는 서브넷 마스크에서 앞쪽 1비트가 22개라는 뜻이다. 32비트를 8비트씩 끊어 11111111.11111111.11111100.00000000로 쓰면 첫 옥텟 8개, 둘째 옥텟 8개로 16비트를 채우고 셋째 옥텟에서 6비트를 더 채워 22비트가 된다. 셋째 옥텟 11111100은 128+64+32+16+8+4 = 252이므로 서브넷 마스크는 255.255.252.0이다. 호스트 비트는 32-22 = 10비트라 서브넷당 2^10 = 1024개 주소, 실사용 호스트는 네트워크·브로드캐스트 주소를 뺀 1022개이다.

보기별 해설

1. 255.0.0.0은 앞 8비트만 1인 /8 마스크로 A 클래스의 기본 서브넷 마스크이다. /22와 비트 수가 전혀 맞지 않는다.
2. 255.248.0.0은 8 + 5 = 13비트가 1인 /13 마스크이다(248 = 11111000). 22비트에 크게 못 미친다.
3. 255.255.252.0은 8 + 8 + 6 = 22비트가 1인 /22 마스크로 문제 조건과 일치한다. 셋째 옥텟 252가 11111100이며, 남은 호스트 비트 10개로 1024개 주소(사용 가능 호스트 1022개)를 표현한다.
4. 255.255.255.255는 32비트가 모두 1인 /32 마스크로 호스트 하나만을 가리키는 특수 마스크이다. 호스트 비트가 남지 않아 네트워크로 사용할 수 없다.

정리

/22 = 1비트 22개 = 11111111.11111111.11111100.00000000 = 255.255.252.0. 옥텟 값 대응: 128(/1)·192·224·240·248·252·254·255(/8).
#프로그래밍언어활용
Q15

다음 C 언어 프로그램이 실행되었을 때실행, 결과는? #include <stdio.h> #include <stdlib.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; }

1E
2V
3R
4O 5
정답 3번 · R

핵심 해설

포인터로 문자 배열을 조작한 뒤 특정 위치의 문자를 출력하는 문제이다. p1 = str1("KOREA"), p2 = str2("LOVE")로 두 포인터가 각 배열의 시작을 가리킨다. str1[1] = p2[2]는 str2[2]인 'V'를 str1[1]에 넣어 str1이 "KVREA"가 되고, str2[3] = p1[4]는 이제 바뀐 str1의 인덱스 4인 'A'를 str2[3]에 넣어 str2가 "LOVA"가 된다. strcat(str1, str2)로 str1은 "KVREALOVA"가 되지만 출력하는 것은 *(p1 + 2) 즉 str1[2]로, 이 위치는 처음부터 바뀌지 않은 'R'이다(gcc 실행 결과 R).

보기별 해설

1. E는 str1의 인덱스 3에 있는 문자이다. 출력 대상은 *(p1 + 2) 즉 인덱스 2이므로 한 칸 어긋난 답이다.
2. V는 str2[2]에서 가져와 str1[1]에 대입된 문자이다. 인덱스 1에 놓이므로 *(p1 + 2)가 가리키는 문자와는 다르다.
3. R은 str1[2]의 문자로 실제 출력 결과이다. "KOREA"에서 바뀐 곳은 인덱스 1(O→V)뿐이고 strcat은 뒤에 이어 붙이기만 하므로 str1은 "KVREALOVA"가 되어 인덱스 2는 여전히 'R'이다.
4. O는 원래 str1[1]에 있던 문자이지만 str1[1] = p2[2]에 의해 'V'로 덮어써져 str1에서 사라진다. 보기 끝의 '5'는 PDF 추출 시 붙은 페이지 번호 잡음이다.

정리

*(p + n) == p[n]. str1: KOREA → K[V]REA → strcat 후 KVREALOVA, 인덱스 2는 변경되지 않은 'R'.
#프로그래밍언어활용
Q16

다음과 같은 세그먼트 테이블을 가지는 시스템에서 논리 주소(2, 176)에 대한 물리 주소는? 세그먼트번호 시작주소 길이바이트( ) 0 670 248 1 1752 422 2 222 198 3 996 604

1398
2400
31928
41930
정답 1번 · 398

핵심 해설

세그먼테이션 기법의 논리 주소는 (세그먼트 번호 s, 변위 d) 쌍으로 주어지고, 물리 주소는 세그먼트 테이블에서 s번 항목의 시작 주소(base)를 찾아 변위 d를 더해 구한다. 이때 d가 해당 세그먼트의 길이(limit)보다 작아야 하며, 크거나 같으면 트랩(세그먼트 위반)이 발생한다. 논리 주소 (2, 176)에서 세그먼트 2의 시작 주소는 222, 길이는 198이고 변위 176 < 198이므로 유효하다. 따라서 물리 주소는 222 + 176 = 398이다.

보기별 해설

1. 398은 세그먼트 2의 시작 주소 222에 변위 176을 더한 값으로 올바른 물리 주소이다. 변위 176이 세그먼트 길이 198보다 작아 주소 범위 검사도 통과한다.
2. 400은 222 + 176 = 398에서 2를 더 더한 값으로, 세그먼트 번호 2를 주소 계산에 잘못 합산했을 때 나오는 값이다. 세그먼트 번호는 테이블을 찾는 색인일 뿐 주소에 더하지 않는다.
3. 1928은 세그먼트 1의 시작 주소 1752에 176을 더한 값이다. 세그먼트 번호를 1로 잘못 읽었을 때 나오는 값으로 문제의 논리 주소는 세그먼트 2를 가리킨다.
4. 1930은 1752 + 176 = 1928에 다시 2를 더한 값으로, 세그먼트 번호를 1로 잘못 읽고 번호까지 합산한 이중 오류의 결과이다.

정리

세그먼테이션 물리 주소 = 세그먼트 테이블의 시작 주소 + 변위(단, 변위 < 길이). (2, 176) → 222 + 176 = 398.
#프로그래밍언어활용
Q17

스크립트(Script) 언어가 아닌 것은?

1PHP
2Fortran
3Basic
4Python
정답 2번 · Fortran

핵심 해설

스크립트 언어는 별도의 컴파일 과정 없이 인터프리터가 소스를 한 줄씩 해석해 실행하는 언어로, 웹 서버나 응용 프로그램 내부에서 다른 프로그램을 제어·연결하는 데 주로 쓰인다. PHP, Python, JavaScript, Basic, Perl, Ruby, ASP, JSP 등이 여기에 속한다. 반면 Fortran은 1957년에 등장한 최초의 고급 컴파일러 언어로, 소스 전체를 기계어로 번역한 뒤 실행하는 컴파일 언어이며 과학·공학 수치 계산에 특화되어 있다. 따라서 스크립트 언어가 아닌 것은 2번이다.

보기별 해설

1. PHP는 서버 측에서 실행되는 스크립트 언어로, HTML에 코드를 삽입해 동적 웹 페이지를 생성한다. C 계열 문법을 따르며 웹 서버가 인터프리터로 해석해 결과 HTML을 반환한다.
2. Fortran은 스크립트 언어가 아니라 컴파일 언어이다. 1957년 IBM이 만든 최초의 고급 언어로 수식 번역(FORmula TRANslation)에서 이름을 땄으며 과학기술 계산용으로 지금도 쓰인다.
3. Basic은 초보자 교육용으로 만들어진 대화형 인터프리터 언어로 스크립트 언어로 분류된다. Visual Basic Script(VBScript)처럼 스크립트 형태로 확장되어 쓰였다.
4. Python은 인터프리터 방식의 스크립트 언어로 들여쓰기로 블록을 구분하는 간결한 문법이 특징이다. 동적 타이핑을 지원하고 데이터 분석·웹·자동화 등 폭넓게 사용된다.

정리

스크립트(인터프리터) 언어 — PHP·Python·JavaScript·Basic·Perl·Ruby·ASP·JSP. 컴파일 언어 — C·C++·Java·Fortran·COBOL·Pascal.
#프로그래밍언어활용#Python
Q18

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

1내용 결합도(Content Coupling)
2제어 결합도(Control Coupling)
3공통 결합도(Common Coupling)
4스탬프 결합도(Stamp Coupling)
정답 1번 · 내용 결합도(Content Coupling)

핵심 해설

결합도는 약한 것부터 자료(Data) → 스탬프(Stamp) → 제어(Control) → 외부(External) → 공통(Common) → 내용(Content) 순으로 강해지며, 결합도가 강할수록 모듈 독립성이 나빠진다. 이 중 한 모듈이 다른 모듈의 내부 기능(코드)이나 내부 자료를 직접 참조·변경하는 경우가 내용 결합도로, 가장 강하고 가장 피해야 할 결합이다. 다른 모듈의 지역 변수에 직접 접근하거나 실행 중간 지점으로 분기(goto)하는 것이 전형적인 예이다. 따라서 답은 1번이다.

보기별 해설

1. 내용 결합도(Content Coupling)는 한 모듈이 다른 모듈의 내부 코드나 지역 데이터를 직접 참조·수정하는 최악의 결합이다. 상대 모듈의 내부 구현이 바뀌면 곧바로 깨지므로 결합도 등급 중 가장 강하다.
2. 제어 결합도(Control Coupling)는 어떤 처리를 할지 지시하는 제어 플래그(스위치 값)를 인수로 넘겨 상대 모듈의 실행 흐름을 좌우하는 결합이다. 호출 모듈이 피호출 모듈의 내부 논리를 알아야 하므로 중간 강도의 결합이다.
3. 공통 결합도(Common Coupling)는 여러 모듈이 전역 변수(공유 데이터 영역)를 함께 참조하는 결합이다. 어느 모듈이 값을 바꿨는지 추적하기 어려워 내용 결합도 다음으로 강하다.
4. 스탬프 결합도(Stamp Coupling)는 배열이나 구조체 같은 자료 구조 전체를 인수로 넘기되 피호출 모듈은 그중 일부만 사용하는 결합이다. 자료 결합도 다음으로 약하며 필요 없는 필드까지 노출되는 것이 단점이다.

정리

결합도 약→강: 자료(Data) < 스탬프(Stamp) < 제어(Control) < 외부(External) < 공통(Common) < 내용(Content). 내용 결합 = 다른 모듈의 내부 코드·자료 직접 참조.
#프로그래밍언어활용
Q19

파일 디스크립터(File Descriptor)에 대한 설명으로 틀린 것은?

1파일 관리를 위해 시스템이 필요로 하는 정보를 가지고 있다.
2파일 제어 블록(File Control Block)이라고도 한다.
3사용자가 파일 디스크립터를 직접 참조할 수 없다.
4주기억장치에 저장되어 있다가 파일이 개방(open)되면 보조기 억장치로 이동된다.
정답 4번 · 주기억장치에 저장되어 있다가 파일이 개방(open)되면 보조기 억장치로 이동된다.

핵심 해설

파일 디스크립터는 파일마다 하나씩 존재하며 파일 관리에 필요한 정보를 모아 둔 제어 블록으로, 파일 제어 블록(FCB, File Control Block)이라고도 한다. 파일 이름, 파일 크기, 보조기억장치에서의 위치, 파일 구조와 접근 제어 정보, 생성 일시와 최종 수정 일시 등을 담는다. 평소에는 보조기억장치에 저장되어 있다가 파일이 개방(open)될 때 주기억장치로 옮겨지는데, 4번은 이 이동 방향을 정반대로 서술했으므로 틀렸다. 또한 파일 디스크립터는 운영체제가 관리하는 정보이므로 사용자가 직접 참조하거나 수정할 수 없다.

보기별 해설

1. 파일 관리를 위해 시스템이 필요로 하는 정보를 갖는다는 것은 파일 디스크립터의 정의 그대로이다. 파일 이름, 크기, 보조기억장치 내 위치, 접근 권한, 생성·수정 일시 등이 들어 있다.
2. 파일 제어 블록(File Control Block, FCB)은 파일 디스크립터의 다른 이름이 맞다. 프로세스에 PCB가 있듯 파일에는 FCB가 하나씩 대응된다.
3. 사용자가 직접 참조할 수 없다는 것도 옳은 설명이다. 파일 디스크립터는 운영체제가 생성하고 관리하는 정보이므로 사용자는 시스템 호출을 통해 간접적으로만 이용한다.
4. 주기억장치에 있다가 개방 시 보조기억장치로 이동한다는 서술은 방향이 정반대라 틀렸다. 파일 디스크립터는 보조기억장치에 저장되어 있다가 파일이 개방(open)될 때 주기억장치로 옮겨지며, 파일을 닫으면 갱신된 내용이 다시 보조기억장치에 기록된다.

정리

파일 디스크립터(= FCB) — 파일별 관리 정보(이름·크기·위치·권한·일시)를 보관. 평소 보조기억장치에 있다가 open 시 주기억장치로 이동하며, 사용자는 직접 참조할 수 없다.
#프로그래밍언어활용
Q20

C 언어 라이브러리 중 stdlib.h에 대한 설명으로 옳은 것은?

1문자열을 수치 데이터로 바꾸는 문자 변환 함수와 수치를 문자 열로 바꿔주는 변환 함수 등이 있다.
2문자열 처리 함수로 strlen()이 포함되어 있다.
3표준 입출력 라이브러리이다.
4삼각 함수제곱근지수, , 등 수학적인 함수를 내장하고 있다.
정답 1번 · 문자열을 수치 데이터로 바꾸는 문자 변환 함수와 수치를 문자 열로 바꿔주는 변환 함수 등이 있다.

핵심 해설

stdlib.h는 C의 표준 유틸리티 라이브러리로 자료형 변환, 동적 메모리 할당, 난수 생성, 프로세스 제어, 정렬·검색 함수를 제공한다. 문자열을 수치로 바꾸는 atoi·atof·atol·strtol, 수치를 문자열로 바꾸는 itoa 계열이 여기에 속하며, malloc·calloc·free, rand·srand, exit·system, qsort·bsearch도 stdlib.h에 선언되어 있다. 나머지 보기는 각각 string.h, stdio.h, math.h에 대한 설명이므로 1번만 옳다. (4번의 '삼각 함수제곱근지수, , 등'은 PDF 추출 시 어절 순서가 깨진 것으로 원문은 '삼각 함수, 제곱근, 지수 등'이다.)

보기별 해설

1. 문자열을 수치로, 수치를 문자열로 바꾸는 변환 함수를 제공한다는 것이 stdlib.h에 대한 옳은 설명이다. atoi(문자열→int), atof(문자열→double), strtol 등이 대표적이며 동적 메모리 할당(malloc·free)과 난수(rand), 프로세스 종료(exit)도 함께 들어 있다.
2. 문자열 처리 함수 strlen()은 stdlib.h가 아니라 string.h에 선언되어 있다. strcpy, strcat, strcmp, strncpy 등도 모두 string.h 소속이다.
3. 표준 입출력 라이브러리는 stdlib.h가 아니라 stdio.h이다. printf, scanf, fopen, fclose, fgets 등 입출력 함수가 stdio.h에 선언되어 있다.
4. 삼각 함수, 제곱근, 지수 같은 수학 함수는 stdlib.h가 아니라 math.h에 들어 있다. sin, cos, tan, sqrt, pow, log 등이 math.h 소속이며 링크 시 -lm 옵션이 필요할 수 있다.

정리

헤더 파일 — stdio.h(printf·scanf 입출력), stdlib.h(atoi·malloc·rand·exit 유틸리티), string.h(strlen·strcpy 문자열), math.h(sqrt·pow·sin 수학).
#프로그래밍언어활용