본문 바로가기
AI/정보처리기사_스터디

정처기 4일차 수제비: 기본문법 활용 기출 4유형 풀이법

by 거대웅 TitanBear 2026. 7. 16.
정보처리기사 필기 4일차 · p.4-56~p.4-78

정처기 수제비 기본문법 활용 기출 4유형 풀이법

이번 범위는 새 이론을 넓게 외우는 구간이라기보다, 지금까지 배운 문법을 코드 출력 문제에 적용하는 연습 구간입니다. 핵심은 계산을 빨리 하는 것이 아니라 언어, 자료형, 연산 시점, 포인터 이동 단위를 순서대로 확인하는 것입니다.

문제 문장은 그대로 옮기지 않고, 같은 출제 원리를 확인할 수 있는 새 예제로 재구성했습니다.

첫 확인 C인지 Java인지
증감식 식에 쓰인 값과 저장값 분리
포인터 한 칸의 자료형부터 확인
마지막 출력 형식까지 검산
이 글의 정리 기준

첨부 자료는 기출문제 원문보다 해설 메모에 가까웠습니다. 따라서 확인할 수 없는 선택지나 원문 표현은 복원하지 않고, C와 Java의 공식 문서와 대조해 정확한 개념만 남겼습니다.

오늘 잡을 네 가지 기출 유형

1
언어별 조건식과 컴파일 가능 여부

C의 0과 0이 아닌 값 판정과 Java의 boolean 조건을 구분합니다.

2
전위와 후위 증감 연산자

변수의 최종값과 주변 식에 제공되는 값을 따로 추적합니다.

3
switch의 폴스루

break가 없는 경우 다음 case까지 실행되는 흐름을 읽습니다.

4
1차원과 2차원 배열 및 포인터

주소 이동과 역참조를 배열 첨자식으로 바꾸어 계산합니다.

1. 값을 계산하기 전에 언어부터 확인한다

비슷해 보이는 코드도 C와 Java에서 결과가 다를 수 있습니다. 특히 반복문의 조건식은 가장 먼저 확인해야 합니다.

C와 Java의 반복문 조건식 비교
언어 조건식 규칙 while (count--)
C 0은 거짓, 0이 아니면 참으로 판단 정수형 count라면 문법상 가능
Java boolean 또는 Boolean 식만 허용 정수 결과이므로 컴파일 오류

Java에서는 정수를 조건으로 쓸 수 없다

int count = 3;

while (count--) {       // 컴파일 오류
    System.out.println(count);
}

count--의 식 결과는 정수입니다. Java의 while은 참·거짓 값만 요구하므로 이 코드는 실행 결과를 계산하기 전에 컴파일 오류로 판정해야 합니다.

int count = 3;
int hits = 0;

while (count-- != 0) {  // boolean 식으로 수정
    hits++;
}

System.out.println(hits + ", " + count);
// 출력: 3, -1
본문은 3회, 조건 검사는 4회

마지막 검사에서는 감소 전 값 0이 조건에 사용되어 본문에 들어가지 않습니다. 하지만 후위 감소식 자체는 평가되므로 count의 최종값은 -1이 됩니다.

같은 형태를 C에서 실행하면

#include <stdio.h>

int main(void) {
    int count = 3;
    int hits = 0;

    while (count--) {
        hits++;
    }

    printf("%d, %d\n", hits, count);
    return 0;
}
// 출력: 3, -1
시험 풀이 순서

언어 확인 → 컴파일 가능 여부 → 값 추적 순서로 풉니다. 컴파일되지 않는 Java 코드를 C 규칙으로 손계산하면 안 됩니다.

2. 전위와 후위 증감은 두 값을 따로 본다

전위와 후위 증감 연산자 비교
표현 식에 제공되는 값 변수에 저장되는 값
++x 1 증가한 새 값 새 값
x++ 증가하기 전 값 1 증가한 값
--x 1 감소한 새 값 새 값
x-- 감소하기 전 값 1 감소한 값
#include <stdio.h>

int main(void) {
    int a = 4;
    int b = 6;
    int result = a++ + ++b;

    printf("%d, %d, %d\n", a, b, result);
    return 0;
}
// 출력: 5, 7, 11
증감식 추적표
순서 해석 식에 쓰인 값 연산 후 저장값
1 a++ 4 a = 5
2 ++b 7 b = 7
3 덧셈과 대입 4 + 7 result = 11
C에서 같은 변수를 한 식에서 여러 번 바꾸지 말자

a++ + ++a처럼 같은 객체를 한 식에서 여러 번 수정하는 표현은 C에서 정의되지 않은 동작이 될 수 있습니다. 이런 코드는 특정 출력값을 외우지 말고 잘못된 코드로 구분하는 편이 안전합니다.

3. switch는 일치 지점부터 아래로 흐른다

switch는 일치하는 case로 이동한 뒤, break, return 또는 블록의 끝을 만날 때까지 아래 문장을 계속 실행합니다. 다음 case의 조건을 다시 검사하지 않습니다.

#include <stdio.h>

int main(void) {
    int level = 2;

    switch (level) {
        case 1:
            printf("L");
        case 2:
            printf("M");
        case 3:
            printf("H");
            break;
        default:
            printf("?");
    }

    return 0;
}
// 출력: MH
1
level은 2

case 2로 바로 이동해 M을 출력합니다.

2
case 2 뒤에 break가 없음

다음 라벨을 검사하지 않고 case 3H까지 출력합니다.

3
case 3break에서 종료

따라서 최종 출력은 MH입니다.

폴스루는 항상 실수일까?

의도적으로 여러 case를 묶을 때도 사용합니다. 다만 의도한 폴스루라면 주석으로 명확히 표시하는 것이 좋습니다.

4. 1차원 배열은 주소와 값을 분리해서 본다

시험용 주소 계산 공식

원소 주소 = 시작 주소 + 인덱스 × 원소 크기

예를 들어 int values[4]의 시작 주소가 1000이고, 문제에서 int 크기를 4바이트라고 가정하면 &values[3]의 주소는 1000 + 3 × 4 = 1012입니다.

values[0]
주소 1000
5
values[1]
주소 1004
8
values[2]
주소 1008
13
가상 주소와 실제 포인터 출력은 다르다

숫자 주소를 직접 계산하는 것은 시험의 가정입니다. 실제 C 코드에서 포인터를 출력할 때는 %u가 아니라 %p를 사용하고, 인수는 void *로 변환합니다.

#include <stdio.h>

int main(void) {
    int values[4] = {5, 8, 13, 21};

    printf("%p\n", (void *)values);
    printf("%p\n", (void *)&values[3]);
    return 0;
}

배열 첨자는 포인터 연산으로 정의된다

a[i]*(a + i)
1차원 배열의 주소식과 값식
표현 의미 종류
a + 2 세 번째 원소의 주소 포인터
*(a + 2) 세 번째 원소의 값 a[2]와 동치
&a[2] 세 번째 원소의 주소 a + 2와 동치
&a 배열 전체의 주소 포인터 형식과 이동 단위가 다름

“배열 이름은 포인터다”는 절반만 맞다

배열식 a는 대부분의 식에서 첫 원소를 가리키는 &a[0]로 자동 변환됩니다. 하지만 배열 객체와 포인터 변수는 같은 것이 아닙니다.

배열과 포인터 변수의 차이
구분 배열 int a[4] 포인터 int *p
정체 정수 4개를 담은 배열 객체 정수의 주소를 담는 변수
다른 주소 대입 a = other 불가 p = other 가능
sizeof sizeof a는 배열 전체 크기 sizeof p는 포인터 자체 크기
부분 초기화는 나머지를 0으로 채운다

int a[4] = {5, 8};처럼 초기화 목록을 사용하면 나머지 a[2]a[3]은 0이 됩니다. 반대로 초기화하지 않은 지역 자동 배열의 값은 정해져 있지 않습니다.

5. 2차원 배열 포인터는 행과 열을 나눠 읽는다

#include <stdio.h>

int main(void) {
    int grid[2][3] = {
        {7, 8, 9},
        {10, 11, 12}
    };
    int (*row)[3] = grid;

    int answer = *(row[0] + 1)
               + *(*(row + 1) + 2);

    printf("%d\n", answer);
    return 0;
}
// 출력: 20
2차원 배열 grid의 행과 열
0열 1열 2열
grid[0] 7 8 9
grid[1] 10 11 12
row[i][j]*(*(row + i) + j)
1
*(row[0] + 1)

0행의 시작에서 정수 한 칸 이동해 grid[0][1], 즉 8을 꺼냅니다.

2
*(*(row + 1) + 2)

1행으로 이동한 뒤 정수 두 칸 이동해 grid[1][2], 즉 12를 꺼냅니다.

3
최종 계산

8 + 12이므로 출력은 20입니다.

이동 단위가 핵심

row + 1은 정수 한 칸이 아니라 한 행, 즉 정수 3개만큼 이동합니다. 반면 row[i] + 1은 선택한 행 안에서 정수 한 칸 이동합니다.

괄호 하나로 완전히 달라지는 선언

행 포인터와 포인터 배열 선언 비교
선언 읽는 방법 정체
int (*row)[3] *row가 먼저 묶임 정수 3개짜리 배열을 가리키는 포인터
int *row[3] row[3]이 먼저 묶임 정수 포인터 3개를 담는 배열

6. 출력 문제는 이 다섯 단계로 푼다

1
언어와 컴파일 가능 여부 표시

Java 조건식, C의 정의되지 않은 동작처럼 계산 전에 탈락할 코드를 먼저 찾습니다.

2
자료형과 초기값 표 작성

배열의 빈 원소, 변수의 시작값, 포인터가 가리키는 대상을 적습니다.

3
연산 우선순위와 증감 시점 확인

괄호 안쪽부터 풀고, 식에 사용된 값과 변수에 남은 값을 분리합니다.

4
포인터 한 칸의 크기 표시

int *는 정수 한 칸, int (*)[3]은 한 행씩 이동합니다.

5
출력 형식과 구분자 검산

값이 맞아도 공백, 쉼표, 줄바꿈이 다르면 최종 출력 문자열이 달라집니다.

C printf에서 자주 사용하는 출력 형식
출력 대상 형식 지정자 예시
int %d printf("%d", value);
unsigned int %u printf("%u", value);
포인터 %p printf("%p", (void *)ptr);
size_t %zu printf("%zu", sizeof value);

7. 시험 직전 암기 카드

기본문법 활용 기출 핵심 암기표
주제 한 줄 암기
Java 조건식 while에는 boolean 식만 들어간다.
후위 증감 식에는 이전 값을 내놓고, 변수에는 바뀐 값이 남는다.
switch 일치 지점부터 break까지 아래로 실행한다.
1차원 배열 a[i]*(a + i)와 같다.
2차원 배열 p[i][j]*(*(p + i) + j)와 같다.
행 포인터 p + 1은 한 행, p[i] + 1은 행 안의 한 칸이다.
포인터 출력 실제 C 코드에서는 %pvoid *를 사용한다.

8. 미니 퀴즈

1

Java에서 정수형 변수 n을 사용한 while (n--)은 실행될까?

2

C에서 x = 2, y = 4일 때 z = x++ + --y 이후 세 변수의 값은?

3

switch에서 일치한 case 뒤에 break가 없으면 어떻게 될까?

4

int a[5] = {7, 9};로 초기화했을 때 a[4]의 값은?

5

int m[2][2] = {{1, 4}, {7, 9}};, int (*p)[2] = m;일 때 *(*(p + 1) + 0)의 값은?

정답과 해설 확인하기

1. 실행되지 않습니다. n--은 정수식이므로 Java의 while 조건에 사용할 수 없어 컴파일 오류가 발생합니다.

2. x = 3, y = 3, z = 5입니다. 식에는 감소 전 x 값 2와 감소 후 y 값 3이 참여합니다.

3. 다음 case의 문장으로 이어서 실행합니다. 이를 폴스루라고 합니다.

4. 0입니다. 초기화 목록에서 생략된 나머지 원소는 0으로 초기화됩니다.

5. 7입니다. 식을 p[1][0]으로 바꾸면 바로 확인할 수 있습니다.

9. 공식 문서 참고 자료

마무리

이 범위의 출력 문제는 기호가 많아 보여도 풀이 순서는 일정합니다. 언어를 확인하고, 초깃값을 표로 적고, 증감 시점과 포인터 이동 단위를 표시한 뒤, 마지막에 출력 형식을 확인하면 됩니다.

특히 Java 정수 조건식은 컴파일 오류, 후위 연산은 이전 값을 식에 제공, 행 포인터의 한 칸은 한 행이라는 세 문장을 확실히 기억해 두세요. 배열 포인터 식은 괄호 안쪽부터 첨자식으로 바꾸면 훨씬 단순해집니다.