IT Memory Note

[정보처리기사] 프로그래밍 언어 활용 : C 언어(4) 본문

자격증/정보처리기사

[정보처리기사] 프로그래밍 언어 활용 : C 언어(4)

h00ddu 2024. 8. 13. 09:31

 

1️⃣1️⃣ 구조체(Structure Type)

☆☆

 


(1) 구조체의 개념

 

  • 사용자가 기본 자료형을 가지고 새롭게 정의할 수 있는 사용자 정의 자료형

 

(2) 구조체의 선언
struct 구조체명 {
   자료형 변수명1;
   자료형 변수명2;
   ...
};

struct 구조체명 구조체변수;
  • 구조체 변수, 변수명 형태로 값을 가리킴

 

1️⃣2️⃣ 함수

☆☆☆

 


(1) main 함수

 

1. main 함수의 개념

 

  • 프로그램이 실행하는 모든 프로그램의 시작점
  • main 함수에 있는 명령어를 실행함

2. main 함수의 형태

 

자료형 main(파라미터) {
   명령어;
}
  • void main( ) 일 경우 반환할 값이 없으므로 return;을 사용하거나 return 자체를 사용하지 않고, int main( ) 일 경우 return 반환값;을 명시해주어야 함
  • main 함수나 사용자 정의 함수는 return을 만나면 그 즉시 함수를 종료함
void main int main
void main() {
    return;
}
int main() {
    return 반환값;
}

※ void : '존재하지 않음' 이라는 뜻으로 반환 값이 없다는 의미로 사용
  - 함수를 호출한 호출자에게 결과값을 제공하지 않는다는 의미의 자료형


 

(2) 사용자 정의 함수(User-Defined Function)

 

1. 사용자 정의 함수의 개념

 

  • 사용자가 직접 새로운 함수를 정의하여 사용하는 방법
  • 사용자 정의 함수에서 매개변수나 생성된 변수는 사용자 정의 함수로 종료되면 없어짐

※ 매개변수(Paraneter) : 함수를 호출할 때 인수로 전달된 값을 함수 내부에서 사용할 수 있게 해주는 변수


2. 사용자 정의 함수 선언
자료형 함수명(자료형 변수명, ...) {
   명령어;
   return 반환값;
}

 


3. 매개변수 전달 방법(Parameter Passing Mechanism)

 

⓵ 매개변수 전달 방법의 개념

 

  • 함수가 필요로 하는 값을 매개변수로 만들면 함수를 호출하는 쪽에서 매개변수를 사용하여 해당 함수에게 변수 값, 변수 주소값을 전달하는 방식

⓶ 매개변수 전달 방법의 구성요소

 

구성요소 설명
전달인자
(Argument)
실 매개변수(Actual Parameters)로도 불림
함수를 호출하는 쪽에서 전달하는 변수 값 또는 변수 주소값
매개변수
(Parameter)
형식 매개변수(Formal Parameters)로도 불림
함수를 선언하는 쪽에서 전달받는 변수 값 또는 변수 주소값
#include <stdio.h>

int fn(int x, int y){   // 매개변수(Parameter)
  ...
}   

void main() {
  int i, j;
  ...
  fn(i, j);   // 전달인자(Argument)
}

 


⓷ 매개변수 전달 방법의 종류

 

종류 설명
Call by Value 변수 값을 넘겨주고, 이 값은 새로운 공간에 할당되어 사용하는 방식
 형식 매개변수의 어떠한 변화도 실 매개변수에 아무런 영향을 미치지 않음
Call by Reference  변수 값이 아닌 변수가 사용 중인 메모리 공간의 주소를 넘겨주는 방식
 실 매개변수의 주소를 형식 매개변수로 보냄

■ 매개변수 전달 방법

Call by Value Call by Reference
#include <stdio.h>

int fn(int x, int y) {
   ...
}

void main() {
   int i, j;
   ...
   fn(i, j);
}
#include <stdio.h>

int fn(int* x, int* y) {
   ...
}

void main() {
   int i, j;
   ...
   fn(&i, &j);
}
형식 매개변수(Formal Parameters)는 변수 선언과 동일하게 작성하고, 실 매개변수(Actual Parameters)는 변수명을 작성 형식 매개변수(Formal Parameters)는 간접값 연산자(*)를 이용해 포인터 변수 선언과 동일하게 작성하고, 실 매개변수(Actual Parameters)는 주소연산자(&)를 이용해 변수 주소값을 작성

 


4. 재귀 함수(Recursive Function)

 

⓵ 재귀 함수의 개념

 

  • 함수 자신이 자신을 부르는 함수

⓶ 재귀 함수 선언

 

자료형 함수명(자료형 변수명, ...) {
 ...
 함수명(변수명, ...)
 ...
 return 반환값;
}

※ 함수명이 fn 이라고 하면, fn 함수 내에서 fn 함수를 호출하는 것을 재귀 함수라 함


 

(3) 표준 함수

 

1. 문자열 함수

 

⓵ strcat(String Concatenate) : 문자열끼리 연결하는 함수

strcat(dest, src); src의 문자열을 dest 문자열 뒤에 붙임
strncat(dest, src, maxlen); src의 문자열에서 maxlen의 개수만큼 dest 문자열 뒤에 붙임

 


⓶ strcpy(String Copy) : 문자열을 복사하는 함수

 

strcpy(dest, src); src의 문자열을 dest 문자열에 복사
strncpy(dest, src, maxlen); src의 문자열에서 maxlen의 개수만큼 dest 문자열에 복사

 


⓷ strcmp(String Compare) : 문자열을 비교하는 함수

 

strcmp(s1, s2); s1, s2의 대소를 비교
strcmp(s1, s2, maxlen); maxlen 길이만큼만 s1, s2의 대소를 비교

strcmp는 사전 배열 방식과 유사해서 문자열의 첫 번째 문자끼리 비교하고, 다르면 아스키코드 값을 통해 크고 작음을 판별함
  - 문자열의 첫 번째 문자가 같으면 두 번째 문자끼리 비교하고, 그래도 같으면 세 번째 문자끼리 비교하는 식으로 해서 마지막 문자까지 같으면 두 문자열은
    같다고 판별함


⓸ strlen(String Length) : 문자열의 길이를 알려주는 함수

 

strlen(s); s의 길이를 알려줌

 


⓹ strrev(String Reverse) : 문자열을 거꾸로 뒤집는 함수

 

strrev(str); str 내에 문자열을 거꾸로 뒤집음

 


⓺ strchr(String find Character) : 문자열 내에 일치하는 문자가 있는지 검사하는 함수

 

strchr(str, c); str 내에 c가 존재하는지 알려줌

 


2. 수학 함수

 

⓵ sqrt : 양의 제곱근을 계산하는 함수

 

sqrt(n); √n의 값을 계산

 


⓶ ceil : 소수점 올림 함수

 

ceil(n); 소수점 올림

 


⓷ floor : 소수점 내림 함수

 

floor(n); 소수점 내림

 


3. 유틸리티 함수

 

⓵ rand(Random) 함수 : 임의의 값을 생성하는 함수

 

rand(); 임의의 정수값 1개를 생성

rand()는 0~32767 중에 하나의 값을 반환함
 rand() 함수는 임의로 난숨나 생성해 주기 때문에 여러 번 실행했을 경우 동일한 숫자가 나올 수도 있음


⓶ srand(Seed Random) 함수 : 난수 생성 알고리즘에 사용하는 seed를 정해주는 함수

 

  • srand 함수를 사용하면 rand 함수를 사용할 때 해당 seed 값에 해당하는 난수 패턴으로 생성함
srand(seed); seed 값에 따라 난수 발생기를 초기화함

※ seed : 난수 알고리즘 실행하기 위해 쓰는 수
※ 컴퓨터는 난수를 난수 생성 알고리즘에 의해서 만드는데, 난수 생성 알고리즘의 seed 값이 같으면 프로그램을 실행할 때마다 계속 똑같은 패턴의 난수를 만들게 됨


⓷ time 함수 : 현재 시간을 가져오는 함수

 

  • 1970년 1월 1일 이후로 몇 초가 경과했는지를 나타냄
time(NULL); time 함수에 파라미터를 NULL로 하면 현재 시간을 리턴

 seed 값을 프로그램 시작할 때마다 다르게 하도록 seed에 time 함수를 사용함
 현재 시간이 1970년 1월 1일 0시 0분 1초이면 1, 1970년 1월 1일 0시 0분 2초이면 2, 이런 식으로 1초가 지날 때마다 값이 1씩 증가함


⓸ atoi(ASCII to Integer) 함수 : 문자열을 정수형으로 변환하는 함수

 

atoi(str); 문자열(str)을 정수(int)형으로 변환

 문자열을 저장하기 위해서 일반적으로 배열을 사용하지만, 문자형 포인터를 생성하면서 문자열을 대입할 수도 있음


⓹ atof(ASCII to Floating Point) 함수 : 문자열을 실수형으로 변환하는 함수

 

atof(str); 문자열(str)을 실수(float, double)형으로 변환

 


⓺ itoa(Integer to ASCII) 함수 : 정수형을 문자열로 변환하는 함수

 

itoa(value, str, radix); value를 변환하여 str에 radix 진수로 저장함

 


 

1️⃣3️⃣ 포인터(Pointer)

☆☆☆

 


(1) 포인터의 개념

 

  • 변수 주소값을 저장하는 공간

 


 

(2) 포인터 선언
자료형* 포인터_변수명 = &변수명;
  • 자료형 뒤에 *를 붙이면 주소를 저장하는 포인터 변수라는 의미이고, 일반 변수명에 &를 붙이면 해당 변수명의 주소값임
  • int 형 변수를 가리키는 포인터 변수 선언 시 int+를, char 형 변수를 가리키는 포인터 변수 선언 시 char*를, float 형 변수를 가리키는 포인터 변수 선언 시 float*를 사용해야 함
  • 주소에 해당하는 값을 가리킬 때는 *를 사용함

주소에 해당하는 값을 가리키는 * 연산과 변수에 주소값을 나타내는 & 연산은 반대 기능이어서, *(&)과 같이 두 연산을 같이 쓰면 서로 상쇄됨


 

(3) 배열과 포인터

 

  • "자료형 배열명[요소];"일 때 다음 코드는 동일함

< 배열의 i번지 주소와 i번지 값 >

구분 코드
배열의 i번지 주소 배열+i == &배열[i];
배열의 i번지 값 *(배열+i) == 배열[i];

 

1. 1차원 배열과 1차원 포인터

 

  • 1차원 배열에서 배열명만 단독으로 사용할 경우 1차원 포인터와 동일함
  • 1차원 배열일 때는 배열명[요소] 형태, *(배열명+요소)일 경우 값을 가리키고, 1차원 포인터일 때는 포인터[요소] 형태, *(포인터+요소) 일 경우 값을 가리킴

C언어 1차원 배열과 1차원 포인터

 


2. 2차원 배열과 1차원 포인터

 

  • 2차원 배열에서 배열명만 단독으로 사용할 경우 2차원 포인터와 동일함
  • 2차원 배열일 때는 배열명[요소] 형태, *(배열명+요소)는 1차원 포인터와 동일하고, 1차원 포인터에 대해 *과 [ ]을 이용해야 값을 가리킬 수 있음

C 언어 2차원 배열과 1차원 포인터

 


3. 2차원 배열과 포인터 배열

 

C 언어 2차원 배열과 포인터 배열

 


4. 2차원 배열과 2차원 포인터

 

  • 2차원 배열에서 배열명만 단독으로 사용할 경우 2차원 포인터와 동일함
  • 2차원 배열일 때 배열명[요소][요소], *배열명[요소], **(배열명+요소)일 경우 값을 가리킴

 

C 언어 2차원 배열과 2차원 포인터

 


 

(4) 구조체와 포인터

 

1. 구조체 변수와 구조체 포인터

 

  • 구조체는 일반 구조체 변수로 접근할 때는 .으로 접근하고, 구조체 포인터로 접근할 때는 ->로 접근함

C 언어 구조체 변수와 구조체 포인터

 


2. 1차원 구조체 배열과 1차원 구조체 포인터

 

  • 1차원 구조체 배열에서 배열명만 단독으로 사용할 경우 1차원 구조체 포인터와 동일함
  • 1차원 구조체 배열일 때 배열명[요소].변수명 형태, (*(배열명+요소)).변수명, 배열명->변수명 형태, (배열명+요소)->변수명 형태로 값을 가리킴
  • 1차원 포인터일 때 포인터[요소].변수명 형태, (*(포인터+요소)).변수명 형태, 포인터->변수명 형태, (포인터+요소)->변수명 형태로 값을 가리킴

 

C 언어 1차원 구조체 배열과 1차원 구조체 포인터

 


 

(5) 함수와 포인터

 

  • 함수의 주소를 저장하고, 해당 주소의 함수를 호출하는 데 사용하는 포인터
리턴타입 (*함수_포인터)(함수파라미터);

 


 

(6) 사용자 정의 함수 포인터 반환

 

  • 사용자 정의 함수의 반환 값으로 포인터를 전달받을 수 있음