상세 컨텐츠

본문 제목

for와 while문, 왜 반복문은 2개가 있을까??(C언어 고찰)

CS지식 학습

by Tabris4547 2023. 9. 23. 10:11

본문

728x90

프로그래밍 언어는 다양하지만

문법의 틀은 큰 관점에서 다 같습니다.

프로그래밍을 배울 때 본격적으로 난이도가 높아지는 부분이

바로 반복문에 대한 부분입니다.

대부분 이렇게 배웁니다.

"반복문에 종류는 for랑 while 2개가 있다.

각자 어떻게 쓰고 얘는 이렇게 쓴다"

저같은 경우에는 for를 더 선호해서

한동안 for만 주구장창 썼습니다.

그러다가 C언어를 다시 공부하면서

이런 의문이 들었습니다.

"걍 하나만 있으면 안 되나?

둘이 동작이 같은데

왜 굳이 2개를 만들었지?"

 

이런 생각이 든 이유

 

언어를 개발하는 사람입장에서 생각을 해봤을때에

같은 기능을 가진 걸 2개 만들면 그 만큼 힘이 들어갑니다.

프로그램 코드를 컴퓨터에 동작하기 위해서는

컴파일 과정을 거쳐야합니다.

예를들어서

 

#include<stdio.h>

 

int main(){

     printf("hello world");

}

이런 간단한 프로그램이 있다고 가정해보겠습니다.

컴파일을 돌릴 때에는 

#include->전처리구나. <>안에 있는 헤더파일을 포함시켜야겠다.

miain()->함수중에 main이네. 이게 있으니 프로그램이 실행되고. {}보고 함수 범위를 나눠야지.

printf()->printf라는 함수구나. 저 안에 인자가 printf규칙에 맞게 들어갔는지보자

 

간단하게 설명하면 저렇게 의미를 해석하는 과정을 거칩니다.

지금은 간단한 프로그램 예를 설명했지만

함수가 복잡해지고 기능이 많아지면 그에 대한 해석이 더 필요합니다.

 

for라면 

1. 코드를 읽다가 for라는 글짜가 보이면 for문으로 인식한다.

2. for뒤에 ()가 있는지 체크한다

3. ()안에 ; ; ;가 세 개 있는지 본다

4. 증감문,종료문에 대해서 설정을 잘했는지 본다

5. {}가 잘 묶였는지 확인한다

이런 과정을 거칠 것입니다.

 

while이라면

1. 코드를 읽다가 while이라는 글짜가 보이면 while문으로 인식한다.

2. while뒤에 ()가 있는지 본다

3. ()안에 조건문을 해석한다

4. 조건문 안의 인자,함수가 선언이 되었는지 확인한다.

5. {}가 잘 묶였는지 확인한다

이렇게 해석하는 과정이 있을 겁니다.

 

제가 가진 의문은 이 지점에서 나왔습니다.

"내가 컴파일러를 개발하는 사람이라면

이 작업이 힘들었을 거 같다.

for문법과 while문법이 다르기 때문에

그에 대한 세세한 차이를 넣어야한다.

근데 실제적으로 동작하는 것도 같고

성능도 거의 비슷한데

둘을 따로 만들어서

힘들게 프로그램을 만들 필요가 있을까??"

 

C언어에서는 차이가 있을까?

https://3colored.tistory.com/5

 

반복문 속도 비교 (while, for, iterator)

기 최근 생각없이 웹서핑을 하던 중 다음과 같은 글을 발견하였다. 해당 글 링크: http://www.tipssoft.com/bulletin/board.php?bo_table=story&wr_id=56 승 결과에서 몇 가지 이해할 수 없는 부분이 있어서 직접 수

3colored.tistory.com

반복문에 대한 떡밥은 프로그래머들 사이에서도 있었습니다.

구글링해보니 시간차이가 존재한다고 나와있네요.

자바라든가 파이썬 등 다른 언어에서는

while쪽이 좀 더 빠르게 동작한다는 결과도 있었습니다.

 

또, 파이썬같이 for문에 특별한 기능이 있는 경우도 있었습니다.

예를들면 배열을 출력할 때

 

a=[[1,2],[3,4],[5,6]]

for x,y in a:

    print(x,y)

 

이런 식으로 간단하게 반복문 내부 리스트의 인자를 페어로 출력할 수 있습니다.

 

이런 것들이 C언어에서는 크게 의미는 없었습니다.

우선 파이썬처럼 for문에 저런 기능이 있는 건 당연히 아니고.

성능차이가 있다고는 하지만...거의 무의미할 정도더군요.

어디 한쪽이 조금 더 빠르다라는 건 있지만

체감적으로 느낄 수준은 아닌거 같고,

심지어 어떻게 실험하냐에 따라서

for while속도 차이가 서로 역전될 수 있다고하니

성능도 크게 의미있는 것 같지 않았습니다.

 

 

그럼 왜 2개가 있을까?

"자가용있는 사람은 버스나 지하철 절대 안타?

왜 자차가 있는데 대중교통을 이용해??"

이 의문에 대한 질문을 하다가 들었던 답입니다.

우리가 목적지에 갈 때, 가는 방법은 다양합니다.

걸어서갈수도, 택시를 탈수도, 버스를 탈수도 있죠.

어떤 방법이 더 좋냐고 물었을 때

"상황마다 다르다"라는 결론에 도달합니다.

가까운 거리면 걸어가는 게 좋겠고

약속이 급하거나 지리를 잘 모르면 택시가 좋고

시간이 제법 여유있거나 돈이 부담되면 버스가 좋겠죠.

그럼 for랑 while로 돌아오면

반복문을 쓰는 방법이 달라 컴파일러 입장에서는 2개를 따로 만들어야하지만

그만큼 가치가 있다는 것이죠.

 

for문은 주로 '증감'을 판단하는 상황에서 많이 쓰입니다.

 

for(int i=0;i<10;i++){

 

}

이런 식으로, 인자값의 증감에 따른 반복문을 표현할 때에 좋습니다.

 

반면에 while은

 

while(example()){

}

특정 함수에 의해 제어되는 반복을 표현할 때에 좋습니다.

 

"그럼 while로 반복문 하나를 퉁쳐도 되잖슴??"

네, 물론 퉁칠 수 있죠.

while도 인자값 증감에 따라서 제어가 가능하니깐.

하지만 가독성 측면에서는 for문이 증감을 보기가 더 좋습니다.

 

a=0;

while(a<10){

   //이 사이에 코드가 300줄 있다고 가정해보자

   a++;

}

while으로 증감에 의한 반복문을 나타냈습니다.

지금이야 코드가 간단하기 때문에 증감을 볼 수 있습니다.

하지만, 만약 증감 나타내는 것 이전에 코드가 엄청 많다면???

인자가 반복문을 돌면서 얼마만큼 증가하는지 보기 힘들것입니다.

 

마찬가지로 for문도 함수값에 의한 제어를 할 수 있습니다.

for( ;example(); ;){

 

}

이렇게 하면 쓸 수는 있는데, 실제로 써보니 은근 힘들어요.

for문 규칙에 맞게 조건부에 넣어야하는데

몇번쨰 ;뒤에 넣어야하는지 헷갈리기 쉬울 거 같습니다.

 

비슷한 케이스, if와 switch

 

이렇게 같은 기능이지만 사용자 편의를 위해서

각각 쓰는 방법이 다른 것으로

if와 switch가 있었습니다.

둘 다 조건에 따라서 동작을 수행한다는 컨셉은 같지만

if->조건문을 좀 더 자세하게 적을 수 있다.

switch->다양한 기능에 대한 케이스를 나눌 수 있다.

라는 각각의 장점이 있었습니다.

 

정리하면서 느꼈던 점

 

예전에는 무지성으로

"반복문은 for랑 while이 있다"라고만 입력했었는데

왜 굳이 2개나 만들었지?라는 생각을 하면서

생각을 확장할 수 있었습니다.

단순히 기능을 잘 쓰는 것보다도

왜 이런 게 만들어졌는지 고민해보는 것만으로도

공부할 게 많아진다는 걸 깨달았습니다.

728x90

관련글 더보기

댓글 영역