본문 바로가기

cs50 기초강의

2. C언어 - 조건문과 루프

● 조건문

 

위 이미지는 변수 counter 를 0으로 설정한다는 의미이다.

C에서도 왼쪽 이미지와 같은 의미를 구현하기 위해 변수명 counter 를 적어주고 할당연산자를 통해 0을 변수로 지정한다. 하지만 여기서 단지 counter = 0; 만 사용하는 것이 아니라 변수를 설정할 때는 컴퓨터에게 변수의 데이터 종류가 무엇인지 알려줘야 한다.

string은 여러 단어를 저장하는 데이터 타입이였다. 여기선 0이라는 숫자를 저장해야하는데 이때 C에서는 이러한 정수 데이터를 int 혹은 integer라고 부른다.

 

즉 int counter = 0; 의 의미는 int 형식의 변수를 선언하고 그 변수를 counter라고 부른 뒤 그 값에 0을 저장하는 것이다.

 

그렇다면 변수를 1씩 증가하는 코드는 어떻게 작성할까?

위 코드를 단순히 등식이라고 생각하면 안된다. 프로그래밍에서 = 는 할당 연산자로써 오른쪽의 내용을 왼쪽으로 할당한다는 의미이다.

즉, counter = counter + 1; 는 counter 에 1을 더한 값을 다시 counter에 저장(할당)한다는 의미이다.

위 코드에는 변수에 int 를 선언하지 않았는데 그 이유는 앞서 int counter = 0; 으로 counter 변수를 선언했기 때문에 다시 counter 를 사용할 땐 int 를 선언하지 않아도 된다. 컴퓨터가 이미 counter 라는 변수가 존재한다는 것을 아는 것이다.

 

프로그래밍에서는 counter = counter + 1 이 아주 흔한 연산이기 때문에 이를 표현하는 다른 방법이 있다.

counter += 1 과 counter++ 는 counter = counter + 1 과 같은 의미이다.

 

조건문은 C에서 어떻게 표현할까?

조건문은 뭔가를 결정할 때 필요한 것이다. 그리고 결정을 하기 위한 질문이 필요한데 그 질문이 참이면 이것을 실행하라는 기능을 가지고 있다.

 

C에서는 조건문을 위 이미지처럼 표현한다.

즉, x 가 y 보다 작으면 { } 안의 내용을 수행하라는 것이다.

{ } 안의 내용은 printf("x is less than y\n"); 이다 즉, "x is less than y\n" 을 출력하라는 의미이다.

 

이것이 C에서 조건을 추가할 때 사용하는 일반적인 패턴이다.

 

조건에서는 else를 이용하여 처음 조건이 아닌 경우에는 다른 것을 하라고 할 수도 있다.

만약 x 가 y 보다 작다면 x is less than y\n 을 출력하고 

아니라면 x is not less than y\n 을 출력하라는 의미이다.

 

조건의 불리언 부분을 보면 따로 ; 을 사용하지 않았다. 보통 조건과 같은 것들의 끝에는 ; 을 사용하지 않는 점을 주의한다.

 

조건의 또 다른 예를 살펴보자.

 

if 와 else if , else if 를 사용한 코드이다.

x < y 일 경우와 그게 아니라면 x > y 일 경우 또 그것이 아니라면 x == y 일 경우 각 해당하는 내용을 수행한다는 의미이다.

자세히 보면 새로운 개념이 나온다. == 는 무슨 의미일까?

 

보통 우리가 수학에서 쓰는 = 는 프로그래밍에선 할당 연산자이기 때문에 구분하기 위해 관계 연산자인 == 를 사용하여 왼쪽과 오른쪽이 같다 라는 의미를 수행하도록 한다.

 

위 코드를 자세히 보면 3가지 경우가 있는데 이들 중 하나는 굳이 물어볼 필요가 없다. 그 이유는 x > y 또는 x < y 면 나머지 하나는 당연하게도 x == y 인 것이다. 

 

따라서 이렇게 코드를 작성할 수 있다.

즉 else if 표현을 통해 불리언 질문을 하기 보다는 어짜피 남는 경우가 하나이기 때문에 else 를 통해 간단히 표현하는 것이다. 즉 앞서 작성한 else if 보다 더 효율적인 코드가 되는 것이다. 따라서 보다 적은 메모리를 필요로 하는 것이고 이는 속도의 측면에서 이득을 가져다 준다.

 

● loop

 

어떤 내용을 계속해서 반복하는 의미를 가진 루프를 표현한 이미지이다. while 과 불리언 표현을 통해서 {  } 안의 내용을 계속해서 반복한다는 의미이다.

C에서 loop 를 구현할 때는 불리언 표현을 통해 성립 조건을 정해줘야 하는 것이다. 답이 1 혹은 true 혹은 참, 네 로 나올 수 있는 질문을 던져줘야 한다.

무한적으로 반복하기 위해서는 성립 조건이 단순히 참인 표현을 넣어주면 된다. 따라서 (true) 라고 질문을 던져줌으로써 계속해서 hello world 가 출력되는 코드이다.

 

또 다른 loop 를 살펴보자. 특정 횟수만 반복하는 loop 이다.

먼가를 50번 반복하는 loop를 만들기 위한 방법으로 우선 counter 라는 변수에 0 값을 초기화 할 수 있다 하지만 counter는 길기 때문에 보통 정수를 나타내는 변수 i 를 사용한다.

따라서 int i = 0; 으로 변수 i 를 0으로 초기화 하고, 

그리고 질문을 계속해서 던져줌으로써 물어보는 것이다. i < 50 일때 hello world 를 출력하도록 하는 것이다.

하지만 여기서는 아직 논리가 완성되지 않았다. 여기서 { } 내용이 50번 반복되기 위해서는 무엇을 추가 해야할까?

바로 i 를 1씩 증가시키는 것이 필요하다. 따라서 i = i + 1; 혹은 i += 1; 혹은 i++; 를 추가하여 i를 매 반복마다 1씩 증가시킴으로써 i 가 0 부터 49 까지 내용이 출력되고 50이 되는 순간 반복을 멈추도록 하는 것이다.

 

위 코드의 논리의 순서는 다음과 같다.

i 를 0으로 설정하고

i 가 50 보다 작으면 다음을 수행한다.

i 가 50보다 작으니 hello world 를 출력하고

i 를 1 증가시킨다. 따라서 i 는 1이 된다.

 

다시 위로 돌아와서 

i 가 50보다 작으면 다음을 수행한다.

i 는 1이니 50보다 작다. 따라서 hello world 를 출력하고

i 를 1 증가시킨다. 따라서 i 는 2가 된다.

 

이 패턴을 반복하고 반복해서 i 가 50이 되면 loop 의 불리언 표현 질문에 거짓이 되기 때문에

반복을 멈추는 것이다.

 

C에서는 이런 논리 구조를 만들어서 뭔가를 특정 횟수만큼 반복하는 기능을 구현한다.

 

이와 같은 논리를 구현하는 또 다른 방법인 for 문이 있다.

for 문은 while 문보다 훨씬 기계적이다. while 문에서 구현했던 논리 구조를 (    ) 안에 코드 한줄로 자동화 한다.

for 문 (   ) 안에는 3개의 인자를 받는다. 

첫 인자는 변수를 초기화한다.

두번째 인자는 계속해서 묻고자 하는 불리언 표현이다.

세번째 인자는 변수를 어떻게 수정할 것인가에 대한 내용이 들어간다.

 

이렇게 코드를 while 문 과는 다르게 4줄로 줄이게 된다. 둘다 정확하고 같은 일을 수행한다.

for 루프의 논리 구조는 다음과 같다.

먼저 첫번째 인자를 수행하고

다음으로 두번째 인자를 수행한다. 두번째 인자인 불리언 표현에 대해 참이라면 

그 다음으로 {   } 내용을 수행하고 불리언 표현에 대해 거짓이라면 {   } 내용을 수행하지 않고 for 문을 빠져나간다.

마지막으로 세번째 인자를 수행하는 방식이다. 

이 논리 구조가 계속해서 반복된다. 변수의 값에 대한 질문인 불리언 표현이 거짓이 될때까지..

 

※ 물론 for 문에서도 변수를 for 문에 앞서 설정한 뒤 사용할 수도 있다.

하지만 while 문에서는 반드시 변수를 while 문 전에 설정해주고 그 변수에 대한 불리언 질문을 해줘야 한다.

 

 

자료 출처 : 부스트 코스 - https://www.boostcourse.org/cs112/lecture/119007?isDesc=false