-
[C] QnA 20C 2023. 6. 9. 01:22
1. C 언어의 주요 특징에 대해 설명해보세요.
- 절차적 프로그래밍: C 언어는 절차적 프로그래밍 언어로, 순차적인 문장들로 구성되어 있습니다.
- 저수준 언어: C 언어는 하드웨어와 밀접한 관련이 있으며, 메모리 주소를 직접 다룰 수 있는 저수준 언어입니다.
- 이식성: C 언어는 다양한 플랫폼에서 실행될 수 있는 이식성이 뛰어난 언어입니다.
- 간결하고 효율적인 문법: C 언어는 간결하고 효율적인 문법을 가지고 있으며, 메모리와 시간의 효율성을 추구합니다.
2. sizeof 연산자의 역할은 무엇이며, 어떤 결과를 반환하나요?- sizeof 연산자는 피연산자의 크기를 바이트 단위로 반환합니다.
- 변수, 자료형, 구조체 등의 크기를 구할 때 주로 사용됩니다.
3. 포인터란 무엇이고, 어떻게 사용하나요?- 포인터는 메모리 주소를 저장하는 변수입니다.
- 포인터는 * 연산자를 사용하여 해당 주소에 저장된 값을 가져오거나 변경할 수 있습니다.
- 메모리에 직접 접근하여 값을 읽거나 변경하는 데 사용됩니다.
- 포인터는 * 연산자를 통해 간접 참조할 수 있으며, 동적 메모리 할당과 배열을 다루는 데에도 사용됩니다.
- 예를 들어, int *ptr은 int형 값을 가리키는 포인터 변수를 선언하는 것을 의미하며, *ptr은 포인터가 가리키는 값을 나타냅니다.
4. malloc() 함수와 free() 함수의 역할은 무엇인가요?- malloc() 함수는 동적으로 메모리를 할당하기 위해 사용됩니다.
- malloc() 함수는 인자로 할당하고자 하는 메모리의 크기를 받고, 할당된 메모리의 시작 주소를 반환합니다.
- free() 함수는 동적으로 할당된 메모리를 해제하는 데 사용됩니다.
- free() 함수는 malloc()으로 할당한 메모리를 사용한 후, 더 이상 필요하지 않을 때 메모리를 반환하기 위해 호출됩니다.
- 이 두 함수는 동적 메모리 관리를 위해 중요한 역할을 합니다.
5. 구조체(struct)란 무엇이며, 어떻게 정의하고 사용하나요?- 구조체(struct)는 서로 관련된 여러 개의 변수를 하나의 자료형으로 묶어서 사용하는 것을 의미합니다.
- 구조체를 정의할 때는 struct 키워드를 사용하며, 정의된 구조체는 변수로 선언하여 사용할 수 있습니다.
- 구조체는 사용자가 정의한 데이터 타입으로, 멤버 변수를 포함할 수 있습니다.
- 구조체를 정의하기 위해서는 struct 키워드를 사용하고, 멤버 변수와 타입을 정의합니다. 예를 들어, struct Person { char name[20]; int age; };와 같이 정의할 수 있습니다.
6. 함수의 매개변수 전달 방식에는 어떤 것들이 있나요?- 함수의 매개변수 전달 방식에는 값에 의한 전달(Call by Value), 참조에 의한 전달(Call by Reference), 포인터에 의한 전달 등이 있습니다.
- 값에 의한 전달은 매개변수로 전달되는 값의 복사본이 함수 내부로 전달되는 방식입니다.
- 참조에 의한 전달은 함수로 전달되는 변수의 메모리 주소를 전달하여 원본 변수를 수정할 수 있는 방식입니다.
- 포인터에 의한 전달은 매개변수로 전달되는 변수의 메모리 주소를 가리키는 포인터를 전달하여 원본 변수를 수정할 수 있는 방식입니다.
7. 재귀 함수(Recursive Function)란 무엇인가요? 장단점은 무엇인가요?
- 재귀 함수(Recursive Function)는 함수 내부에서 자기 자신을 호출하는 함수입니다.
- 재귀 함수는 큰 문제를 작은 문제로 분할하여 해결하는 분할 정복(Divide and Conquer) 방식으로 문제를 해결합니다.
- 장점으로는 알고리즘이 간결하고 이해하기 쉬울 수 있으며, 일부 알고리즘에 적합한 경우 효율적인 코드를 작성할 수 있습니다.
- 단점으로는 재귀 호출 시 메모리 사용량이 늘어날 수 있고, 재귀 호출의 깊이가 너무 깊어질 경우 스택 오버플로우(Stack Overflow)가 발생할 수 있습니다.
8. const 키워드의 역할은 무엇인가요? 어떤 경우에 사용하나요?- const 키워드는 변수나 매개변수를 상수로 선언하는 데 사용됩니다.
- 상수로 선언된 변수는 값을 변경할 수 없으며, 보다 안전한 프로그래밍을 위해 사용됩니다.
- const 키워드를 사용하여 선언된 변수는 읽기 전용이 되어 값을 변경할 수 없습니다.
- const는 변수의 값이 변하지 않아야 하는 경우, 함수 매개변수를 보호하고자 할 때, 포인터를 상수로 선언하여 포인터가 가리키는 값을 변경하지 못하도록 할 때 등 다양한 경우에 사용됩니다.
9. 배열과 포인터는 어떤 관계가 있나요? 배열을 함수에 전달할 때에는 어떤 방식을 사용하나요?- 배열과 포인터는 밀접한 관계를 가지고 있습니다.
- 배열의 이름은 배열의 첫 번째 요소를 가리키는 포인터로 해석될 수 있습니다.
- 또한, 배열 요소에 접근하는 것은 포인터 연산으로 처리될 수 있습니다.
- 배열은 연속된 메모리 공간에 저장된 요소의 집합이고, 포인터는 메모리 주소를 저장하는 변수입니다.
- 배열의 이름은 배열의 첫 번째 요소를 가리키는 포인터로 해석될 수 있습니다. 따라서 배열을 함수에 전달할 때에는 배열의 이름 자체가 포인터로 전달되며, 배열의 크기를 따로 전달하지 않아도 됩니다.
10 .파일 입출력을 위해 사용되는 C 언어의 함수들을 몇 가지 예를 들어 설명해보세요.- 파일 입출력을 위해 사용되는 C 언어의 함수들로는 fopen(), fclose(), fread(), fwrite(), fscanf(), fprintf() 등이 있습니다.
- fopen(): 파일을 열기 위해 사용되는 함수로, 파일의 경로와 모드를 인자로 받습니다.
- fclose(): 열린 파일을 닫기 위해 사용되는 함수로, 파일 포인터를 인자로 받습니다.
- fread(), fwrite(): 이진 파일에서 데이터를 읽고 쓰기 위해 사용되는 함수로, 각각 데이터를 읽어오는 크기와 개수, 쓰고자 하는 데이터, 크기, 개수를 인자로 받습니다.
- fscanf(), fprintf(): 텍스트 파일에서 형식화된 데이터를 읽고 쓰기 위해 사용되는 함수로, 서식 문자열과 변수들을 인자로 받습니다.
11. typedef 키워드의 역할은 무엇인가요? 어떤 경우에 사용하나요?- typedef 키워드의 역할은 새로운 데이터 타입의 별칭을 정의하는 것입니다.
- typedef를 사용하여 기존 데이터 타입에 대해 사용자 정의 타입 이름을 지정할 수 있습니다.
- 이는 코드의 가독성을 높이고 데이터 타입을 추상화하여 유지 보수성을 향상시키는 데 도움이 됩니다.
- 또한, 복잡한 데이터 타입의 정의를 단순화할 수도 있습니다.
12. 열거형(enum)은 무엇이며, 어떻게 사용하나요?- 열거형(enum)은 연속적인 정수 값에 대한 상징적인 이름을 정의하는 것입니다.
- 열거형은 상수 집합을 정의하고 이를 사용하여 프로그램에서 의미 있는 값을 나타낼 수 있습니다.
- 주로 프로그램에서 구분되는 상수 값을 정의할 때 사용됩니다.
- 예를 들어, 요일을 나타내기 위해 열거형을 사용할 수 있습니다.
13. 동적 메모리 할당이 필요한 상황과 정적 메모리 할당이 필요한 상황에 대해 비교해보세요.- 동적 메모리 할당이 필요한 상황은 프로그램 실행 중에 메모리를 동적으로 할당해야 할 때입니다.
- 이는 예를 들어 사용자로부터 입력을 받아 그 크기에 따라 메모리를 할당해야 할 때 유용합니다.
- 정적 메모리 할당은 컴파일 시점에 메모리가 할당되는 것으로, 프로그램 실행 중에 크기가 변경되지 않는 데이터나 고정된 크기의 배열 등을 선언할 때 사용됩니다.
14. 문자열을 다루기 위해 사용되는 C 언어의 함수들을 몇 가지 예를 들어 설명해보세요.- C 언어에서 문자열을 다루기 위해 사용되는 함수들로는 strlen(), strcpy(), strcat(), strcmp() 등이 있습니다.
- strlen(): 문자열의 길이를 반환하는 함수입니다.
- strcpy(): 문자열을 복사하는 함수로, 한 문자열을 다른 문자열에 복사합니다.
- strcat(): 문자열을 연결하는 함수로, 한 문자열 뒤에 다른 문자열을 추가합니다.
- strcmp(): 두 문자열을 비교하는 함수로, 두 문자열이 동일하면 0을 반환합니다.
15. static 키워드의 역할은 무엇인가요? 함수와 변수에 적용할 때 각각 어떤 의미가 있나요?- static 키워드는 두 가지 다른 의미로 사용됩니다.
- 함수 내부에서 static 키워드가 함수나 변수에 적용될 경우 해당 함수나 변수가 정적으로 선언되어, 함수 내부에서만 사용 가능하고 다른 파일에서 접근할 수 없습니다.
- 파일 전역 변수에 적용될 경우 해당 변수의 수명이 프로그램의 전체 실행 동안 유지되며, 다른 파일에서 접근할 수 없습니다.
16. 포인터 연산에서 ++ 연산자와 + 연산자의 차이점은 무엇인가요?- 포인터 연산에서 ++ 연산자는 포인터가 가리키는 데이터 타입의 크기만큼 포인터 값을 증가시킵니다.
- 예를 들어, int형 포인터의 경우 4바이트가 증가하게 됩니다. + 연산자는 주어진 값만큼 포인터 값을 증가시킵니다. 즉, 주어진 값만큼 바이트 단위로 포인터가 이동합니다.
17. scanf() 함수와 gets() 함수의 차이점은 무엇인가요? 어떤 경우에 어떤 함수를 사용해야 하나요?- scanf() 함수는 표준 입력(stdin)으로부터 형식화된 데이터를 읽어올 때 사용되며, 사용자로부터 값을 입력받을 때 주로 사용됩니다.
- gets() 함수는 문자열을 표준 입력으로부터 읽어올 때 사용되며, 보안상의 이유로 권장되지 않습니다.
- scanf() 함수는 형식화된 입력을 처리할 때 사용하고, gets() 함수는 개행 문자를 포함한 한 줄을 입력받을 때 사용됩니다. 대신 fgets() 함수를 사용하여 문자열을 입력받는 것이 안전하고 권장되는 방법입니다.
18. 프로그램의 실행 도중에 발생하는 예외 상황을 처리하기 위해 사용되는 C 언어의 예외 처리 기법을 설명해보세요.- C 언어에서는 try-catch와 같은 예외 처리 기법이 없습니다. 예외 상황을 처리하기 위해 일반적으로 오류 코드를 반환하거나, 프로그램을 종료하는 방식을 사용합니다. 예를 들어, 함수가 실패한 경우 -1과 같은 오류 코드를 반환하거나, assert() 함수를 사용하여 프로그램을 중단시킬 수 있습니다.
19. 헤더 파일(.h)과 소스 파일(.c)의 역할과 차이점은 무엇인가요?- 헤더 파일(.h)은 함수 원형, 상수, 구조체 정의 등의 선언을 포함하는 파일입니다.
- 헤더 파일은 소스 파일에서 해당 선언들을 참조할 수 있도록 하고, 코드의 재사용성과 모듈화를 높이는 역할을 합니다.
- 소스 파일(.c)은 실제로 코드가 구현되는 파일입니다. 헤더 파일의 선언을 소스 파일에서 구현하여 완전한 프로그램을 만들 수 있습니다.
20. C 언어에서 주석(comment)의 역할과 종류에 대해 설명해보세요.- C 언어에서 주석(comment)은 코드의 설명이나 문서화를 위해 사용됩니다.
- 주석은 컴파일러에 의해 무시되며, 프로그램의 동작에 영향을 주지 않습니다.
- 주석의 종류로는 한 줄 주석(//)과 여러 줄 주석(/* ... */)이 있습니다. 한 줄 주석은 해당 줄의 끝까지 주석으로 처리되며, 여러 줄 주석은 주석 시작부터 주석 종료까지의 범위에 있는 모든 코드를 주석으로 처리합니다.
'C' 카테고리의 다른 글
[C] 파일 처리① (1) 2024.02.24 [C] 함수와 포인터 활용 (0) 2023.08.28 [C] 구조체와 공용체 (0) 2023.05.18 [C] 문자열와 명령행 인자② (1) 2023.05.16 [C] 문자와 문자열① (0) 2023.05.11