본문 바로가기

별걸다하는 IT/프로그래밍언어

[C, C++, Java 등 언어 공통] 반복문 상세설명!(for, do while, 향상된 for문 사용법, 차이점 및 실행 순서)

[C언어, C++언어 완전정복 목차 링크!]

문득 그런 날이 있지 않나요? 아무것도 하기 싫은날~~~ㅎㅎㅎㅎㅎ

그렇다고 가만히 있자니 시간이 아깝구

블로그 포스팅을 씁니다. ㅎㅎㅎㅎ

참고로 자바나 C언어나 C++이나 문법이 대부분 동일하기 때문에 예시는 번갈아가면서 모두 익힐 수 있도록 했어요 ㅎㅎ 사실 어떤 언어든지 그건 도구일뿐 목적은 아니니까요 ㅎㅎ

 

반복문

이번 포스팅은 기초 중에 기초!! 반복문에 대해 포스팅할게요.

작업 자동화! 최근에도 이곳 저곳에서 일정한 작업을 자동으로 기계가 많이 수행해주고 있죠.

반복문은 어떤 작업이 반복적으로 수행되도록 제어할 때 사용해요.

 

반복문은 기초지만 진짜 중요도가 짱 높아요. 소요되는 돈이 다 반복문에서 결정난다고 해도 과언이 아님..

나중에~ 알고리즘 하면서 어떻게 하면 효율적으로 반복문을 사용할 수 있을지 고민하는 자신의 모습을 발견하게 될꺼예요...(머리가 지끈ㅎㅎ)

 

[C언어]

자 모니터에 'Hello world!'를 10000번 출력하고 싶어요. C언어를 예로 들면 출력함수가 printf이므로

printf("Hello World!"); ///C언어
printf("Hello World!");
printf("Hello World!");
....

이걸 10000번 쓰면 되겠죠. 

[Java언어]

System.out.println("Hello World!"); //자바의 출력함수
System.out.println("Hello World!");
...

노가다... 하지만 이거야 뭐.. 우리에겐 Ctrl+C, Ctrl+V가 있으니까 어렵지 않을 수도 있습니다. 하지만 만약에 "2*1= 2", "2*2= 4" 이렇게 매 줄 구구단을 출력하고 싶다면..? 숫자가 바뀌어서 복붙도 못해요 ㅎㅎ 노가다가 배로 뜀...

 

프로그래밍 언어에서는 이를 for 와 while 이라는 키워드로 일정한 규칙을 자동으로 반복해줄 수 있습니다. 즉 컴퓨터에게 명령하는 명령어예요

 

1. while문

while문부터 먼저 살펴볼까요? while문은 반복을 할까 말까?를 특정 조건을 기준으로 판단해요!

조건이 맞으면 수행하고 조건이 틀리면 반복되는 loop구문을 빠져나옵니다!

'while(조건)' 이렇게 while 옆 괄호 사이에 조건을 넣어줍시다.

int num = 0;
while(num<3)
{
    printf("Hello World!\n"); //C언어 출력함수 
}

자 num은 처음에 초기값이 0 이예요. num<3을 만족하기 때문에 Hello World를 출력하겠죠!!

눈치채셨겠지만, while문은 소괄호 안에는 반복의 조건을 명시하고, 이 조건이 만족되는 동안 중괄호 안에 존재하는 코드가 반복 실행되는 구조를 가집니다.

 

실행 순서!

1. 첫 라인에서 num을 초기화하고

2. 두 번째 라인에서 while을 만나면 ()안의 조건을 확인합니다

3. 중괄호 안의 내용을 수행해요

4. 중괄호 닫기를 만나면 다시 두 번째 라인에 있던 while문으로 돌아가서 반복합니다.

 

근데 여기서 문제는 !!! num은 계속 3보다 작잖아요 즉 이 실행 반복을 빠져나갈 수가 없습니다 ㅠㅠ 영원히 끝나지 않는 무한루프에 빠져버려요.(실제로는 운영체제가 중간에 이상함을 느끼고 제지를 걸긴 하지만ㅎㅎ) 반복문을 사용할 때에는 무한루프의 가능성을 꼭 조심해주어야 합니다.

int num=0;
while(num<3)
{
    System.out.println("Hello World"); //자바 출력함수
    num++; //조건을 판별하는 변수가 변해야 무한루프를 탈출할 수 있어요!
}

출력 결과

num++은 참고로 num 값에 1을 증가시켜라! 라는 명령이예요. ㅎㅎ num이 계속 증가함으로써 언젠가는 3보다 같거나 커지겠죠?ㅎㅎ

 

2. do- while문

do while문은 말그대로 먼저 do!! 먼저 일단 실행하고 조건을 뒤에 확인하는거예요. ㅎㅎㅎ

int num=0;
do
{
    cout<<"Hello World\n"; //C++언어 출력함수
    num++;
}while(num<3);

while(조건)이 뒤로 간 것을 볼 수 있죠?

이럴 경우 일단 Hello World를 출력하고 num을 증가시킨 후, 조건을 판별해요.

즉 앞에는 num=0일때 조건을 판별하고 알고리즘으로 들어갔다면, 이번은 알고리즘을 수행하고 num=1일 때 조건을 판별하는 거죠. 똑같은 while문 예시를 do while문으로 변환한 것처럼 while문과 do while문은 상호변환이 가능합니다.

다만, while문과 다르게 세미콜론이 조건식 뒤에 붙으니, 끝에 세미콜론을 빠뜨리지 않도록 주의해주세요

 

while vs do while

그러면 언제 do while을 쓰고 언제 while을 사용하나요?

사실 서로 변환이 가능하기 때문에 굳이 언제 얘를 써야하고 얘를 쓰지말아야한다 이런건 없습니다. 편의에 따라 사용하시면 돼요. 일반적인 경우 while을 사용하는데 가끔 코딩을 하다보면 do while이 편리하게 사용될 때가 있어요. 반복영역이 무조건 한 번 이상 실행되어야 할 경우 do while을 많이 사용합니다.

한 예로, 그런 경우 있잖아요, 종료하시려면 0번을 눌러주세요~! 0번을 누르기 전에는 계속 반복되는 겁니다.

import java.util.Scanner;
public class Main{	
    public static int num;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in); //입력받기 위한 클래스예요
		num = sc.nextInt(); //일단 입력을 받아야지
		while(num!=0) { //입력받아야고 나서야 입력받은게 0인지 아닌지 판별할 수 있지!
			System.out.println(num); //입력받은게 뭔지 화면에 출력해주고
			num = sc.nextInt(); //다시 새로 입력받는거야
		}
    } 
}

물론 이렇게 while문으로 반복을 받아도 되지만, 그럴 경우, nextInt 앞에 일단 수행해줘야 조건을 만들 수 있잖아요. 근데 만약에 여기 횟수 조건이 더 붙었다! 그러면 반복되는 작업의 경우 실제 수행되는 반복수보다 -1이 되니까 헷갈릴 수도 있어요 ㅎㅎ 

근데 do while문을 사용하면

import java.util.Scanner;
public class Main{	
    public static int num;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in); //입력받기 위한 클래스예요
		do{
			num = sc.nextInt();
			System.out.println(num);
		}while(num!=10);
    } 
}

이렇게 훨씬 간편해질 수 있습니다.

3. for문

다음 for명령어에 대해 알아볼게요! while문과 똑같이 반복을 위한 키워드예요. 근데 for문은 while문과 달리, 반복을 위한 조건과 연산등을 한 데 묶어서 만든 반복문이예요. 한 예로 while문에서는 무한루프에 걸리지 않기 위해, 즉 조건을 거짓으로 만들기 위해서 중괄호 마지막에 num++ 이렇게 영향을 미치는 요소에 변화를 주었죠??

for문은 한 라인에 얘네가 다 들어가요

for문 문법!

문법은 이와 같습니다.

1. while문과 마찬가지로 먼저 초기화를 진행하고,

2. 조건에 부합하는지 판별합니다. 조건의 결과가 true면 

3. 중괄호로 들어가 내용을 수행하고!!

4. 마지막 증감식을 수행합니다.

 

어디 한번 사용 방법을 코드로 볼까요?

for (var num = 0; i < 3; num++) { //자바스크립트 예시입니다.
  alert(Hello World!);
}

이번엔 예시를 자바스크립트 언어로 들어봤어요 ㅎㅎ 자바스크립트는 'var'이라는 키워드가 타입을 나타냅니다.

alert은 경고창으로 띄울 때 사용하는 함수예요.

while문이랑 똑같은 역할을 하는데, 첫 라인에서 수행되었던 초기화와 마지막 라인에서 수행했던 num++가 모두 for한 라인에 들어간 것을 알 수 있어요!

for (int num=0; num<3; num++) //C++언어의 경우
   cout<<"Hello World\n";

만약 수행해야 할 로직이 한 줄밖에 없다면 이렇게 중괄호를 생략할 수 있습니다. (while문도 마찬가지예요)

 

초기화

반복문에 사용될 변수를 초기화하는 부분입니다. 처음에 한 번만 수해왜요. 보통 변수 하나로 for문을 제어하지만 둘 이상의 변수가 필요할 때는 아래와 같이 ','를 구분자로 변수를 초기화하면 됩니다. ㅎㅎ 단 두 변수의 타입은 같아야해요.

for (int i=1, j=0; i<=10; i++) { ... } //초기화하는 변수가 2 개!!

참고로 초기식은 생략하고 while문의 에시처럼 앞으로 뺄 수 있습니다.

 

조건식

while문 괄호 안의 조건도 마찬가지이지만 true값을 가질 때 수행해요. 여기서 true는 1을 의미합니다. 

while(1) {  ... } 
//이렇게 하면 무한 반복이겠죠?? 하지만 나중에 break라는 키워드로 빠져나오는 방법도 있습니다.

그리고 while문에서는 조건을 절대 생략할 수 없습니다. while(1)이던, while(true)이던 넣어줘야해요.

그런데 while문과 다르게 for문에서는 조건식을 생략할 수 있어요.

for( ; ; ){ .. } //조건식이 항상 참임을 뜻합니다.

 

증감식

반복문을 제어하는 변수의 값을 증가 또는 감소시키는 식입니다. 매 반복문마다 변수의 값이 증감식에 의해서 점진적으로 변하다가 결국 조건식이 거짓이 되어서 for문을 탈출하죠.ㅎㅎ

마찬가지로 ','를 이용해서 두 증감을 하나로 연결해서 사용할 수 있습니다.

for(int i=1, j=10; i<=10; i++, j--){...}

증감식도 생략 가능해요 ㅎㅎ

for(int i= false; i==true; ){ //이렇게 증감식을 생략하고
   if( ... )
      i = true;  // { ... } 안에 넣어서 작성할 수도 있어요
 }

이 예제에서는 플러스 마이너스가 아니라 증감이라고 정확히 말하기는 좀 그렇지만?ㅎㅎ

하튼 이렇게 생략하고 중괄호에서 반복문을 제어하는 변수의 값에 변화를 줄 수 있습니다. 

 

for문과 while문의 구조 비교?

for문과 while문의 비교 사진

4. 향상된 for문?

기존보다 편리한 방법으로 발전된! 정말 향상된 for문의 문법을 말합니다.

배열과 찰떡궁합이예요. 배열이나 컬렉션에 저장된 요소에 편리하게 접근하기 위해 나온 문법입니다.

그런데 이 향상된 for문은 언어마다 조금씩 차이를 가지고 있어요. 사용할 때 문법 조심!

 

Java를 예시로 볼게요.

배열에 있는 수를 하나하나 출력하려고 합니다. 그럴 경우 기존 for문으로 코드를 작성해보면 아래와 같습니다.

int[] arr = {10,20,30,40,50};
for(int i=0; i<arr.length; i++){
    System.out.println(arr[i]);
}

하지만 향상된 for문을 사용하면 아래처럼 더 간결하게 사용할 수 있어요! Java에서는 ':'를 사용합니다.

int[] arr = {10,20,30,40,50};
for(int i: arr){
   System.out.println(arr[i]);
}

알아서 배열 처음부터 끝까지 반복해주기 때문에 우리가 배열의 길이를 신경쓸 필요도 없습니다.ㅎㅎ

 

[C++언어의 경우]

#include<iostream>
using namespace std;
int main() {	
	int arr[] = { 10,20,30 };
	for (int num : arr) {
		cout << num << endl;
	}
	return 0;
}

파이썬의 경우 이 향상된 for문을 기본으로 제공해요. 파이썬은 in이라는 키워드를 사용하네요 

파이썬 for문

 

break?

break라는 명령어가 있는데 반복문이랑 짝짝꿍인 녀석이기 때문에 같이 알아두는게 좋아요

break를 만나면 반복문을 탈출합니다!! 조건이 만족하지 않았어도 탈출해요!

for(int num=0; num<10; num++){
    if(num==5)
       break;
}

num이 10까지 안가고 5가 되면 break에 의해 탈출하겠죠? 참고로 continue는 계속하다! 아래 로직을 건너뛰고 다음 반복으로 이어갑니다.

continue, break에 대해서는 나중에 포스팅에서 따로 자세히 다뤄볼게요

 

오늘 준비한 내용은 여기까지입니다! 다음 시간에는 이중 반복문에 대해서 살펴보도록 해요 ㅎㅎ 

도움이 되셨길 바라면서 이만 뾰료룡!

광고보답, 하트, 댓글은 더 좋은 정보를 제공하고자 하는 주인장에게 큰 힘이 됩니당