-
C programming 기초 4강과외 수업 자료/C 2022. 11. 3. 23:15
이전 포스팅에 이어서 이번 시간에는 더 많은 조건문과 배열 대해서 알아볼 것이다.
1. 조건문
1.1 if ~ else 문
if ~ else에서 else의 사전적 의미는 ' 그 밖에 '에 또는 ' 그렇지 않으면 '을 의미한다.
조건문에서 if ~ else문을 사용하면 참인 경우와 그 빡의 경우를 엄격히 구분해서 프로그램의 흐름을 제어할 수 있습니다.
위 그림은 if ~ else문의 흐름을 표현한 그림이다.
위 그림을 해석하면 " 조건식이 참인 경우 내용 1을 수행해라, 조건식이 참이 아닌 (그 밖에) 경우 내용2를 수행해라! " 이다.
if ~ else 문의 예제 코드와 실행 결과 위 코드에서 if문은 age >= 15 && age <= 100 인 경우에 실행 한다. 즉, 15 <= age <= 100 인 경우에 실행을 하는 것이다. 만약 if문의 조건식을 만족하지 못하는 경우 else문으로 넘어가 "You can't sign up"을 출력하게 된다.
if ~ else 문도 if문과 마찬가지로 중첩하여 사용할 수 있다.
중첩 if ~ else 문의 예제 코드와 실행 결과 위 코드를 보면 첫 번째 if 문에서 num > 0 인 경우 "num is greater than 0" 를 출력한다. 만약 if문의 조건식을 만족하지 못하는 경우 else문으로 넘어가게 되는데 이때 else 문 안에 if문이 중첩되어 사용되어져 있다.
그러므로 num == 0인 경우 "num is 0" 를 출력하고 아닌 경우 "num is less than 0"를 출력하게 된다.
위와 같은 중첩 if ~ else 문은 코드를 복잡하게 만든다는 단점이 있다. 위의 코드와 같은 효과를 가지면서 간단하게 만들수 있는 else if 문을 사용하는 것이 좋다.
else if 문의 예제 코드와 실행 결과 위 코드는 else if 문을 사용한 코드이다. 만약 num > 0 일 경우 "num is greater than 0" 를 출력하고 "num == 0"인 다른 경우에 num is 0를 출력하게 된다. 이 둘다에 해당하지 않으면 "num is less than 0"를 출력하게 된다.
위에서의 중첩 if~else 과 else if문은 같은 결과를 낸다. 결국 위에 두 코드는 같은 실행 결과를 가지게 된다. 그러므로 대체가 가능한 상황이라면 복잡한 중첩 if~else 보다는 else if 문을 적극적으로 활용하는 것이 좋다.
1.2 switch ~ case
집에 스위치가 3개 있다고 가정해보자.
전등을 켜고 싶을 때 1번 스위치를 누르고, 전등을 끄고 싶을 때 2번 스위치를 누르며 3번 스위치는 고장이 났다.
위 글을 정리해보면
1번 스위치를 누른 경우 : 전등이 켜짐
2번 스위치를 누른 경우 : 전등이 꺼짐
3번 스위치를 누른 경우 : 고장으로 작동하지 않음
이러한 조건을 컴퓨터로 구현하기에는 switch ~ case 문이 적절하다. 그럼 이를 switch ~ case 문으로 구현해 보자.
위 글의 문제를 switch ~ case 문으로 구현한 것이다. 위 코드를 정리해보면
위 코드를 정리한 것 다음과 같이 해석할수 있다.
각각의 case 뒤에 있는 숫자가 num의 경우를 나타내며 마지막에 아무것도 해당되지 않을 경우 default에 있는 내용을 수행하게 된다.
이때 break; 문을 통해서 하나의 case의 내용을 수행하고 끝났음을 알려야 한다.
1.2.1 switch ~ case 문에서의 default와 break
default 는 witch 문에서 정의한 case에 해당되는 조건이 없는 경우에 수행하는 문장이다.
간혹 사용자가 잘못 입력한 값이 프로그램의 실행에 큰 위험을 줄 수 있기 때문에 default로 사용자의 실수를 처리하는 것이다.
break 는 switch 문을 종료하는 역할을 한다. 따라서 switch 문이 수행되는 중간에 break를 만나면 그 이후 내용은 무시되고 switch 문이 종료 된다.
break 없이 실행한 switch ~ case 문 switch ~ case 문에서 break를 만날 때 까지 미끄러져 계속 출력이 됨을 확인할 수 있다.
switch ~ case 문은 프로그램의 가독성을 높이는 장점이 있지만 다른 한편으로는 if~else 문에 비해 한계가 있다.
즉, switch 문은 비교 연산자를 사용할 수 없다.
연산자가 들어가는 if ~ else 문을 논리적으로 switch 문으로 바꾸는 것은 불가능하다.
왜냐하면, switch 문에 char형 문자, char형 정수, int형 정수만 올 수 있기 때문이다.
따라서 switch 문에는 당연히 float형 또는 double형의 실수가 올 수가 없다.
2. break 와 continue
break는 switch ~ case 문 외에도 반복문을 종료할 때도 많이 사용된다.
break 문 break는 반복문이 수행되는 도중에 break를 만나면 반복을 종료하고 반복문 다음 문장을 실행한다.
break문 예제 및 실행 결과 위 코드를 보면 무한 loop를 돌다가 변수 ch에 'q'가 입력이 되면 break문을 만나서 종료됨을 확인할 수 있다.
continue는 반복문을 종료하는 것이 아니라, 반복문에서 조건 비교의 위치로 넘어가게 한다.
continue 문 즉, 반복할 내용을 한 번 생략하는 것을 의미한다.
주의할 점으로 continue는 while, for, do ~ while 과 같은 반복문과는 같이 쓸 수 있지만 swith문과는 같이 쓸수 없다.
continue문 예제와 결과 위 코드는 continue문 예제이다. num % 2가 1일때마 continue로 건너뛰어 짝수만 출력됨을 확인할 수 있다.
3. 배열
앞에서 번호와 이름, 점수가 기록된 표가 있다고 생각하자.
표를 보면 값이 중복되는 경우가 있다.
같은 이름도 있고 같은 점수도 있다. 그렇다면 표는 어떻게 이름과 점수를 구별할 수 있을까?, 바로 번호로 구별할 수 있다.
즉, 번호로 이름과 점수를 구별하는 것이다!
많은 양의 데이터를 처리하는 컴퓨팅 세계에서도 표와 번호처럼 역할을 하는 것이 있는데 이것이 바로 배열이다.
표를 그리는 행위 : 배열을 선언하는 것
표에 숫자나 문자를 기록하는 행위 : 배열에 데이터를 저장하는 것
표의 번호로 숫자와 문자를 구별하는 행위 : 배열에 저장된 데이터를 참조하는 것
3.1 배열의 정의와 필요성
배열이란 같은 자료형을 가진 연속된 메모리 공간으로 이루어진 자료구조이다.
이런 배열은 같은 자료형을 가진 변수들이 여러 개 필요할 때 사용하며, 많은 데이터를 처리할 때 유용하다.
배열의 데이터 형태 예시 위와 같은 그림처럼 같은 자료형을 가진 연속된 메모리공간을 가지게 된다.
3.2 배열의 정의와 필요성
좌측 : 배열을 사용하지 않은 경우, 우측: 배열을 사용한 경우 좌측의 코드를 보면 변수의 개수가 너무 많다. 또한, 코드의 길이도 매우 길어서 비효율적인 프로그램이 된다.
배열을 모른다면 이렇게 코드를 작성하는 것이 최선일 것이지만 배열을 알고 있다면 이러한 문제를 해결할 수 있다.
우측처럼 배열을 사용하면 같은 자료형을 가진 변수 30개를 배열 하나로 처리해서 코드의 길이도 짧아지고 가독성도 좋아진다. 이처럼 같은 자료형을 가진 변수들이 여러 개 필요할 때 사용하는 것이 바로 배열이다.
3.3 배열의 선언
배열을 먼저 사용하기 위해서는 변수와 같은 선언을 해주어야 한다. 이럴 때는 자료형, 배열 이름, 배열 길이와 같은 구성 요소들이 필요하다. 이들 요소를 통해 같은 자료형을 갖는 연속된 메모리 공간을 할당 받게된다.
자료형 : 배열의 자료형을 지정
배열 이름 : 변수 이름과 마찬가지로 배열을 구분하는 이름
배열 길이 : 배열 요소의 총 길이 (10개의 변수를 배열로 구성)
배열 선언 코드 - char형 (1byte) 크기의 연속된 메모리 공간을 5바이트 할당한다. 즉, 1바이트 크기를 가진 char형 배열 요소 5개를 선언한 것이다.
- int형 (4byte) 크기의 연속된 메모리 공간을 20바이트 할당한다. 즉, 4바이트 크기를 가진 int형 배열 요소 5개를 언언한 것이다.
3.4 배열에 데이터 저장하기
배열의 선언과 초기화 위 코드는 배열을 선어하고 데이터를 집어넣는 코드이다.
위의 코드의 4번 라인에서 int student[5]; 를 통해 정수형 5칸 짜리 student라는 이름을 가지는 배열을 선언하였다.
그리고 student[0] = 90; 을 통해서 첫 번째 요소에 90이라는 데이터를 저장한다.
0번 1번 2번 3번 4번 이때 student[1]이 아니라 [0]인 이유는 배열은 위 그림과 같이 0번부터 시작하기 때문이다.
즉, 5칸 짜리 배열을 선언하였으면 0번째~4번째까지 5칸이 공간이 할당된 것이다.
다시 코드로 돌아와서, [1], [2] 모두 값을 초기화 해주었다.
출력 결과 student[1], [2], [3] 은 저장한 데이터인 90, 80, 70 이 출력되지만 값을 저장하지 않은 [3], [4] 번에는 쓰레기 값이 출력됨을 확인할 수 있다.
다른 방법으로 배열 초기화 하기 위 코드에서의 방법은 배열을 선언하며 초기화를 같이 하는 방법이다.
int arr1[5] = {90, 80, 70, 60, 50} 은 5칸의 배열을 선언하고 5개의 변수를 차례로 넣고 있다.
int arr2[] = {90, 80, 70, 60, 50} 을 통해 배열의 길이를 설정하지 않아도 배열 value의 갯수만큼 동적으로 배열의 크기가 할당됨을 알수 있는 방법이다.
int arr3[5] = {90, 80, 70} 은 5칸짜리 배열이지만 변수를 3개만 저장해주었다. 이를 출력해본 결과를 보면 선언과 동시에 초기화 할경우 빈 공간은 쓰레기 값이 아닌 0으로 자동 초기화 된다는 것을 알수 있다.
for 문을 사용하여 배열 인덱싱 위 코드는 for문을 이용하여 연속적으로 배열의 값에 접근하는 방법을 사용한 예제 코드이다.
3.5 배열 선언 시 주의할 점
1. 배열의 요소는 0 부터 시작한다.
다음 코드에서 int array[2]는 배열 요소를 초 2개 선언하고 있다.
그런데 array[2] = 3 은 배열의 세 번째 요소에 데이터 3을 저장하라는 의미로 에러가 발생한다.
왜냐하면, 배열의 요소는 0부터 시작며 array[0], array[1]은 존재하지만 array[2]는 존재하지 않기 때문이다.
2. 배열의 초기화를 중괄호로 할 때 배열의 선언과 초기화가 개별적으로 이루어져서는 안된다.
다음 코드에서 array2는 배열을 선언한 후에 중괄호를 이용하여 초기화를 개별적으로 했기 때문에 에러가 발생한다.
중괄호를 이용할 때는 배열 array1 처럼 한 줄에서 선언과 초기화를 함께 해야 에러가 발생하지 않는다.
3. 배열의 길이를 변수로 설정하면 안된다. 상수로 설정해야 한다.
다음 코드에서 배열 array1과 array2는 심볼릭 상수 MAX와 SIZE로 배열 길이를 설정하고 있지만, 배열 array3은 변수 a로 배열 길이를 설정하고 있어서 에러가 발생한다.
배열의 길이는 반드시 상수로 설정해야 한다.
마치며..
이번 시간에는 다양한 조건문 문법을 알아보고 1차원 배열에 대해서 알아보았다.
프로그램의 흐름을 잘 다루기 위해서는 조건문을 잘 알고있어야할 필요가 있다. 또한 많은 양의 데이터를 효율적으로 다루기 위해서는 배열을 확실하게 알고 넘어가야할 필요가 있으므로 공부를 열심히 해야할 것이다.
다음에는 2차원 배열및 다차원 배열과 함수의 기본에 대해서 알아볼 것이다.
< 참고 자료 >
책 : 열혈강의 C언어 본색 / 박정민
'과외 수업 자료 > C' 카테고리의 다른 글
C programming 기초 6강 (0) 2022.11.17 C programming 기초 5강 (0) 2022.11.07 C programming 기초 3강 (0) 2022.10.20 C programming 기초 2강 (0) 2022.10.11 C programming 기초 1강 (1) 2022.10.11