728x90
SMALL

[정보처리기사/예상문제] - 2024 정보처리기사 실기 예상 문제 모음
C언어 기출문제 모음
비전공자용 C언어 요약 1탄
비전공자용 C언어 요약 2탄(조건문, 반복문, 배열)
비전공자용 C언어 요약 3탄(함수, 포인터)
비전공자용 C언어 요약 4탄(포인터 심화, 구조체)


목차
1. 포인터와 1차원 배열
2. 포인터와 2차원 배열
3. 포인터와 문자 배열
4. 포인터와 문자열 배열
5. 함수 심화(Call by Value, Call by Reference)
6. 구조체


1. 포인터와 1차원 배열
우선 배열의 이름은 배열의 시작주소이다.
 
아래 예문을 보자.

#include <stdio.h>

int main() {
	int array[3] = { 10,20,30 };
    printf("%x %x %x \n", array, array + 0, &array[0]);  //배열 0번째 요소의 주소 출력
	printf("%d %d %d \n", *array, *(array + 0), *&array[0]);  //배열 0번째 요소의 값 10 출력
}

*array는 array(배열 이름) 주소가 가리키는 값인 10이 출력된다
*(array+0)은 array주소에 0칸 이동한 주소가 가리키는 값인 10이 출력된다
*&가 동시에 있으면 생략이 가능하다.
즉 *&arr[0]=array[0] 따라서 역시 배열의 0번째 인덱스인 10이 출력된다
 
결국 array==array+0==&array[0]이라는 의미이다
 
다만 여기서 주의점은 int형 배열이라 요소 1개의 크기는 4바이트이고 array,array+0, &array[0]으로 출력되는 값은 동일하지만 array만 0번째 요소가 아니라 배열 전체를 가리키기 때문에 12바이트(int형이 3칸있으니 12바이트)가 된다
 
다음과 같이 포인터변수 p에 array(배열이름)으로 배열의 시작주소를 저장하면 포인터변수를 배열처럼 사용할 수 있다
아래 예문은 위의 예문과 결과값이 100% 동일하다

#include <stdio.h>

int main() {
	int array[3] = { 10,20,30 };
	int* p = array; //포인터 변수에 배열의 시작 주소를 저장

	printf("%x %x %x \n",p,p+0,&p[0]); //배열 0번째 요소의 주소 출력
	printf("%d %d %d \n", *p,*(p+0),*&p[0]); //배열 0번째 요소의 값 출력
}

 
다 필요없고 위 같은 경우 포인터변수 p랑 array랑 똑같다고 생각해주면 된다


2. 포인터와 2차원 배열
1차원배열에서는 *(array+i)==array[i]==*&array[i]는 값이라고 배웠는데
2차원 배열에서는  *(array+i)==array[i]==*&array[i]가 주소를 가리킨다
 
int array[2][3] = { 10,20,30,40,50,60 }라는 2차원 배열이 있을 때 테이블 같은 구조를 연상하지만 실제는 일직선으로 나란히 돼있는 것을 일단 상기시키고 가보도록 하자.

2차원배열에서도 1차원배열에서 처럼 &array[0][0] 이런식으로 하면 각 배열의 요소의 주소, *&array[0][0] 하면 각 배열의 요소의 값이 잘 출력된다.
 
그렇다면 아래 예문은 어떤 결과가 나올까? 

#include <stdio.h>

int main() {
	int array[2][3] = { 10,20,30,40,50,60 };

	(1)printf("%x\n", array);  
	(2)printf("%x\n", array[0]);
	(3)printf("%x\n", *(array + 0));
	(4)printf("%x\n", &array[0][0]);
    
	(5)printf("%x\n", array+1);
	(6)printf("%x\n", array[1]);
	(7)printf("%x\n", *(array + 1));
	(8)printf("%x\n", &array[1][0]);
    
    
    (9)printf("%d\n",sizeof(&array[0][0]));  //4 출력(32비트 운영체제의 경우)
    //64비트 운영체제의 경우 8로 출력된다
    
	(10)printf("%d\n", sizeof(array[0]));  //12 출력
    (11)printf("%d\n", sizeof(array));  //24 출력
}

(1)~(4)까지는 array[0][0]의 주소를 출력하고
(5)~(8)까지는 array[1][0]의 주소를 출력한다
 
결과값은 동일하지만 4번과 8번의 경우는 arr[0][0], array[1][0] 처럼 특정한 요소의 주소를 가리키지만 나머지는 아래 그림과 같이 특정행을 가리킨다. 
따라서 (9)는 특정요소를 가리키므로 4가 출력되고 (10)은 행을 가리키므로 12가 출력되고 (11)은 배열 전체를 가리켜서 24가 출력된다 

 
*(array + 0)이 형태만 조금 더 살펴 보자
먼저 array는 배열 전체를 가리키지만 위치는 array[0][0] 시작주소에 가 있다

두번째 *(array+0)는 array에서 +0한 곳의 값을 읽는 것인데 2차원배열에서는 이 값이 행의 주소를 가리킨다
배열에서 특정 행을 가리키지만 위치는 array[0][0] 시작주소에 가 있다

세번째 array[0]+0은 배열에서 특정 행의 특정 요소 가리키지만 역시 위치는 array[0][0] 시작주소에 가 있다
따라서 

모두 출력되는 값은 동일하지만 크기는 다르다
이해한 것을 토대로 아래 출력결과를 예상해보자.

#include <stdio.h>

int main() {
	int array[2][3] = { 10,20,30,40,50,60 };

	(1)printf("%d\n", sizeof(array));
	(2)printf("%d\n", sizeof(array[0]+0));
	(3)printf("%d\n", sizeof(*(array + 0)));
	(4)printf("%d\n", sizeof( & array[0][0])); 
    }
더보기

(1)은 array가 배열의 전체를 가리키므로 24

(2)는 array[0]이 2차원배열의 0번째 행을 가리키고 0번째 행의 0번째 요소를 가리키므로 4출력

(3)는 array는 배열의 전체를 가리키지만 array+0을 함으로써 0번째 행을 가리키게 돼 12가 출력된다(2차원 배열에서는 배열이름의 주소에 대한 값이 특정행의 주소를 가리키게 된다)

(4)는 0행 0열의 주소를 가리키므로 4가 출력된다

#include <stdio.h>

int main() {
	int array[2][3] = { 10,20,30,40,50,60 };

	printf("%d\n", sizeof(array));  //24출력
	printf("%d\n", sizeof(array[0]+0)); //4출력(32비트 운영체제 기준)
    //64비트 운영체제의 경우 8로 출력된다
    
	printf("%d\n", sizeof(*(array + 0))); //12출력
	printf("%d\n", sizeof( &array[0][0])); //4출력(32비트 운영체제 기준)
    //64비트 운영체제의 경우 8로 출력된다
    }

사진 출처 : C언어본색-박정민

 
하나도 이해가 안된다면 그냥 외우면된다.
1차원 배열에서는 값을 가리켰던 녀석들이 2차원 배열에서는 주소를 가리키는 것이다
 
 
1차원 배열과 동일하게 2차원 배열도 포인터를 써서 똑같이 쓸 수 있지 않을까? 생각할 수있지만 아래처럼 코드를 짜면 에러가 난다. int *p는 1차원 포인터 변수이므로 2차원 배열을 저장해도 1차원처럼 작동되기 때문이다.
따라서 이 경우에 필요한 것이 바로 배열 포인터이다.

#include <stdio.h>

int main() {
	int array[2][3] = { 10,20,30,40,50,60 };
	int* p = array;
	printf("%d\n",p[0][0]);

	return 0;
}

 
2-1.배열 포인터
배열 포인터는 배열을 가리키는 포인터 변수이다.
배열 포인터는 다음과 같이 선언한다.

앞에 int는 자료형이고 (*p)는 배열 포인터 변수 이름이고 [3]은 열 길이이다
이렇게 배열포인터로 선언을 하면 2차원 배열처럼 포인터도 접근할 수 있게 된다

#include <stdio.h>

int main() {
	int array[2][3] = { 10,20,30,40,50,60 };
	int(* p)[3] = array; //포인터 변수에 배열의 시작 주소를 저장
	printf("%d\n", array[0][0]);
	printf("%d\n",p[0][0]);

	return 0;
}

 
2-2 포인터 배열
주소를 저장하는 배열
 
포인터 배열은 다음과 같이 선언한다

앞에 int*는 자료형이고 pointer는 포인터배열 변수 이름이고 [3]은 배열 길이이다

#include <stdio.h>

int main() {
	int a = 10, b = 20, c = 30;
	int* p[3] = {&a,&b,&c};
	printf("%d\n", *p[0]);
	printf("%d\n", *p[1]);
	printf("%d\n", *p[2]);
	printf("%d\n", **(p+0));
	printf("%d\n", **(p+1));
	printf("%d\n", **(p+2));

	return 0;
}

 

더보기

p[0]에 주소가 들어있으니 *p[0]은 그 주소의 값 따라서 10

나머지도 마찬가지

 

p는 배열의 이름이니 배열의 시작주소인데 +0으로 p의 0번째 요소가 선택되고 0번째요소의 값의 값이니 10이 된다

#include <stdio.h>

int main() {
	int a = 10, b = 20, c = 30;
	int* p[3] = {&a,&b,&c};
	printf("%d\n", *p[0]); //10
	printf("%d\n", *p[1]);  //20
	printf("%d\n", *p[2]);  //30
	printf("%d\n", **(p+0)); //10
	printf("%d\n", **(p+1)); //20
	printf("%d\n", **(p+2));  //30

	return 0;
}

3. 포인터와 문자 배열
문자배열은 그냥 1차원 배열과 포인터 개념과 동일하다
 
아래 예문을 보자.

#include <stdio.h>

int main() {
	char array[3] = { 'A','B','C'};
	char* p = array; //포인터 변수에 배열의 시작 주소를 저장
	printf("%x %x %x \n", array, array + 0, &array[0]);  //배열 0번째 요소의 주소 출력
	printf("%c %c %c \n", *array, *(array + 0), *&array[0]);  //뱌욜 0번째 요소의 값 A 출력

	printf("%x %x %x \n", p, p + 0, &p[0]); //배열 0번째 요소의 주소 출력
	printf("%c %c %c \n", *p, *(p + 0), *&p[0]); //배열 0번째 요소의 값 A 출력
	
}

 
다 필요없고 위 같은 경우 포인터변수 p랑 array랑 똑같다고 생각해주면 된다


 
4. 포인터와 문자열 배열
C언어에서 문자열이란 큰 따옴표 내에 포함된 하나 이상의 문자를 의미하며 문자열의 맨 끝에는 문자열의 끝을 알리는 종료 문자 '\0'이 삽입되어 있으며 이런 종료 문자를 널(Null) 문자라 한다
 
문자열은 문자들이 메모리 공간에 연속적으로 저장되어 있어서 보통 주소로 관리되며 문자열을 출력할 때는 서식 문자 %s를 쓴다문자열은 문자들의 집합이므로 문자의 배열이라고 생각할 수 있다
 
아래 결과를 예상 해보자.

#include <stdio.h>

int main() {
	char array[4] = "ABC";
	printf("%c%c%c\n", array[0], array[1], array[2]);
	printf("%s", array);
	printf("%d %d %d\n", array[0], array[1], array[2]);
	return 0;
}
더보기

A를 %d로 출력하면 A의 아스키코드인 65가 출력된다

#include <stdio.h>

int main() {
	char array[4] = "ABC";
	printf("%c%c%c\n", array[0], array[1], array[2]); //ABC 출력
	printf("%s\n", array); //ABC 출력
	printf("%d %d %d\n", array[0], array[1], array[2]); //65 66 67 출력
	return 0;
}

 
다음 결과도 예상해보자.

#include <stdio.h>

int main() {
	char array[4] = "ABC";
	printf("%s\n", array);
	printf("%s\n", array+1);
	printf("%s\n", array+2);
	return 0;
}
더보기

array일때는 전체를 가리켜서 ABC가 출력

array+1일때는 arr[1]번째 시작주소를 가리켜서 BC

array+2일때는 array[2]번째 시작주소를 가리켜서 C

#include <stdio.h>

int main() {
	char array[4] = "ABC";
	printf("%s\n", array);  //ABC 출력
	printf("%s\n", array+1); //BC 출력
	printf("%s\n", array+2);  //C 출력
	return 0;
}

 
이런 문자열을 배열이 아니라 포인터로 바꾸면 아래와 같다

#include <stdio.h>

int main() {
	char array[4] = "ABC"; //배열 방식
	printf("%s\n", array);
	printf("%s\n", array+1);
	printf("%s\n", array+2);

	char* p = "ABC";  //포인터방식
	printf("%s\n", p);
	printf("%s\n", p + 1);
	printf("%s\n", p + 2);
	return 0;
}

5. 함수 심화(Call by Value, Call by Reference)
 
함수에서 이때 까지 사용했던 방식이 Call my Value인데 그것은 값을 복사하는 방식이다.

#include <stdio.h>
int func(int);
int main() {
	int a = 10;
	printf("%d\n",func(a));  //11출력
    printf("%d\n",a);  //10출력
	return 0;
}


int func(int a) {
	a = a + 1;
	return a;
}

 
main 함수에서 변수 a를 선언하면서 초기화 한 후 a변수를 인수로 전달하면서 매개변수 a로 값이 복사된다
값을 복사하는 방식으로 main()함수의 지역변수 a 값 변동에는 영향을 미치지 않는다

다음은 새로 배우게 될 Call by Reference(주소 참조) 방식이다
주소를 인수로 받아서 값을 바꾸기 때문에 main()함수의 지역변수 a에도 영향을 미친다

#include <stdio.h>
int func(int*);
int main() {
	int a = 10;
	printf("%d\n",func(&a)); //11 출력
	printf("%d", a);  //11 출력
	return 0;
}


int func(int* a) {
	*a = *a + 1;
	return *a;
}

int func(int* a)인 이유는 주소를 전달받기 때문이다
쉽게 생각해서 포인터변수를 선언할 때 int *p=&a; 이런식으로 선언하는 것을 생각하면 된다
주소를 받기 때문에 함수의 매개변수 형태가 포인터변수가 되는 것이다
 


6. 구조체
하나 이상의 변수를 묶어 그룹화하는 사용자 정의 자료형이다
배열이 같은 자료형만 담을 수 있다면 구조체는 다른 자료형도 담을 수 있다
 
아래와 같은 형식으로 구조체를 정의한다
struct : 구조체 키워드
student : 구조체 이름
 
int score, char name은 구조체 멤버 변수

struct student
{
	int score;
	char name;
};

구조체 정의를 하고 구조체 변수 선언을 동시에 하는 방법은 아래와 같다.

struct student
{
	int score;
	char name;
}p1, p2, p3;

 
따로 선언하는 방식은 아래와 같다.

#include<stdio.h>
struct student
{
	int score;
	char name;
};

int main(){
	struct student p1, p2, p3;


return 0;
}

 
구조체 변수에 .(도트 연산자)를 이용하면 각 변수별 멤버변수에 접근할 수 있다
p1.score이라고 하면 p1의 score에 접근이 가능해지며
p1.score=30; 이라고 하면 p1.score 자리에 30이 저장된다

#include<stdio.h>
struct student
{
	int score;
	char name;
};

int main(){
	struct student p1, p2, p3;
	p1.score = 30;
	printf("%d", p1.score);  //30출력

return 0;
}

 
6-1 구조체와 배열
멤버변수로 배열도 사용 가능하다
 
학생 수가 많아지면 구조체 변수 p1,p2,p3가 무한히 많이 필요할 텐데 이런 문제를 해결하기 위해 구조체 변수를 배열로 사용하면 된다

#include<stdio.h>
struct student {
	char no[10];
	char name[20];
	double math;
	double english;
};

int main(){
	struct student stu[3] = {
		{"12345","Lee",90,90},
		{"12346","KIM",80,70},
		{"12347","Park",50,100}
	};

return 0;
}

 

 
6-2 구조체와 포인터

#include<stdio.h>
struct p {
	int* x;
	int* y;
};

int main(){
	int a = 5;
	int b = 4;
	struct p p1;
	p1.x = &a;
	p1.y = &b;

	printf("%d %d\n", a, b);
	printf("%d %d\n", *p1.x, *p1.y);

return 0;
}

출력결과를 예상해보자

더보기

5 4

5 4

 
 
구초제 변수로 포인터를 사용할 수 도 있다
구조체 변수로 포인터를 사용한다는 것은 구조체 변수에 간접 접근할 수 있다는 의미이다
 
(*p)를 한 이유는 .연산자가 *연산자보다 우선순위가 높아 *p를 먼저 연산하기 위함이다
p는 포인터변수인데 p가 구조체 변수 stu의 주소를 담고 있으므로 *p는 stu의 값을 가리킨다
->연산자는 포인터 변수만으로 구조체의 멤버 변수에 접근할 때 사용한다

#include<stdio.h>
struct student {
	char no[10];
	char name[20];
	double total;
};

int main(){
	struct student stu = {"12345","KIM",20};
	struct student* p = &stu;

	printf("%s %s %lf\n", (*p).no, (*p).name, (*p).total); //12345 KIM 20 출력
	printf("%s %s %lf\n", p->no, p->name, p->total);//12345 KIM 20 출력

return 0;
}

 
 
 
[정보처리기사/예상문제] - 2024 정보처리기사 실기 예상 문제 모음
C언어 기출문제 모음
비전공자용 C언어 요약 1탄
비전공자용 C언어 요약 2탄(조건문, 반복문, 배열)
비전공자용 C언어 요약 3탄(함수, 포인터)
비전공자용 C언어 요약 4탄(포인터 심화, 구조체)

728x90
LIST
728x90
SMALL

[정보처리기사/예상문제] - 2024 정보처리기사 실기 예상 문제 모음

C언어 기출문제 모음

비전공자용 C언어 요약 1탄

비전공자용 C언어 요약 2탄(조건문, 반복문, 배열)

비전공자용 C언어 요약 3탄(함수, 포인터)

비전공자용 C언어 요약 4탄(포인터 심화, 구조체)

 


목차

1. 함수

2. 변수의 종류

3. 재귀 함수

4. 포인터

 


1. 함수

이처럼 함수는 특정 작업을 수행하는 코드의 집합이라고 생각하면 된다.

예를 들어 a+b라는 식이 있다고 생각하면 a+b가 한번만 나오면 상관없겠지만 엄청 많이 나오면 반복적인 작업임에도 코드가 길어지고 번거로울 수 있다. 그래서 더하기 작업을 수행하는 함수를 만들어 놓는 것이다. 

함수의 기본 구조는 다음과 같다.

사진 출처 : C언어 - 함수의 구조, 함수의 형태 4가지 정리글 (1차 수정) : 네이버 블로그 (naver.com)

 

입력 형태에서 보이는 int x, int y는 매개 변수(Parameter)라고 한다.

함수의 형태는 아래 그림과 같이 4가지가 있다.

출력 형태가 있으면 1, 없으면 0

입력 형태가 있으면 1, 없으면 0

 

return의 의미는 반환하고 함수를 종료라는 의미이므로 출력 형태가 1인 경우에는 반드시 return문이 있어야 한다

사진 출처 : C언어 - 함수의 구조, 함수의 형태 4가지 정리글 (1차 수정) : 네이버 블로그 (naver.com)

 

함수를 배웠으니 변수의 종류에 대해 살펴보자.


2. 변수의 종류

함수에서 사용되는 변수는 지역 변수, 전역 변수, 정적(static) 변수, 외부(extern) 변수, 레지스터(register) 변수가 있다.

이 중에 지역 변수, 전역 변수, 정적(static) 변수만 공부해보도록 하자.

 

1) 지역 변수(Local Variable)

main() 함수, 조건문, 반복문의 중괄호({}) 내부와 함수의 매개 변수(Parameter)로 사용되는 변수를 의미한다

 

아래의 예문 출력결과가 무엇인지 예측 해보자.

#include<stdio.h>
int hello(void);

int main() {
	int k = 20;
	
	printf("%d\n",hello()); 
    printf("%d", k);   
    
	return 0;
}


int hello(void) {
	int k = 100;
	return k;
}
더보기

100

20

#include<stdio.h>
int hello(void);

int main() {
	int k = 20;
	
	printf("%d\n",hello()); //100출력
    printf("%d", k);    //20 출력
    
	return 0;
}


int hello(void) {
	int k = 100;
	return k;
}

위 예문을 보면 int k=20으로 초기화를 시킨후 hello라는 함수를 호출해서 k는 100이라고 바뀐줄 알았는데 그게 아니고 20이 그대로 호출되었다.

즉, main()함수의 k와 hello()함수의 k는 다르다는 것이다.

 

심도있게 알기 위해서는 메모리에 대해 알아야한다. 

지역변수라서 함수가 종료되면 메모리 공간이 소멸된다.

 

2) 전역 변수(Global Variable)

중괄호 외부에 선언되는 변수로 어느 지역에서도 사용이 제한되지 않는 프로그램 어디에서든 접근이 가능한 변수이다

중괄호가 시작되면 메모리가 생성되고 해당 중괄호에서 빠져나오면 메모리가 소멸되는 지역변수와 달리 전역변수는 프로그램이 시작되면 메모리에 생성되고 프로그램이 종료되면 메모리가 소멸된다

 

그래서 전역 변수는 프로그램이 종료되지 않는 한 계속해서 메모리에 존재하고 영역에 제한받지 않으며 사용된다

그리고 전역 변수는 초깃값을 지정해주지 않아도 자동으로 값을 0으로 가진다.

 

전역 변수의 잘못된 사용과 남용은 공유 자원에 대한 잘못된 접근으로 부작용을 낳을 수 있는데 시스템의 변경과 유지 보수를 어렵게 하는 원인이 될 수있으므로 전역 변수의 사용은 최대한 피하는 것이 바람직하다

 

3) 정적 변수(Static)

전역 변수의 단점을 부분적으로 보완한 변수

정적변수는 변수의 자료형 앞에 static 키워드를 넣어서 만든다

static int a;

 

정적 변수는 전역 변수처럼 프로그램이 종료되지 않는 한 메모리가 소멸되지 않고 초깃값을 지정하지 않아도 자동으로 0으로 가지며 또한 정적 변수는 초기화가 단 1회만 수행된다.

 

다음 수행결과가 무엇일지 생각해보자.

#include<stdio.h>
void hello(void);

int main() {
	int k = 20;
	
	hello();
	hello();
	hello();

	return 0;
}


void hello(void) {
	static k = 1;
	int t = 0;
	k++;
	t++;
	printf("%d %d\n", k, t);
}
더보기

2 1

3 1

4 1

static 변수 k는 한번만 초기화되므로 k가 정상적으로 계속 증가하는 것을 볼 수 있지만

지역변수 t는 계속 초기화가 진행이 돼 모든 값이 1임을 확인할 수 있다.


3. 재귀함수(Recursive Function)

함수 내에서 자기 자신을 호출하는 함수

재귀 함수의 경우 계속적인 자기 자신의 함수 호출로 시간과 메모리 공간의 효율이 저하될 수 있다.

 

다음 코드의 결과값을 생각해보자.

#include<stdio.h>
int fact(int);

int main() {
	int a=4;
	printf("%d",fact(a));
	return 0;
}

int fact(int n) {
	if (n <= 1)
		return 1;
	else
		return n * fact(n-1);
}
더보기

24

 

fact(4)=return 4 * fact(3)

fact(3)=return 3* fact(2)

fact(2)=return 2*fact(1)

fact(1)=1

 

fact(4)=4*3*2*1=24

 

따라서 결과는 24

 

위 문제는 재귀함수를 이용한 팩토리얼 예제였다.


4. 포인터

포인터(pointer)란 메모리의 주소값을 저장하는 변수이며, 포인터 변수라고도 부른다.

말 그대로 뭔가를 가리키는 의미를 가지고 있다. (주소값을 가리킴)
char형 변수가 문자를 저장하고, int형 변수가 정수를 저장하는 것처럼 포인터는 주소값을 저장한다.

 

포인터 변수의 선언은 아래와 같이 선언한다. 

사진 출처  : C언어 포인터 사용시 주의점 : 네이버 블로그 (naver.com)

 

포인터 변수의 크기는 주소를 가리키기 때문에 항상 4byte의 동일한 크기를 가진다. (32bit 운영체제 한정)

 

1) 주소 연산자(&)
주소 연산자는 변수의 이름 앞에 사용하여, 해당 변수의 주소값을 반환한다.

 

2) 참조 연산자(*)
참조 연산자는 포인터의 이름이나 주소 앞에 사용하여, 포인터에 가리키는 주소에 저장된 값을 반환한다.

dereference라고 하여 역참조연산자라고도 한다.

 

다 필요없고 포인터는 하나만 알면 된다.

*p는 선언할 때를 제외하고 무조건 값을 가리킨다고 생각하면 되고 &는 주소를 가리킨다고 생각하면 된다.

 

아래는 대충 이해를 돕기위해 만든 표이다. (주소는 그냥 임시로 준 값이다)

#include <stdio.h>

int main() {
  int a=3;
  int b=&a;
  int *c=&a;
  printf("%d\n",a); //그냥 변수 a를 출력
  printf("%d\n",b); //b에 저장된 a의 주소의 값을 출력
  printf("%d\n",c); //포인터 변수 c에 저장된 a의 주소 출력
  printf("%d\n",*c); //포인터 변수 c에 저장된 a의 주소의 값 출력
  return 0;
}

printf("%d",a); //출력 결과 : 3

printf("%d",b); //출력 결과 : 1000K

printf("%d",c); //출력 결과 : 1000K

printf("%d",*c); //출력 결과 : 3

 

b는 a의 주소 값이 b라는 변수에 대입된 것이고

c는 a의 주소 값을 가리킬 수 있게 된 것이다

즉, a와 b는 연결고리가 없는 반면 a와 c는 연결고리가 있다.

 

3) 다차원 포인터

1차원 포인터에는 변수의 주소값이 저장되고 2차원포인터(이중포인터)에서는 1차원 포인터의 주소가 저장된다.

마찬가지로 3차원 포인터는 2차원 포인터의 주소가 저장된다

n차원 포인터는 n-1포인터의 주소를 넣는다.

#include <stdio.h>

int main() {
  int a=3;
  int* b=&a;   //1차원 포인터 : 변수의 주소값 저장
  int** c=&b;  //2차원 보인터 : 1차원 포인터의 주소값 저장
  
  printf("%d\n",b);  //7행과 8행 동일
  printf("%d\n",*c);  // 결과값 : a의 주소
  
  printf("%d\n",*b);  //9행과 10행 동일
  printf("%d\n",**c); //결과값  : 3
  return 0;
}

포인터 변수 b는 a의 주소를 가리키기 때문에 

b는 a의 주소이고

*b는 a의 값이다

 

포인터 변수 c는 b의 주소를 가리키기 때문에

c는 b의 주소이고

*c는 b의 값인데 b의 값이 a의 주소이므로 *c는 a의 주소이다.

*c가 a의 주소이므로 **c는 a의 주소의 값(즉, a의 값)이다 

 

포인터 아무것도 이해 안돼도 좋다. 

정보처리기사 실기는 어차피 결과값 묻는 문제가 대부분인데 포인터는 주소를 가리키는 녀석이다. 컴퓨터마다 메모리 주소가 다 다르므로 주소를 묻는 문제는 나올 수가 없다.

그래서 그냥 포인터변수가 나오면 상수 대입해서 대충 찍어봐라.

대부분 맞다.

아래는 기출문제이다. 한번 생각해보자.

#include <stdio.h>
 
int main(){
int *arr[3];
int a = 12, b = 24, c = 36;
arr[0] = &a;
arr[1] = &b;
arr[2] = &c;
 
printf("%d\n", *arr[1] + **arr + 1);
}
더보기

37

 

야매 풀이

*arr[1] 뭔지 모르겠는데 arr이 배열이니까 왠지 arr[1]=b의 값일 것 같다 =24

**arr 뭔지 모르겠지만 배열인데 아무것도 안적혀있는 거보니 arr[0]을 가리키는 것 같다 그러면 arr[0]+1하면 되지 않을까? =12+1

 

24+13=37

 

진짜 풀이

*arr[1]은 arr[1]의 값인데 arr[1]이 b의 주소를 가리키므로 b의 주소의 값(b의 값) = 24

arr은 배열의 이름이고 arr[0]의 주소와 동일한데 *arr은 a의 주소이고  **은 a의 주소의 값(a의 값) =12

24+12+1=37

(참고로 *가 우선순위 더 높아서 +1보다 먼저 수행된다)

 

4) 주소의 가감산

C언어에서 배우는 자료형은 모두 주소를 가지며 주소의 가감산이 가능하다.

char형 주소에 +1을 하면 1바이트 증가, int는 4바이트 증가, double은 8바이트 증가

 

다음은 기출문제이다. 출력결과를 예상해보자.

#include <stdio.h>

int main() {
	char* p = "KOREA";
	printf("%s\n", p);
	printf("%s\n", p + 3);
	printf("%c\n", *p);
	printf("%c\n", *(p + 3));
	printf("%c\n", *p + 2);
}
더보기

4번째 줄: KOREA라는 문자열의 주소를 포인터변수 p에 저장한다는 의미

5번째줄 :  char이 p라는 주소에서 시작해서 널값 전까지를 전부 출력해서 KOREA

6번째줄 :  char이 1byte이므로 +3하면 3칸이동한것이라고 생각하면 되는데 왼쪽으로 3칸이동해서 널값 전까지 전부 출력해서 EA

7번째줄 :  서식문자가 %c로 바뀌었고 p의 값을 물어보고 있으므로 K

8번째줄 :  서식문자가 %c로 바뀌었고 p+3(p에서 주소를 3칸 이동)의 값이므로 E

9번쨰줄 : 서식문자가 %c로 바뀌었고 p의 값에서 +2한 문자이므로 K,L,M 순이므로 M

 

그냥 p는 p의 제일 첫번째(p+0)를 가리키고 있다고 생각하면 됨

 

 

[정보처리기사/예상문제] - 2024 정보처리기사 실기 예상 문제 모음

C언어 기출문제 모음

비전공자용 C언어 요약 1탄

비전공자용 C언어 요약 2탄(조건문, 반복문, 배열)

비전공자용 C언어 요약 3탄(함수, 포인터)

비전공자용 C언어 요약 4탄(포인터 심화, 구조체)

728x90
LIST
728x90
SMALL

[정보처리기사/예상문제] - 2024 정보처리기사 실기 예상 문제 모음

C언어 기출문제 모음

비전공자용 C언어 요약 1탄

비전공자용 C언어 요약 2탄(조건문, 반복문, 배열)

비전공자용 C언어 요약 3탄(함수, 포인터)

비전공자용 C언어 요약 4탄(포인터 심화, 구조체)

 


목차

1. 조건문

2. 반복문

3. 배열


1. 조건문

조건에 맞을 경우 해당 실행문장을 처리하고자 할 때 사용한다

조건문에는 if문과 swtich-case문이 있다.

 

먼저 if문

a>b가 참이면 a=a+b;가 실행이 되고 거짓이면 a=a-b;가 실행된다

아래 예문은a=a+b가 실행이 돼 13이 출력 된다

#include<stdio.h>
int main() {
	int a = 8, b = 5;
	if (a > b)
		a = a + b;
	else
		a = a - b;
	printf("%d\n", a);
	return 0;
}

비트연산자에서 봤듯이 조건문에서도 연산자가 있다. &&, ||

&&는 2개의 조건이 모두 참이어야 참(1)을 반환한다

||는 2개의 조건중 하나만 참이어도 참(1)을 반환한다

 

if외에도 또 다른 조건을 추가하고 싶을 때는 else if를 쓰기도 하고 그냥 if를 더 써주기도 하는데 

if-else if-else의 경우에는 조건문중 해당하는 1개만 실행되는 반면

if-if-if의 경우에는 해당 조건에 맞는 모든 조건문이 전부 실행된다.

#include<stdio.h>
int main() {
	int a = 90;
	int count = 0;
	if (a >= 90)
		count++;
	else if (a >= 80)
		count++;
	else if (a >= 70)
		count++;
	else
		count++;
	printf("%d", count);
	return 0;
}
더보기

출력 : 1

#include<stdio.h>
int main() {
	int a = 90;
	int count = 0;
	if (a >= 90)
		count++;
	if (a >= 80)
		count++;
	if (a >= 70)
		count++;
	printf("%d", count);
	return 0;
}
더보기

출력 : 3

 

switch-case문

switch 키워드 다음 괄호안에 들어가는 num이 무슨 값이냐에 따라 그 해당하는 경우를 실행한다.

break는 조건문을 종료하라는 키워드이고

default는 그냥 else라고 생각하면 된다

#include<stdio.h>
int main() {
	int num = 3;
	switch (num) {
	case 1:
		printf("안녕1");
		break;
	case 2:
		printf("안녕2");
		break;
	case 3:
		printf("안녕3");
		break;

	default : 
		printf("안녕안녕");
		break;
	}


		return 0;
}
더보기

출력 : 안녕3

 

break가 없으면 case3부터 아래 모든 조건문이 다 실행된다

#include<stdio.h>
int main() {
	int num = 3;
	switch (num) {
	case 1:
		printf("k");
	case 2:
		printf("o");
	case 3:
		printf("re");

	default : 
		printf("a");
	}


		return 0;
}
더보기

출력 : rea


2. 반복문

반복문에는 for, while, do-while이 있다

먼저 for문이다

 

i=0가 시작값

i<=5가 조건식

i++이 증가감값

 

i가 0부터 시작해서 i가 5가 될때 까지 i가 1씩 증가하면서 반복해라라는 의미이다

#include<stdio.h>
int main() {

	for (int i = 0; i <= 5; i++) {
		printf("%d", i);
	}
	return 0;
}

위 for문은 따라서 012345가 출력이 된다

 

 

다음은 while문이다

while 오른쪽 괄호에 조건식을 넣어준다

i가 5이하일때까지 반복해라

 

그리고 while문은 증감값을 출력문 아래에 적어준다.

출력결과는 012345이다

#include<stdio.h>
int main() {

	int i = 0;
	while (i <= 5){
		printf("%d", i);
	    i++;
	}
	
	return 0;
}

break를 이용해 해당 조건일 경우 while문이 종료되도록 해줄 수도 있다

아래는 0만 출력된다

#include<stdio.h>
int main() {

	int i = 0;
	while (i <= 5){
		if (i %2==1) break; 
		printf("%d", i);
	    i++;
		
	}
	
	return 0;
}

 

또한 continue라는 키워드를 통해 실행문을 실행하지 않고 건너 뛰라고 할 수도 있다

예를 들어 i==1에서 continue를 만났으면 i==1에서 실행될 예정이었던 모든 구문이 건너뛰기 되고 i==2구문이 시작된다

아래처럼 하면 024가 출력이 된다

#include<stdio.h>
int main() {

	int i = 0;
	while (i <= 5) {
		if (i % 2 == 1) {
			i++;
			continue;
		}
		printf("%d", i);
		i++;
	}
	return 0;
}

 

 

for 문은 반복횟수를 알고 있을 때, while 문은 반복 조건위주에 따라 반복할 때 사용된다.

 

 

마지막으로 do-while문이다

조건에 따라 반복을 계속할지를 결정할 때 사용하는 것은 while 문과 동일한데

조건 중괄호 {} 블럭을 한번 실행하고, 조건을 검사하여 반복을 결정한다

#include<stdio.h>
int main() {

	int i = 0;
	do {
		printf("%d", i);
		i++;
	} while (i <= 5);
	
	return 0;
}

출력결과는 012345이다

 

 

 

반복문이 중첩될 수 도 있다

그것을 중첩반복문이라고 한다.

 

간단한 예시를 보겠다. 

아래는 이중 for문이다.

#include<stdio.h>
int main() {
	int k = 1;
	for (int i = 1; i <= 3; i++) {
		
		for (int j = k; j <= k+2; j++) {
			printf("%d ", j);
		}
		printf("\n");
		k += 3;
	}
	return 0;
}

이중for문에 맨 처음for문은 행, 안쪽은 열이라고 생각하면 된다.

i가 1부터 3까지니까 3행이 생기는 것이다.

j도 k부터 k+2까지니까 3열이 생기는 것이다.

 

i=1일때(즉 1행이 만들어졌을 때) j를 k부터 k+2만큼 반복해라(즉 열을 k에서 k+3만큼 만들어라)

i=2일때(즉 1행이 만들어졌을 때) j를 k부터 k+2만큼 반복해라(즉 열을 k에서 k+3만큼 만들어라)

i=3일때(즉 1행이 만들어졌을 때) j를 k부터 k+2만큼 반복해라(즉 열을 k에서 k+3만큼 만들어라)

 

1행 만들어짐-> 3열 만듦

2행 만들어짐-> 3열 만듦

3행 만들어짐->3열 만듦

 

그래서 위에 이중 for문 출력결과를 생각해보자.


3. 배열

배열은 같은 데이터형 변수를 여러개로 묶어놓은 것이다

관련 있는 데이터를 하나의 변수에 할당하여 관리하기 위해 필요하다

아래와 같이 a[]형태가 배열 선언 형태이고 선언과 동시에 {1,2,3,4,5}로 초기화를 했다.

배열의 인덱스는 0부터 시작한다

a[0]=1

a[1]=2

a[2]=3

a[3]=4

a[4]=5

#include<stdio.h>
int main() {
	int a[5] = { 1,2,3,4,5 };
	for(int i=0;i<5;i++){
		printf("%d", a[i]);
	}
	return 0;
}

출력결과가 무엇일지 생각해보자

더보기

12345

 

포인터를 배울 때 얘기하겠지만 배열의 이름은 배열의 주소이다. 

int a=0; 이라는 변수가 있다고 하면 &a를 해야 a변수의 주소를 가리킬 수 있지만 

배열은 a라는 배열 이름만 있어도 변수의 주소를 가리킬 수 있다

 

 

◆배열에서 문자열

'a', 'A'같은 것을 문자라고 하고 문자가 2개이상 결합된 것을 문자열이라고 하는데 배열에 문자열을 저장할 때는 반드시 문자열의 개수+1의 크기로 선언해야한다

문자열의 마지막에는 \0(널 값)이 추가되기 때문이다.

즉, KOREA로 문자가 5개뿐이지만 널값을 포함해야해서 배열길이를 6개로 해줘야한다. 

널 값이 추가되는 이유는 메모리상에서 문자열은 이진 데이터로 저장되기 때문에 문자열의 시작과 끝이 표시되어 있지 않아 구분하기 위해서 존재한다.

#include<stdio.h>
int main() {
	char a[6] = "KOREA";
	printf("%s", a);
	return 0;
}

%s는 문자열을 받는 서식문자로 a나 &a로 사용 가능하다

a로 써도 되는 이유는 a라는 배열의 이름은 배열의 주소를 가리키기 때문이다

 

#include<string.h>를 추가해준 후 strlen이라는 함수로 a라는 배열안에 문자열길이를 구할 수 있다

5가 출력된다

#include<stdio.h>
#include<string.h>
int main() {
	char a[6] = "KOREA";
	
	printf("%d", strlen(a));  //5
	return 0;
}

위 문제를 토대로 문제를 하나 풀어보자.

#include<stdio.h>
#include<string.h>
int main() {
	char a[6] = "KOREA";
	int b = 0;
	b = strlen(a);
	for (int i = 0; i < b; i++) {
		printf("%c", a[i]);
	}
	return 0;
}
더보기

출력결과 : KOREA

 

 

 

◆2차원 배열

2차원 배열은 말그대로 2차원 배열이다.

배열이 이렇게 1차원이였다면 

2차원 배열은 이런식으로 생각하면된다.

아래 처럼 생각하면 된다 x[][] 이런 형태인데

x는 배열의 이름이고 첫번째 []는 행, 두번째 []는 열이라고 생각하면 된다

보기 편해서 이렇게 보는 것이고 실제로 메모리상에는 나란히 이어져있다.

출처 : c언어 2차원 배열 : 메모리 상에 어떻게 저장이 될까요? (tistory.com)

 

 

아래의 출력결과를 생각해보자.

#include<stdio.h>
int a[5][5];
int main() {
	int i, j, k = 1;
	for (i = 0; i < 5; i++) {
		for (j = 4; j >= 0; j--) {
			a[i][j] = k;
			k++;
		}
	}
	for (i = 0; i < 5; i++) {
		for (j = 0; j < 5; j++) {
			printf("%3d", a[i][j]);
		}
		printf("\n");
	}
	return 0;
}

 

 

[정보처리기사/예상문제] - 2024 정보처리기사 실기 예상 문제 모음

C언어 기출문제 모음

비전공자용 C언어 요약 1탄

비전공자용 C언어 요약 2탄(조건문, 반복문, 배열)

비전공자용 C언어 요약 3탄(함수, 포인터)

비전공자용 C언어 요약 4탄(포인터 심화, 구조체)

 

 

 

728x90
LIST
728x90
SMALL

[정보처리기사/예상문제] - 2024 정보처리기사 실기 예상 문제 모음

C언어 기출문제 모음

비전공자용 C언어 요약 1탄

비전공자용 C언어 요약 2탄(조건문, 반복문, 배열)

비전공자용 C언어 요약 3탄(함수, 포인터)

비전공자용 C언어 요약 4탄(포인터 심화, 구조체)

 

 

C언어 공부하기는 싫고 대충이라도 알아야겠다싶으신분만 보세요

찍먹용이라 아주 간단하게만 적혀져 있습니다

대충 읽어보시고 c언어 기출문제 풀어보시면 될 것 같습니다


목차

1. C언어의 구조

2. 변수와 자료형

3. 서식문자

4. scanf()

5. 사칙연산과 증감연산자

6. 비트연산자


1. C언어의 구조

#include<stdio.h>     
	int main() {
		printf("안녕");
		return 0;
	}

1) #include<stdio.h>는 선행처리기라고 하는데 몰라도 된다.

이 문장이 있어야 printf()함수를 쓸 수가 있다.

 

2) int main()

main() 함수인데 자세한 건 몰라도 된다

그냥 main함수 안에 있는 {   }내용물을 제일 첫번째로 보라는 것이다

 

3) printf()

말그대로 printf() 괄호안에 있는 것을 출력하라는 의미이다

 

4) 맨 뒤 ;(세미콜론)

그냥 "밥을 먹었다."할 때 .(마침표)랑 똑같다고 생각하면 된다

 

5) return 0;

함수가 문제없이 종료됐다는 것을 의미한다

그냥 없다고 생각해도 된다


아래 처럼 코드를 작성하면 어떻게 출력될까?

#include<stdio.h>     
	int main() {
		printf("안녕");
		printf("안녕");
		printf("안녕");
		return 0;
	}

그림1

문장이 다르니까 그림1의 왼쪽 처럼 출력될 것 같지만 줄바꿈기능이 없어 오른쪽처럼 안녕안녕안녕으로 출력된다

 

그렇다면 왼쪽 처럼 출력하려면 어떻게 해야할까 

바로 줄바꿈 기호를 넣어주면 된다

#include<stdio.h>     
	int main() {
		printf("안녕\n");
		printf("안녕\n");
		printf("안녕\n");
		return 0;
	}

줄바꿈기호는 \n(역슬래시 n)인데 보통 엔터키 위에 위치한다.

시험에서 낚시문제로 잘 나오므로 \n있나 없나 잘 봐야 한다


2. 변수와 자료형

변수는 데이터를 저장하는 공간이다

a=1이라고하면 a만 나와도 a안에 1이 있다고 생각하면 된다

 

근데 이때 자료형(데이터 타입)마다 변수를 선언하는 키워드(?)가 다르다

정수형 데이터는 int

실수형 데이터는 double

문자형 데이터는 char

표 출처 :  자료형이란? - 한 눈에 끝내는 C언어 기초 (goorm.io)


3. 서식문자

아래와 같이 출력하면 뭐가 출력이 될까?

#include<stdio.h>     
	int main() {
		int a = 3;
		printf("%d", a);
		return 0;
	}

바로 변수 a의 값인 3이 출력된다.

%d가 출력이 되지 않고 3이라고 출력되는 이유는 %d는 서식문자이기 때문이다.

서식문자는 출력하고자 하는 변수의 출력 형태를 지정하기 위해 사용한다

사진 출처 : [C 언어] 서식문자 (변환문자) 의미 자료형 (tistory.com)

 

 

다음 출력 결과는 어떻게 될까

#include<stdio.h>     
	int main() {
		char a = 'A';
		printf("%d\n", a);
		printf("%c\n", a);

		printf("%d\n", a+1);
		printf("%c\n", a+1);
		return 0;
	}

그림2

출력결과는 그림2처럼 출력된다. char변수로 'A'를 받았는데 서식문자가 %d냐, %c냐에 따라 결과값이 완전 달라지는 것을 볼 수 있다.

A를 정수형으로 출력하면 A의 아스키코드 값인 65가 출력되고

A를 문자형으로 출력하면 A가 그대로 출력된다

 

A를 정수형에서 +1을 하면 아스키코드 값 65+1인 66이 출력되고

A를 문자형에서 +1을 하면 아스키코드 값 66인 문자 B가 출력 된다

 


4. scanf()

scanf()는 변수를 입력받을 수 있도록 해주는 함수이다.

scanf()도 printf()와 마찬가지로 #include<stdio.h>가 있어야 쓸 수 있다. 

 

3을 입력받았다고 할 때 아래의 출력결과는 뭘까?

#include<stdio.h>     
	int main() {
		int a;
		scanf("%d", &a);
		printf("%d", a);
		return 0;
	}

출력결과는 3이다

scanf("%d",&a); 에서

&는  앰퍼샌드(ampersand)라고 읽으며 주소연산자라고도 한다

&a이라고 하면 변수a의 주소를 가리킨다

 

왜 그냥 a가 아니라 &a를 쓸까?

임시공간에 저장됐다가 임시공간에 있는 값을 변수의 주소에 저장하고 그 임시공간을 삭제하므로 변수의 주소가 필요한 것이다.

(이해가 안되면 그냥 넘어가고 scanf가 숫자를 입력받는 함수라는 것만 알고가면 된다)

출처 : [C언어] scanf()함수에서 &(ampersand)를 쓰는 이유 (tistory.com)


5. 사칙연산과 증감연산자

사칙연산 순은 수학에서 배운 것과 동일하다

곱하기(*)와 나누기(/)가 먼저고 그다음이 더하기(+), 빼기(-)이다

여기서 추가로 나머지(%)연산자가 있는데 곱하기, 나누기 우선순위와 동일하다

 

9%2하면 나머지는 1이므로 1이 나온다

 

증감연산자라는 것이 있다. ++a, a++ 이런식으로 표현하는데 -도 동일한 방식이다

증감연산자는 곱하기, 나누기, 나머지보다 먼저 연산된다.

 

다음 출력결과를 맞춰보자

#include<stdio.h>     
	int main() {
		int a = 10;
		int b = 15;
		int c = a++ + --b;
		int d = ++a + b--;
        

		printf("%d\n",a); 
		printf("%d\n", b);  
		printf("%d\n", c); 
		printf("%d", d); 
		return 0;
	}
더보기

12

13

24

26

 

처음보면 살짝 머리터질 수 있는 부분인데

++a는 전치연산이고

a++은 후치연산이다

 

전치연산은 앞에 붙어있어서 바로 계산되고

후치연산은 뒤에 붙어있어서 그 다음 라인부터 계산된다

 

c=a(후치연산)+b(전치연산)=10+14=24

a가 후치연산이라 c에는 a가 10으로 계산되지만

변수c에 값이 저장되는 그 다음부터 바로 a가 11이 된다.

 

d=a(전치연산)+b(후치 연산)=12+14=26

a는 전치연산이라 바로 11에서 1이 더해진 값이 d에 들어가고

b는 후치연산이라 14에서 1만큼 빼진 값이 아니라 그냥 그대로 14가 된다

 

시험에 낚시문제로 많이 출제되니 무조건 이해하고 넘어가자


6. 비트연산자

비트연산자 관련문제는 한번도 출제된 적이 없긴 한데 그래도 쉬우니 보고 넘어가자.

우리가 평소에 사용하는 숫자는 10진수이고 컴퓨터에서는 2진수를 사용한다

2진수는 0과 1로 이루어져있다.

 

3을 2진수로 바꾸면 11이다

2진수를 10진수로 바꾸는 방법은 크게 2가지인데 2번째 방법을 많이 사용한다.

 

일단 빈 백지에 128 64 32 16 8 4 2 1 이렇게 숫자를 적는다.

예를 들어 20을 이진수로 바꿔야한다면 위에 있는 숫자로 20을 만들어야한다

20을 만들려면 16+4면 된다

128 64 32 16 8 4 2 1
0 0 0 1 0 1 0 0

16과 4를 제외한 나머지에는 다 0을 대입해준다.

20의 이진수는 10100이 된다

 

비트연산자에 &, ^ , | 부터 알아본다.

&는 둘다 1일 때만 1반환

^는 두개가 1개는 1, 나머지는 0이어야만 1반환

|는 둘중 1개만 1일 때도 1반환

 

3 & 2 라고 한다면 먼저 3과 2를 이진수로 바꾼다 11과 10이다

11

10

이렇게 봤을 때 둘다 1인 위치만 1이고 나머지는 0이 된다

3 & 2라고 한다면 10으로 2가 된다

3^2라고 한다면 01로 1이 된다

3|2라고 한다면 11로 3이 된다

 

다음은 >>, << 연산자이다

이건 자세한 건 생략하고 푸는 방법만 알려주도록 하겠다.

비트를 이동시키는 연산자인데 

8<<2 라고 하면 8에서 2의 제곱만큼 곱해주면된다

8*4이므로 32가된다

 

8>>2 라고 하면 8에서 2의 제곱만큼 나눠주면 된다

8/4이므로 2가 된다

 

>>1이면 2의 1제곱

>>3이면 2의 3제곱

으로 계산하면 된다

 

[정보처리기사/예상문제] - 2024 정보처리기사 실기 예상 문제 모음

C언어 기출문제 모음

비전공자용 C언어 요약 1탄

비전공자용 C언어 요약 2탄(조건문, 반복문, 배열)

비전공자용 C언어 요약 3탄(함수, 포인터)

비전공자용 C언어 요약 4탄(포인터 심화, 구조체)

728x90
LIST
728x90
SMALL

[정보처리기사/예상문제] - 2024 정보처리기사 실기 예상 문제 모음

 

1. 인터넷에서 멀티캐스트를 위하여 사용되는 프로토콜

더보기

IGMP


2. 원격 컴퓨터에 안전하게 액세스하기 위한 유닉스 기반의 명령 인터페이스 및 프로토콜로, 기본적으로 22번 포트를 사용하고, 클라이언트/서버 연결의 양단은 전자 서명을 사용하여 인증되며, 패스워드는 암호화하여 보호되는 것

더보기

SSH

 

SSH는 Secure Shell의 약자


3. TLS를 통해 Application 계층 데이터를 암호화하여 보호해 주고 기본포트가 443으로 지정된 프로토콜

더보기

HTTPS


4. 물리적 하드웨어 주소를 IP Address로 매핑시키는 프로토콜

더보기

RARP


5. UDP 계열 프로토콜로, 원격 관리에 필요한 정보와 서버상태를 관리하는 것

더보기

SNMP


6. 동적 라우팅 프로토콜 중에 링크 상태(Link State) 라우팅 프로토콜

더보기

OSPF (Open Shortest Path First)


7. 연결 없는 IP 기반의 프로토콜로 최소한의 오버헤드를 갖고 재송신 처리를 실행하지 못하기 때문에 신뢰성이 떨어지며 한 번에 많은 양의 데이터를 송신할 때 사용하는 프로토콜


8.  RAID 시스템 중 한 드라이브에 기록되는 모든 데이터를 다른 드라이브에 복사해 놓는 방법으로 복구 능력을 제공하며, ′Mirroring′으로 불리는 것

더보기

RAID 1


9. 내부 통신에는 사설 IP 주소를 사용하고 외부와의 통신에는 공인 IP 주소를 사용할 수 있도록 하는 기술


10. 하이퍼바이저를 사용하거나 게스트 운영체제도 설치하지 않고 서버 운영에 필요한 프로그램과 라이브러리만 이미지로 만들어 프로세스처럼 동작시키는 경량화된 가상화 방식이며 실행되는 이미지는 컨테이너라고 부르며, 가상화 레이어가 존재하지 않고 운영체제도 존재하지 않기 때문에 파일 시스템,네트워크 속도가 상당히 빠르다

설명에 해당하는 용어

더보기

Docker 


11. 네트워킹에 필요한 모든 유형의 자원을 추상화하고, 소프트웨어 기반이며 자동으로 관리와 제어가 가능케 하는 가상화 기술

더보기

NFV (Network Functions Virtualization)


12. 한 대의 스위치에서 네트워크를 나누어 마치 여러 대의 스위치처럼 사용할 수 있게 하고, 하나의 포트에 여러 개의 네트워크 정보를 전송할 수 있게 해주는 기능

더보기

가상 랜(Virtual LAN)


13. 링크 상태 알고리즘을 적용한 대표적인 프로토콜로, 링크에서의 전송 시간을 링크 비용(거리)으로 사용하며 각 목적지 별 최단 경로를 다익스트라 알고리즘을 통해 알아내는 프로토콜

더보기

OSPF


14. 패킷 전송의 최적 경로를 위해 다른 라우터들로부터 정보를 수집하는데, 최대 홉이 15를 넘지 못하는 프로토콜


15. OSI 7 layer 참조 모델에서 사용되는 Protocols 중 TCP와 UDP port를 함께 사용하는 프로토콜


16. VPN의 터널링 프로토콜로 OSI 7계층 중 3계층 프로토콜로서 전송 모드와 터널 모드 2가지를 사용한다. 전송 모드는 IP 페이로드를 암호화하여 IP 헤더로 캡슐화하지만, 터널 모드는 IP 패킷을 모두 암호화하여 인터넷으로 전송한다

해당하는 용어

더보기

IPSec


17. Link State 알고리즘을 이용해 서로에게 자신의 현재 상태를 알려주며 네트워크 내 통신을 위해 사용하는 프로토콜

더보기

OSPF


18. TCP/IP 프로토콜 중에서 IP 계층의 한 부분으로 에러 메시지와 같은 상태 정보를 알려주는 프로토콜

더보기

ICMP(Internet Control Message Protocol)


19. 단말이 네트워크에 접근하기 전 보안정책 준수여부를 검사하고 IP 및 MAC address의 인가 여부를 검사하여 네트워크 자원의 이용을 허용하는 방식


20. 서로 연결된 네트워크에서 사용자간 파일을 전송할 수 있도록 해주는 기능을 제공하며, 파일 전송시 2개의 포트를 연결하여 데이터를 전송한다. 이 때 20포트는 데이터 전송을 담당하고 21포트는 제어를 담당하는 프로토콜

더보기

FTP(File Transfer Protocol)


21. 다음은 잘 알려진 포트번호이다. 해당하는 용어를 쓰시오.

포트  이름
21
22
23
25
53
80
110
143
194
443
더보기

ㄱ : FTP

ㄴ : SSH(원격 제어, 보안 기능)

ㄷ : telnet(원격 제어)

ㄹ : SMTP(이메일 전송)

ㅁ : DNS

ㅂ : HTTP(웹)

ㅅ : POP3(이메일 수신)

ㅇ : IMAP(이메인 수신, 보관 기능

ㅈ : IRC

ㅊ:  HTTPS

 

 

[정보처리기사/예상문제] - 2024 정보처리기사 실기 예상 문제 모음

728x90
LIST
728x90
SMALL

 2024 정보처리기사 실기 예상 문제 모음

 

1. 소프트 웨어 테스트에서 오류의 80%는 전체 모듈의 20% 내에서 발견된다는 법칙을 쓰시오.

더보기

Pareto의 법칙


2. 하향식 통합에 있어서 모듈 간의 통합 시험을 위해 일시적으로 필요한 조건만을 가지고 임시로 제공되는 시험용 모듈을 무엇이라고 하는지 쓰시오.

더보기

Stub


3. 테스트의 결과가 참인지 거짓인지를 판단하기 위해서 사전에 정의된 참값을 입력하여 비교하는 기법 및 활동으로 종류에는 참, 샘플링, 휴리스틱, 일관성 검사가 존재하는 용어를 쓰시오.

더보기

테스트 오라클


4. 아래는 목적에 따른 테스트 기법이다. 뒤에 TEST는 생략하고 답을 영어로 적으시오

ㄱ. 시스템에 여러 가지 결함을 주어 실패하도록 한 후 올바르게 복구되는지를 확인하는 테스트
ㄴ. 시스템에 설치된 시스템 보호 도구가 불법적인 침입으로부터 시스템을 보호할 수 있는지를 확인하는 테스트
ㄷ. 스스템에 과도한 정보량이나 빈도 등을 부과하여 과부하 시에도 소프트웨어가 정상적으로 실행되는지를 확인하는 테스트
ㄹ. 소프트웨어의 실시간 성능이나 전체적인 효율성을 진단하는 테스트로, 소프트웨어의 응답 시간, 처리량 등을 테스트
ㅁ. 소프트웨어 내부의 논리적인 경로, 소스 코드의 복잡도 등을 평가하는 테스트
ㅂ. 소프트웨어의 변경 또는 수정된 코드에 새로운 결함이 없음을 확인하는 테스트
ㅅ. 변경된 소프트웨어와 기존 소프트웨어에 동일한 데이터를 입력하여 결과를 비교하는 테스트
더보기

ㄱ: Recovery(회복)
ㄴ: Security(안전)
ㄷ: Stress(강도)
ㄹ: Performance(성능)
ㅁ: Structure(구조)
ㅂ: Regression(회귀)
ㅅ: Parallel(병행)


5. 다음에 해당하는 테스트를 영어로 쓰시오 뒤에 TEST는 생략하고 답을 영어로 적으시오

ㄱ. 프로그램을 실행하여 오류를 찾는 테스트
ㄴ. 프로그램을 실행하지 않고 명세서나 소스 코드를 대상으로 분석하는 테스트
더보기

ㄱ: Dynamic(동적)
ㄴ: Static(정적)


6. 해당하는 테스트를 영어로 쓰시오.(뒤에 test는 생략)

ㄱ. 개발자의 시각에서 제품의 생산 과정을 테스트 하는 것
ㄴ. 사용자의 시각에서 생산된 제품의 결과를 테스트 하는 것
더보기

ㄱ : Verification(검증)
ㄴ:  Validation(확인)


7. 모듈의 원시 코드를 오픈시킨 상태에서 원시 코드의 논리적인 모든 경로를 테스트하여 테스트 케이스를 설하는 방법으로 코드 기반 테스트라고도 하는 것을 쓰시오.

더보기

화이트박스 테스트(White Box Test)


8. 소프트웨어가 수행할 특정 기능을 알기 위해서 각 기능이 완전히 작동되는 것을 입증하는 테스트로 프로그램 내부의 구조나 알고리즘을 보지 않고 요구 분석 명세서나 설계 사양서에 테스트 케이스를 추출하여 테스트하는 것을 쓰시오.

더보기

블랙박스 테스트(Black Box Test)


9. 테스트에 대한 다음 설명에서 각 지문에 해당하는 커버리지를 <보기>에서 찾아 기호로 쓰시오

1. 최소 한번은 모든 문장이 수행되도록 구성하는 검증 기준
2. 조건식이 참/거짓일 때 수행되도록 구성하는 검증 기준
3. 2번과 달리 조건식에 상관없이 개별 조건이 참/거짓일 때 수행되도록 구성하는 검증 기준

 

<보기>
ㄱ. multiple Coverage
ㄴ. Choice Coverage
ㄷ. Condition Coverage
ㄹ. Branch Coverage
ㅁ. Branch/ Condition Coverage
ㅂ. Statement Coverage
더보기

1 : ㅂ

2 : ㄹ

3 : ㄷ

 

statement coverage : 문장 검증 기준

branch coverage : 분기 검증 기준

condition coverage :조건 검증 기준

branch/Condition coverage : 분기/조건 기준


10. 다음 중 화이트 박스 테스트 기법에 해당하는 것을 모두 골라 기호로 쓰시오

<보기>
ㄱ. Base Path Testing
ㄴ. Condition Testing
ㄷ. Boundary Value Analysis
ㄹ. Equivalence Paritioning
ㅁ. Data Flow Testing
ㅂ. Cause-Effect Graph
ㅅ. Branch Coverage Testing
ㅇ. Statement coverage Testing
ㅈ. Boundary Division Analysis
더보기

ㄱ, ㄴ, ㅁ, ㅅ,ㅇ


11. 메케이브(McCabe)가 만든 것으로 테스트 케이스 설계자가 절차적 설계의 논리적 복잡성을 측정할 수 있게 해주는 테스트 기법을 영어로 쓰시오

더보기

Base path Testing(기초 경로 검사)


12. 프로그램의 입력 조건에 타당한 입력 자료와 타당하지 않은 입력 자료의 개수를 균등하게 하여 테스트 케이스
를 정하고, 해당 입력 자료에 맞는 결과가 출력되는지 확인하는 기법을 영어로 쓰시오

더보기

Equivalence Partitioning Testing(동치 분할 검사) 또는 동등 분할 기법


13. 입력 조건의 중간값보다 경계값에서 오류가 발생 될 확률이 높다는 점을 이용하여 입력 조건의 경계값을 테스트 케이스로 선정하여 검사하는 기법을 영어로 쓰시오.

더보기

Boundary Value Analysis(경계값 분석)


14. 코딩 직후 소프트웨어 설계의 최소 단위인 모듈이나 컴포넌트에 초점을 맞춰 테스트로 모듈 테스트라고도 하며 모듈 내부의 구조를 구체적으로 들여다볼 수 있는 화이트박스 테스트 같은 구조 기반 테스트를 주로 시행하는 테스트를 영어로 쓰시오.

더보기

Unit Test(단위 테스트)


15. 14번에서 하나의 모듈을 테스트할 때 상위나 하위 모듈이 개발이 안된 경우도 있다. 이 때 상위나 하위 모듈이 개발될 때까지 기다릴 수 없으므로 가상의 상위나 하위 모듈을 만들어 사용해야 하는데 가상 상위 모듈을 (가)라 하고 가상 하위 모듈을 (나)라고 한다. (가), (나)에 해당하는 것을 쓰시오. 

더보기

(가) : 테스트 드라이버(Driver)

(나) : 테스트 스텁(Stub)


16.   단위테스트가 끝난 모듈을 통합하는 과정에서 발생하는 오류 및 결함을 찾는 테스트 기법을 영어로 쓰시오

더보기

Integration Test(통합 테스트)


17.  프로그램의 상위 모듈에서 하위 모듈 방향으로 통합하면서 테스트하는 기법을 영어로 쓰시오.

더보기

Top Down Integration Test(하향식 통합 테스트)


18. 프로그램의 하위 모듈에서 상위 모듈 방향으로 통합하면서 테스트하는 기법을 영어로 쓰시오.

더보기

Bottom Up Integration Test(상향식 통합 테스트)

 


19. 하향식 통합 테스트에서는 아래 그림과 같을 때 맨 상위 모듈 A를 모듈 B와 통합하여 테스트하고 그 다음으로 모듈 C를 먼저 할지 E를 먼저할 지 결정해야 하는데 C를 먼저 선택하는 방식을 (가)이라 하고 모듈 E를 먼저 선택하는 방식을 (나)라 한다. (가), (나)에 들어갈 것을 쓰시오. 

더보기

(가) : 넓이 우선(Breadth first) 방식

(나) : 깊이 우선(Depth first) 방식


20. 개발한 소프트웨어가 사용자의 요구사항을 충족하는지에 중점을 두고 테스트하는 방법을 영어로 쓰시오.

더보기

Acceptance Test(인수 테스트)


21. 테스트 결과가 올바른지 판단하기 위해 사전에 정의된 참 값을 대입하여 비교하는 기법을 테스트 오라클이라고 한다. 다음은 테스트 오라클의 종류인데 설명에 해당하는 것을 영어로 쓰시오.

ㄱ : 모든 테스트 케이스의 입력값에 대해 기대하는 결과를 제공하는 오라클
ㄴ : 특정한 몇몇 테스트 케이스의 입력값들에 대해서만 기대하는 결과를 제공하는 오라클
ㄷ : 특정 테스트 케이스의 입력값에 대해 기대하는 결과를 제공하고 나머지 입력값들 에 대해서는 추정으로 처리하는 오라클 
ㄹ : 애플리케이션에 변경이 있을 때, 테스트 케이스의 수행 전과 후의 결과 값이 동일한지를 확인하는 오라클
더보기

ㄱ : True Oracle(참 오라클)

ㄴ : Sampling Oracle (샘플링 오라클)

ㄷ : Heuristic Oracle(추정 오라클)

ㄹ : Consistent ORacle(일관성 오라클)


22. 테스트가 실행될 환경을 시뮬레이션 하여 컴포넌트 및 모듈이 정상적으로 테스트 되도록 하는 도구를 테스트 하네스라고 한다. 다음은 테스트 하네스의 구성요소중 하나와 테스트 단계에서 사용되는 개념이다. 해당하는 것을 쓰시오.

ㄱ : 테스트 대상 컴포넌트나 모듈, 시스템에 사용되는 테스트 케이스의 집합
ㄴ : 테스트 케이스를 적용하는 순서에 따라 여러 개의 테스트케이스를 묶은 집합
더보기

ㄱ : Test Suites(테스트 슈트)

ㄴ : Test Scenario(테스트 시나리오) 

 

테스트 슈트가 단순한 묶음이라면 테스트 시나리오는 테스트 케이스의 동작 순서에 따른 묶음이다

 

 2024 정보처리기사 실기 예상 문제 모음

728x90
LIST
728x90
SMALL

 2024 정보처리기사 실기 예상 문제 모음

21년 3회차 이후에 나온적이 없는 유형이긴 하나 오랜만에 다시 출제될 수 도 있으므로 정리합니다

 

◈모듈 설계
요구 분석을 마치면 구조적 방법에서는 DFD, 정보공학 방법에서는 ERD, 객체지향 방법에서는 유스케이스 다이어그램이 산출되고 이런 다이어그램이 중심이 된 요구 명세서가 작성된다. 

그러면 설계 단계에서는 맨 먼저 전체 구조를 파악하여 표현하는 상위 설계 또는 아키텍처 설계를 한 후 하위 설계로 모듈 설계를 한다.

 

▶모듈화
어떤 큰 문제를 그대로 놓고 해결하는 것은 매우 어려운 일이므로 일반적으로 큰 문제를 작은 단위로 쪼개어 그것을 하나씩 해결한다. 

소프트웨어 개발에서도 소프트웨어의 성능을 향상시키거나 시스템의 수정 및 재사용, 유지 관리 등을 위해 시스템의 기능들을 모듈 단위로 분해하는데 이를 모듈화라고 한다. 

 

▶모듈의 독립성
모듈이 다른 모듈과의 과도한 상호작용을 배제하고 하나의 기능만을 수행함으로써 이루어져야한다. 모듈 간에 연관성이 높으면 관련된 모듈을 사용하기 위해 많은 지식이 필요하고 종속적인 관계로 복잡하게 연결되어 유지보수가 매우 어려워지므로 모듈을 분할하여 설계할 때 모듈 간의 관련성이 적게 설계하여 모듈 변경 시 다른 모듈에 영향을 최소화하고 유지보수를 쉽게 할 수 있도록 해야한다. 

이런 독립성을 측정하는 개념이 바로 응집도와 결합도인데 독립성을 높이려면 모듈의 결합도는 약하게, 응집도는 강하게, 모듈의 크기는 작게 만들어야 한다.

 

1. 모듈 간의 상호 의존하는 정도 또는 두 모듈 사이의 연관 관계를 영어로 쓰시오.

더보기

결합도(Coupling)

 

합도는 용돈을 주고받는 부모-자식 관계를 생각하면 쉽게 이해할 수 있다. 자식 입장에서는 용돈을 어디에 쓸 건지 꼬치꼬치 물어보는 부모(=결합도가 강함)보다 그냥 군말 없이 주는 부모(=결합도가 약함)가 좋을 것이다. 따라서 모듈에서 좋은 관계는 깊게 관여하지 않고 데이터(용돈)만 주고받는 관계이다


2. 모듈의 내부 요소들이 서로 관련되어 있는 정도를 영어로 쓰시오.

더보기

응집도(Cohesion)

 

응집도가 강할수록 품질이 높고, 약할수록 품질이 낮다. 응집도는 책 정리를 예로 들 수 있다. 책을 주제에 따라 분류한 것은 응집도가 강하다고 할 수 있고 책을 무지성으로 분류한 것은 응집도가 약하다고 할 수 있다


3. 결합도와 응집도를 각각 강한 순서대로 나열하시오

더보기

내용 결합도-공통 결합도-외부 결합도-제어 결합도- 스탬프 결합도-자료 결합도

(내공외제스자)

 

기능적 응집도-순차적 응집도-교환적 응집도-절차적 응집도-시간적 응집도-논리적 응집도-우연적 응집도

(기순교절시논우)


4. 다음은 결합도에 대한 설명이다. 해당하는 것을 영어로 쓰시오.

ㄱ : 모듈 간의 인터페이스가 자료 요소로만 구성될 때의 결합도
ㄴ : 모듈 간의 인터페이스로 배열이나 레코드 등의 자료구조가 전달될 때의 결합도
ㄷ : 어떤 모듈이 다른 모듈 내부의 논리적인 흐름을 제어하기 위해 제어 신호나 제어 요소를 전달하는 결합도
ㄹ : 어떤 모듈에서 선언한 데이터(변수)를 외부의 다른 모듈에서 참조할 때의 결합도
ㅁ : 공유되는 공통 데이터 영역을 여러 모듈이 사용할 때의 결합도
ㅂ : 한 모듈이 다른 모듈의 내부 기능 및 그 내부 자료를 직접 참조하거나 수정할 때의 결합도
더보기

ㄱ : Data Coupling

ㄴ : Stamp Coupling

ㄷ : Control Coupling

ㄹ : External Coupling

ㅁ : Common Coupling

ㅂ : Content Coupling

 


5. 다음은 응집도에 대한 설명이다. 해당하는 것을 영어로 쓰시오. 

ㄱ : 모듈 내부의 각 구성 요소들이 서로 관련 없는 요소로만 구성된 경우의 응집도
ㄴ : 유사한 성격을 갖거나 특정 형태로 분류되는 처리 요소들로 하나의 모듈이 형성되는 경우의 응집도
ㄷ : 특정 시간에 처리되는 몇 개의 기능을 모아 하나의 모듈로 작성할 경우의 응집도
ㄹ : 모듈이 다수의 관련 기능을 가질 때 모듈 안의 구성 요소들이 그 기능을 순차적으로 수행할 경우의 응집도
ㅁ : 동일한 입력과 출력을 사용하여 서로 다른 기능을 수행하는 구성 요소들이 모였을 경우의 응집도
ㅂ : 모듈 내 하나의 활동으로부터 나온 출력 데이터를 그다음 활동의 입력 데이터로 사용할 경우의 응집도
ㅅ : 모듈 내부의 모든 기능 요소들이 단일 문제와 연관되어 수행될 경우의 응집도
더보기

ㄱ : Coincidental Cohesion

ㄴ : Logical Cohesion

ㄷ : Temporal Cohesion

ㄹ : Procedural Cohesion

ㅁ : Communication Cohesion

ㅂ : Sequential Cohesion

ㅅ : Functional Cohesion

 

 

 2024 정보처리기사 실기 예상 문제 모음

728x90
LIST
728x90
SMALL

 2024 정보처리기사 실기 예상 문제 모음

예상문제뿐 아니라 확실히 알고가야하는 개념을 확인하는 용으로 만든 문제도 같이 수록했습니다.

 

1. 다음은 DBMS의 등장배경으로 파일 시스템이 갖는 (가), (나) 문제점을 해결하기 위해 제안되었다. (가), (나)는 무엇인지 영어로 쓰시오.

(가) : 프로그램의 구조가 데이터의 구조에 영향을 받는 것을 의미하는데 데이터의 구조가 프로그램의 데이터 저장방식을 결정하고 반대로 프로그램의 데이터 저장방식에 따라 데이터의 저장방식이 바뀌는 것을 말한다.  데이터의 구조가 변경되면 프로그램까지 같이 바뀌는 비용이 들기 때문에 프로그램 가발과 유지보수가 어려워진다
(나) : 파일 시스템은 프로그램마다 (가) 등으로 인해 공유가 안되는 경우가 많아서 프로그램마다 같은 정보를 중복해서 저장하는 경우가 많다. 이는 저장공간의 낭비이기도 하지만 데이터를 관리하는 측면에서 같은 정보를 여러 곳에서 보관하면 수정 시에 모든 데이터를 수정해야 하는 문제가 발생한다.
더보기

(가) : Data Dependency(데이터 종속성)

(나) : Data Redundancy(데이터 중복성)


2. 다음은 DBMS의 필수 기능 3가지에 대한 설명이다. 해당하는 것을 영어로 쓰시오.

ㄱ : 데이터의 형(Type)과 구조에 대한 정의, 이용 방식, 제약조건 등을 명시
ㄴ : 데이터 검색, 갱신, 삽입, 삭제 등을 위한 인터페이스 수단 제공
ㄷ :  데이터의 무결성, 보안, 권한 검사, 병행 제어를 제공하는 기능
더보기

ㄱ: Definition(정의)

ㄴ : Manipulation(조작)

ㄷ: Control(제어)


3. 다음은 스키마의 종류이다. 해당하는 설명의 스키마를 작성하시오.

ㄱ. 모든 응용 시스템들이나 사용자들 필요로 하는 데이터를 통합한 조직 전체의 데이터베이스를 기술한 것
ㄴ. 저장 장치(storage) 입장에서 데이터베이스 전체가 저장되는 방법을 명세한 것
ㄷ. 데이터베이스의 개개 사용자나 응용 프로그래머가 접근하는 데이터베이스를 정의한 것
더보기

ㄱ : 개념 스키마(conceptual schema)

ㄴ : 내부 스키마(internal schema)

ㄷ : 외부 스키마(external schema)

 

순서는 외부 스키마->개념 스키마->내부 스키마


4. 데이터베이스를 3단계 구조로 나누고 단계별로 스키마를 유지하며 스키마 사이의 대응 관계를 정의하는 궁극적인 목적은 (가)를 실현하기 위해서이다. (가)가 무엇인지 쓰시오.

더보기

데이터 독립성(Data Independence)

 

데이터 독립성은 논리적 독립성, 물리적 독립성으로 나눠진다


5. 데이터베이스에 저장되는 데이터에 관한 정보를 저장하는 곳을 데이터 사전(data dictionary)라고 하는데 다른 말로 뭐라고 하는지 쓰시오.

더보기

메타 데이터(meta data)

또는

시스템 카탈로그(system catalog)


6. 데이터베이스 설계에 대한 다음 설명에서 괄호에 들어갈 알맞은 답을 쓰시오(21년 1회 실기 기출문제)

(1) : 논리적 구조로 표현된 데이터를 디스크 등의 저장장치에 저장할 수 있는 데이터로 변환하는 과정으로, 파일의 저장 구조 및 액세스 경로를 결정하며, 테이블 정의서 및 명세서가 산출된다
(2) : 현실 세계에 대한 인식을 추상적 개념으로 표현하는 과정으로, 개념 스키마 모델링과 트랜잭션 모델링을 수행하며, 요구 조건 명세를 E-R 다이어그램으로 작성한다
(3) : 현실의 자료를 특정 DBMS가 지원하는 자료구조로 변환하는 과정으로, 트랜잭션의 인터페이스를 설계하고, 정규화를 통해 스키마를 평가 및 정제한다
더보기

(1) : 물리적 설계

(2) : 개념적 설계

(3) : 논리적 설계


7.데이터 모델의 표시 요소에 대한 다음 설명에 해당하는 것을 영어로 쓰시오.

가 :  데이터베이스에 저장된 실제 데이터를 처리하는 작업에 대한 명세로서 데이터베이스를 조작하는 기본 도구에 해당한다
나 :  논리적으로 표현된 객체 타입들 간의 관계로서 데이터 구성 및 정적 성질을 표현한다
다 :  데이터베이스에 저장될 수 있는 실제 데이터의 논리적인 제약 조건을 의미한다
더보기

가 : Operation(연산)

나 : Structure(구조)

다 : Constraint(제약조건)


8. 데이터 모델 구성요소 3가지를 영어로 쓰시오. 

더보기

Entity, attribute, relationship

개체, 속성, 관계


9. 개체와 개체가 맞는 의미 있는 연관성을 관계라고 한다. 다음은 관계의 종류에 대한 설명이다. 해당하는 관계를 영어로 쓰시오.

ㄱ : 두 개체 사이의 주·종 관계를 표현한 것
ㄴ : 두 개체 사이에 2번 이상의 종속 관계가 발생하는 관계
ㄷ : 개체가 자기 자신과 관계를 갖는 것
ㄹ : 개체의 속성이나 구분자를 기준으로 개체의 특성을 분할하는 관계
더보기

ㄱ : Dependent Relationship(종속 관계)

ㄴ : Redundant Relationship(중복 관계)

ㄷ : Recursive Relationship(재귀 관계)

ㄹ : Exclusive Relationship(배타 관계)


10. 다음 해당하는 빈칸을 영어로 쓰시오.

개체 B가 독자적으로 존재할 수 없고 다른 개체 A의 존재 여부에 의존적이라면, 개체 B가 개체 A에 종속되어 있다고 한다.
이는 개체 A가 존재해야 B가 존재할 수 있고 A가 삭제되면 개체 B도 함께 삭제되어야 함을 의미한다. 
이러한 종속을 특별히 (가)라 한다. 이때 다른 개체의 존재 여부에 의존적인 개체 B를 (나)라 하고 다른 개체의 존재 여부를 결정하는 개체 A를 (다)라 한다
이때 (나)를 구별하는 역할을 하는 속성을 (라)라고 한다. 
더보기

가 : 존재 종속(Existence dependence)

나 : 약한 개체(weak entity)

다 : 오너 개체(owner entity)

라 : 구별자(delimiter) 또는 부분키(Partial key)


11. 피터 첸(Peter Chen)이 1976년에 제안한 것으로 현실 세계를 개체(entity)와 개체 간의 관계(relationship)를 이용해 개념적 구조로 표현하는 방법을 E-R모델이라고 하며 E-R모델을 이용해 개념적 모델링하여 그림으로 표현한 것을 E-R 다이어그램이라고 한다. 다음은 E-R다이어그램에서 사용되는 기호이다. 해당하는 기호가 무엇을 의미하는지 쓰시오.


12. 2차원적인 표를 이용해서 데이터 상호 관계를 정의하는 데이터베이스를 관계형 데이터베이스라고 한다. 다음은 관계형 데이터베이스의 기본 용어이다. 해당하는 것을 영어로 쓰시오.

ㄱ : 데이터들을 표 형태로 표현한 것
ㄴ:  릴레이션의 열=파일에서 필드(field)에 대응하는 개념
ㄷ : 속성의 수
ㄹ : 릴레이션의 행=파일에서 레코드(record)에 대응하는 개념
ㅁ : 튜플의 수
ㅂ : 속성 하나가 가질 수 있는 모든 값의 집합
더보기

ㄱ : Relation(릴레이션)

ㄴ : Attribute(속성)

ㄷ : Degree(차수)

ㄹ : Tuple(튜플)

ㅁ : Cardinality(카디널리티)

ㅂ : Domain(도메인)


13. 데이터베이스에서 조건에 만족하는 튜플을 찾거나 순서대로 정렬핼 때 기준이 되는 속성을 키라고 한다. 설명이 어떤 키에 해당하는지 쓰시오.

ㄱ :  릴레이션을 구성하는 속성들 중에서 튜플을 유일하게 식별하기 위해 사용되는 속성들의 부분집합
ㄴ : 후보키 중에서 특별히 선정된 주 키(Main Key)
ㄷ :  후보키가 둘 이상일 때 기본키를 제외한 나머지 후보키, 보조키라고도 함
ㄹ : 한 릴레이션 내에 있는 속성들의 집합으로 구성된 키
ㅁ : 다른 릴레이션의 기본키를 참조하는 속성 또는 속성들의 집합
더보기

ㄱ : Candidate Key(후보키)

ㄴ : Primary Key(기본키)

ㄷ : Alternate Key(대체키)

ㄹ : Super Key(슈퍼키)

ㅁ : Foreign Key(외래 키)


14. 데이터베이스에 저장된 데이터 값과 그것이 표현하는 현실 세계의 실제값이 일치하는 정확성을 무결성(Integrity)라고 한다. 다음은 무결성 제약조건의 일부인데 빈칸에 들어갈 말을 쓰시오.

개체 무결성 (가)를 구성하는 모든 속성은 널 값을 가질 수 없다
참조 무결성 (나)는 참조할 수 없는 값을 가질 수 없다
더보기

(가) : 기본키

(나) : 외래키


15. 연산은 원하는 데이터를 얻기 위해 릴레이션에 필요한 처리 요구를 수행하는 것으로 대표적으로 (가)와 (나)가 있다. 해당하는 것을 쓰시오.

(가) : 원하는 결과를 얻기 위해 데이터의 처리 과정을 순서대로 기술(절차 언어)
(나) : 원하는 결과를 얻기 위해 처리를 원하는 데이터가 무엇인지만 기술(비절차 언어)
더보기

(가) : 관계 대수 

(나) : 관계 해석

 

관계 대수와 관계 해석은 상용화된 관계 데이터베이스에서는 실제로 사용되지 않는 개념적 언어다. 하지만 새
로운 데이터 언어가 제안되면 해당 데이터 언어의 유용성을 검증해야 하는데 검증의 기준 역할을 하는 것이 
관계 대수와 관계 해석이다.


16. 아래 릴레이션에서 등급 속성을 𝝅한 결과 릴레이션을 나타내시오. 

(머릿속으로 생각해보고 답을 확인하세요)


17. 아래 릴레이션에서 등급 속성이 골드인 튜플을 σ한 결과 릴레이션을 나타내시오. 

(머릿속으로 생각해보고 답을 확인하세요)


18. 아래 2개의 릴레이션을 ⋈한 결과 릴레이션을 나타내시오. 

(머릿속으로 생각해보고 답을 확인하세요)


19. 아래 주문내역 릴레이션을 제품1, 제품2와 각각 ÷한 결과 릴레이션을 나타내시오.

(머릿속으로 생각해보고 답을 확인하세요)


20. 두 릴레이션을 각각 R∪S, R∩S, R-S했을 때 결과 릴레이션을 나타내시오

(머릿속으로 생각해보고 답을 확인하세요)


21. 데이터베이스를 잘못 설계하면 불필요한 데이터 중복이 발생하여 데이터의 삽입·수정·삭제 연산을 수행할 때 부작용들이 발생할 수 있다. 이러한 부작용을 이상(anomaly) 현상이라 한다. 이상 현상을 제거하면서 데이터 베이스를 올바르게 설계해 나가는 과정이 정규화이다. 이상 현상의 3가지 종류를 모두 말하고 그 이상현상이 뭔지 설명하시오.

더보기

삽입이상(Insertion Anomaly)-새 데이터를 삽입하기 위해 불필요한 데이터도 함께 삽입해야 하는 문제

갱신 이상(Update Anomaly)-중복 튜플 중 일부만 변경하여 데이터가 불일치하게 되는 모순의 문제

삭제 이상(Deletion Anomaly)-튜플을 삭제하면 꼭 필요한 데이터까지 함께 삭제되는 데이터 손실의 문제


22. 하나의 릴레이션을 구성하는 속성들의 부분집합을 X와 Y라 할 때, 어느 시점에서든 릴레이션 내의 모든 튜플
을 대상으로 한 X 값에 대한 Y 값이 항상 하나면 "X가 Y를 함수적으로 결정한다" 또는 "Y가 X에 함수적으로 
종속되어 있다"고 한다. 함수 종속 관계는 X → Y로 표현하고 X를 (가), Y를 (나)라고 한다.

(가), (나)에 들어갈 말을 영어로 쓰시오.

더보기

(가 ) : Determinant(결정자)

(나 ) : Dependent(종속자)

 


23. 다음과 같은 릴레이션이 있다. 어떤 정규화 과정을 거쳐야하는지 쓰시오

더보기

제1정규형

 

위 릴레이션은 원자값이 아니라 이벤트번호, 당첨여부에 값이 여러개 포함하므로 도메인이 원자 값으로만 구성될 수있도록 1정규형으로 정규화를 해주어야 한다


24. 다음과 같은 릴레이션이 있다. 어떤 정규화 과정을 거쳐야하는지 쓰시오

더보기

제2정규형

 

위 릴레이션은 등급, 할인율은 {고객 아이디, 이벤트 번호}, {고객 아이디} 두 집합에 종속이라 부분 함수 종속이다

따라서 모든 속성이 기본키에 완전 함수 종속이 될 수 있도록 2정규형으로 정규화를 해주어야 한다


25. 다음과 같은 릴레이션이 있다. 어떤 정규화 과정을 거쳐야하는지 쓰시오

더보기

제3정규형

 

위 릴레이션은 이행적 함수 종속이므로 이행적 함수 종속이 되지 않게 만들기 위해서 제 3정규형으로 정규화를 해주어야 한다

 


26. 반정규화(Denormalization)에 대해 설명하시오.

더보기

시스템의 성능을 향상하고 개발 및 운영의 편의성 등을 높이기 위해 정규화된 데이터 모델을 의도적으로 통합, 중복, 분리하여 정규화 원칙을 위배하는 행위, 비정규화라고도 한다.


27. 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수
행되어야 할 일련의 연산들을 뭐라고 하는지 쓰시오

더보기

트랜잭션(Transaction)


28. 다음은 27번의 특성에 관한 설명이다. 해당하는 특성을 영어로 쓰시오.

ㄱ : 트랜잭션의 연산은 데이터베이스에 모두 반영되도록 완료(Commit)되든지 아니면 전혀 반영되지 않도록 복구(Rollback)되어야 함
ㄴ : 트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 변환함
ㄷ : 둘 이상의 트랜잭션이 동시에 병행 실행되는 경우 어느 하나의 트랜잭션 실행 중에 다른 트랜잭션의 연산이 끼어들 수 없음
ㄹ : 성공적으로 완료된 트랜잭션의 결과는 시스템이 고장나더라도 영구적으로 반영되어야 함
더보기

ㄱ : Atomicity(원자성)

ㄴ : Consistency(일관성)

ㄷ : Isolation(독립성 또는 격리성)

ㄹ : Durability(영속성 또는 지속성)


29. 다음은 트랜잭션의 연산이다. 해당하는 것을 쓰시오.

가 : 트랜잭션이 성공적으로 수행되었음을 선언(작업 완료)
나 : 트랜잭션이 수행을 실패했음을 선언(작업 취소)
더보기

가 : commit

나 : rollback


30. 데이터베이스를 모순이 없는 일관된 상태로 유지하기 위해 데이터베이스 관리 시스템은 회복 기능을 제공한다. 데이터베이스가 조직의 중요한 데이터를 저장하고 있는 만큼 데이터베이스 관리 시스템의 회복 기능은 매우 중요한 기능이다. 데이터베이스 회복의 핵심 원리는 데이터 중복이다. 데이터를 별도의 장소에 미리 복사해두고, 장애로 문제가 발생했을 때 복사본을 이용해 원래의 상태로 복원하는 것이다.

다음은 회복을 위해 복사본을 만드는 방법에 대한 설명이다. 해당하는 것을 쓰시오.

ㄱ : 데이터베이스 전체를 다른 저장 장치에 주기적으로 복사하는 방법
ㄴ : 데이터베이스에서 변경 연산인 실행될 때마다 데이터를 변경하기 이전 값과 변경한 이후의 값을 별도의 파일에 기록하는 방법
더보기

ㄱ : dump(덤프)

ㄴ : log(로그)


31. 다음은 회복 연산에 대한 설명이다. 해당하는 것을 쓰시오.

ㄱ : 가장 최근에 저장한 DB복사본을 가져온 후 로그를 이용해 복사본이 만들어진 이후에 실행된 모든 변경 연산을 재실행하여 장애가 발생하기 직전의 DB 상태로 복구
ㄴ : 로그를 이용해 지금까지 실행된 모든 변경 연산을 취소하여 DB를 원래의 상태로 복구
더보기

ㄱ :  redo(재실행) 

ㄴ : undo(취소)


32. 데이터를 변경한 연산 결과를 데이터베이스에 반영하는 시점에 따라 2가지로 구분되는데 그런 로그 회복 기법에 대한 설명에 해당하는 것을 쓰시오.

ㄱ : 트랜잭션이 데이터를 업데이트하면 트랜잭션이 부분 완료되기 전이라도 즉시 실 제 데이터베이스에 반영하는 방법
ㄴ : 트랜잭션이 성공적으로 완료될 때까지 데이터베이스에 대한 실질적인 업데이트 를 연기하는 방법
더보기

ㄱ : 즉시 갱신 기법 (Immediate Update)

ㄴ : 연기 갱신 기법 (Deferred Update)


33. 기타 회복기법으로는 다음과 같다. 설명에 해당하는 것을 쓰시오.

ㄱ : 업데이트 이전의 데이터베이스를 일정 크기의 페이지 단위로 구성하여 각 페 이지마다 복사본인 그림자 페이지를 별도 보관해 놓고, 실제 페이지를 대상 으로 업데이트 작업을 수행하다가 장애가 발생하여 트랜잭션 작업을 Rollback 시킬 때는 갱신 이후의 실제 페이지 부분을 그림자 페이지로 대체 하여 회복시키는 기법
ㄴ : 트랜랜잭션 실행 중 특정 단계에서 재실행할 수 있도록 업데이트 내용이나 시스템에 대한 상황 등에 관한 정보와 함께 검사점을 로그에 보관해 두고, 장애 발생시 트랜잭션 전체를 철회하지 않고 검사점부터 회복 작업을 수행하여 회 복 시간을 절약하도록 하는 기법 
더보기

ㄱ : 그림자 페이지 대체 기법(shadow Paging)

ㄴ : 검사점 기법(Check Point)


34. DBMS는 여러 사용자가 DB를 동시에 공유할 수 있도록 여러 개의 트랜잭션이 동시에 수행되는 병행 수행(Concurrency)을 지원한다. 그런데 병행 수행되는 트랜잭션들이 서로 다른 데이터를 사용하여 연산을 실행하는 경우에는 괜찮지만 동시에 같은 데이터에 접근하여 변경 연산을 실행하려고 하면 문제가 발생할 수 있다. 그러므로 병행 수행을 하더라도 각 트랜잭션이 다른 트랜잭션의 방해를 받지 않고 정확한 수행 결과를 얻을 수 있도록 제어해야 하는데 이것을 (가)라고 한다. (가)를 쓰시오.

더보기

병행 제어(Concurrency Control) 또는 동시성 제어


35. 다음은 34번의 종류에 대한 설명이다. 해당하는 것을 쓰시오.

ㄱ : 병행 수행되는 트랜잭션들이 동일한 데이터에 동시에 접근하지 못하도록 lock과 unlock이라는 두 개의 연산을 이용해 제어한다.
ㄴ : 트랜잭션과 트랜잭션이 읽거나 갱신한 데이터에 대해 트랜잭션이 실행을 시작하기 전에 시간표를 부여하여 부여된 시간에 따라 트랜잭션 작업을 수행하는 기법
더보기

ㄱ : 로킹(Locking)

ㄴ : 타임 스탬프 순서(Time Stamp Ordering)


36. 두 대 이상의 서버를 하나의 서버처럼 운영하는 기술

더보기

클러스터링(Clustering)


37. 시스템 오류로 인한 데이터베이스 서비스 중단이나 물리적 손상 발생 시 이를 복구하기 위해 동일한 데이터베
이스를 복제하여 관리하는 것을 데이터베이스 이중화(Database Replication)이라고 한다. 다음 해당하는 설명이 데이터베이스 이중화의 어떤 기법인지 쓰시오.

ㄱ : 트랜잭션 수행 중 데이터 변경이 발생하면 이중화된 모든 데이터베이스에 즉시 전달하여 변경 내용이 즉시 적용되도록 하는 기법
ㄴ : 트랜잭션의 수행이 종료되면 변경 사실을 새로운 트랜잭션에 작성하여 각 데이터베이스에 전달되는 기법
더보기

ㄱ : Eager 기법

ㄴ : Lazy 기법

 

 2024 정보처리기사 실기 예상 문제 모음

728x90
LIST

+ Recent posts