반복문(break & continue)
break
반복문을 빠져나가게 해주는 명령어다. break를 만나는 순간 반복문을 벗어난다.
while (true) {
...
if (a > 10)
break;
printf("a: %d\n", a);
a++;
...
}
continue
반복문의 맨 위로 돌아가라는 명령어이다. continue를 만나면 continue 아래에 있는 코드는 실행되지 않는다.
아래의 코드는 continue를 사용하여 짝수단만 출력하는 프로그램이다.
홀수단일 경우 continue를 사용하여 구구단이 출력되지 않도록 구현했다.
#include <stdio.h>
int main(void) {
for (int i = 2; i < 9; i++) {
if (i % 2 == 1)
continue;
for (int j = 1; j < 9; j++) {
printf("%d x %d = %d, ", i, j, i * j);
}
printf("\n");
}
return 0;
}
함수
함수는 나누어서 처리하기 위한 목적을 가진다.
코드의 가독성이 좋아지고, 코드 유지 보수와 확장이 용이하다.
C언어는 main 함수를 기준으로 함수들이 서로 연동되어 유기적으로 동작한다.
함수는 기본적으로 다음과 같이 작성한다.
- 자료형: 함수가 반환하는 값의 타입
- 함수 이름: 함수가 수행하는 기능의 이름으로 짓는 것이 좋다.
- 인수 목록: 매개 변수 또 파라미터라고도 하며, 함수에 필요한 값을 전달할 때 사용
- 함수의 내용: 중괄호 블럭 안에 작
자료형 함수이름(인수목록) {
함수 내용
}
예제
두 수를 입력받아 최대값과 최소값을 구하는 함수를 만들어보자. main 함수에서 이 함수를 호출하여 결과값을 출력한다.
#include <stdio.h>
void printMinMax(int x, int y);
int main(void) {
int x, y;
printf("두 정수를 입력하시오: ");
scanf("%d %d", &x, &y);
printMinMax(x, y);
}
void printMinMax(int x, int y) {
int min, max;
if (x > y) {
min = y;
max = x;
}
else {
min = x;
max = y;
}
printf("최대값: %d, 최소값: %d", max, min);
}
변수의 범위
지역 변수
같은 이름이라도 다른 영역의 함수에 속해있으면 다른 변수이다. func1의 local과 func2의 local 변수는 다른 변수라는 의미이다.
함수 호출 순서와 소멸 순서는 반대이다. 호출 순서는 val → local = 10 → local = 20 이므로 소멸 순서는 그 역순이다.
또한, 매개 변수도 지역변수다.
void main(void) {
int val = 0;
func1();
}
void func1() {
int local = 10;
func2();
}
void func2() {
int local = 20;
}
전역 변수
함수 바깥쪽에 선언된 변수이다. 아래 코드에서는 global이 전역 변수이다. 모든 함수에서 전역 변수에 접근할 수 있다.
int global;
void main(void) {
int val = 0;
func1();
}
void func1() {
int local = 10;
func2();
}
전역 변수는 관리가 어렵기 때문에 가급적 사용을 지양해야 한다.
전역 변수는 프로그램이 시작되자마자 메모리에 올라라고, 프로그램이 종료될 때 메모리에서 소멸되며, 데이터 영역에 저장된다. 데이터 영역은 전역 변수와 static 변수가 저장되는 공간이다.
static 변수
지역 변수처럼 함수 내에서 선언되지만, 함수를 벗어나도 메모리에 고정되어 소멸하지 않으며, 프로그램 종료 시에 소멸된다. 전역 변수와 동일하게 데이터 영역에 저장되기 때문이다.
static을 사용하여 변수를 선언했기 때문에 func 함수가 실행될 때마다 value가 0으로 초기화되는 것이 아니라 상태를 기억하고 있는다. 따라서 1 2 3 4 5가 출력된다.
void func() {
static int value = 0;
value++;
printf("%d\n", value);
}
void main(void) {
int i = 0;
while (i < 5) {
func();
i++;
}
}
배열
많은 변수를 한 번에 선언하기 위해 사용한다.
배열은 다음과 같이 선언한다.
- 배열의 타입: 배열 요소들의 타입
- 배열 이름: 배열의 요소에 접근하기 위한 배열 이름을 나타냄
- 배열 길이: 변수의 개수
배열의타입 배열이름[배열길이];
배열은 같은 타입끼리 복사가 가능하다. 복사할 때는 아래와 같이 각 요소끼리 복사해야 한다.
for (int i = 0; i < 10; i++) {
arr2[i] = arr1[i];
}
문자열도 아래와 같이 배열로 표현한다. 문자열의 끝에는 null 문자가 반드시 추가되며, null 문자가 문자열의 끝임을 알려준다. 남은 공간은 쓰레기 값으로 채워진다.
char str[100] = "Beautiful";
포인터
포인터는 메모리의 주소값을 저장하고 있는 변수이다. 메모리를 가리킨다고도 하며, 어느 특정 메모리 주소를 가리키고 있다.
아래와 같이 일반 변수명 앞에 * 기호를 붙여 선언한다. 주소값만 저장하겠다는 의미를 가진다.
char *pA;
int *pB;
double *pC;
& 기호를 통해 변수의 주소값을 얻어 저장할 수 있다. pB는 b를 가리키고 있다고 할 수 있다.
int b = 100;
int *pB = &b;
pB는 b의 주소 값을 저장하고 있고, *pB는 그 주소 값에 저장되어 있는 값을 나타낸다.
int main(void) {
int b = 100;
int* pB = &b;
printf("b = %d\n", b);
printf("&b = %p\n", &b);
printf("pB = %p\n", pB);
printf("*pB = %d\n", *pB);
return 0;
}
포인터와 배열
배열의 이름은 해당 배열의 첫 번째 요소의 주소값을 가진다. 즉, 첫 번째 요소의 주소 값을 가리키는 포인터라는 의미이다.
아래와 같이 배열의 주소 값은 첫 번째 요소의 주소 값과 일치하는 것을 확인할 수 있다.
arr를 포인터 상수라고 부르며, 상수이기 때문에 주소값을 변경할 수 없다.
int main(void) {
int arr[] = { 1, 2, 3, 4, 5 };
printf("arr: %p\n", arr);
printf("arr[0]: %p", &arr[0]);
}
함수와 포인터
값에 의한 복사
기본적인 함수의 인자 전달 형태는 복사이다.
아래 코드에서는 a 값을 b로 복사한다. 즉, 별도의 메모리 공간을 사용한다.
a를 실인수, b를 형식인수라고 부른다.
int main(void) {
int a = 10;
func(a);
}
void func(int b) {
// ...
}
참조에 의한 복사
배열형의 인자는 포인터로 받는다. 이것을 참조에 의한 복사라고 한다.
아래 코드와 같이 함수의 매개변수를 포인터 변수로 받는다.
함수의 파라미터 pArr는 주소값을 넘겨받은 것이기 때문에 arr과 같은 메모리 공간을 가리키고 있다.
void func(int* pArr) {
for (int i = 0; i < 5; i++) {
printf("arr[%d] = %d\n", i, pArr[i]);
}
}
int main(void) {
int arr[] = { 1, 2, 3, 4, 5 };
func(arr);
}
배운 점
- 함수에 인수를 전달하는 방법에는 값에 의한 복사와 참조에 의한 복사가 있다.
- 값에 의한 복사는 값 자체를 복사하기 때문에 별도의 메모리 공간을 가진다.
- 참조에 의한 복사는 주소값을 넘겨주는 것이기 때문에 동일한 메모리 공간을 가리킨다.
- 배열의 이름은 해당 배열의 첫 번째 요소의 주소값을 가진다.
- 문자열의 끝에는 반드시 null 문자가 들어간다. 남은 공간에는 쓰레기 값이 들어간다.
'데브코스' 카테고리의 다른 글
[10주차 - DAY5] 클래스 (0) | 2024.05.03 |
---|---|
[10주차 - DAY4] 사용자 정의 자료형, 동적 할당, 객체 지향 (0) | 2024.05.02 |
[10주차 - DAY1] C언어 연산자, 분기문, 반복문 (0) | 2024.04.29 |
[10주차 주간 발표] 동적 라우팅과 다익스트라 알고리즘 (0) | 2024.04.27 |
[9주차 - DAY5] 프로그래밍과 C언어 (0) | 2024.04.26 |