나는 프로그래밍과 컴퓨터의 발달한 가장 큰 이유는 귀찮은 작업을 반복하지 않고 자동적으로 처리해주기 위한 갈망에 의해 만들어 졌다고 생각한다.
그런 관점에서 반복문은 프로그래밍 언어에는 없어서는 안될 문법 중에 하나이다. 특정 작업을 반복함으로서 능률을 올릴 수 있다. 반복문을 학습해본다.
- for문
- while문
for문
반복문을 만들 때 가장 중요한 것은 어떤 작업을 몇번 돌릴것인가? 이다.
예를 들어 “안녕하세요” 문자열을 5번 실행하여 찍고 싶을 때 이런 방법을 이용할 수 있다.
class forClass{
public static void main(String[] args){
//반복문을 사용하지 않는 방법
System.out.println("안녕하세요");
System.out.println("안녕하세요");
System.out.println("안녕하세요");
System.out.println("안녕하세요");
System.out.println("안녕하세요");
}
}
안녕하세요
안녕하세요
안녕하세요
안녕하세요
안녕하세요
결과는 정상적으로 5번이 출력된다. 하지만 10000개의 “안녕하세요” 문자열을 출력하고 싶다면 어떻게 해야할까?
예제처럼 System.out.println
을 10000번을 써도 출력은 되겠지만, 반복적인 코드가 너무 많기 때문에 좋은 방법은 아니다.
이럴때 반복문을 이용하면 보다 쉽고 간단하게 문자열을 출력할 수 있다. 반복문에서 가장 중요한 것이 어떤 작업을 몇 번 돌릴 것인가? 라고 설명했다. 우리는 지금 “안녕하세요”문자열을 출력 시키는 작업(어떤 작업)을 1000번(몇 번) 돌릴 것이다.
class forClass{
public static void main(String[] args){
//반복문을 사용하는 방법
for(int i=0; i<10000; i++){ //몇 번
System.out.println("안녕하세요 " + i); //어떤 작업
}
}
}
안녕하세요 0
안녕하세요 1
.
.
.
안녕하세요 9999
단 3줄만으로 안녕하세요를 10000번 찍는 코드를 만들었다. for문에 대해 더 살펴보자.
for문의 사용방법
for( 초기화; 조건문; 연산식){
반복이되는 로직(처리)
}
이후 로직
- 초기화: 루프가 돌아가는 상태를 확인하기 위한 변수를 선언하거나 초기화한다.
- 조건문: 초기화 단계에서 설정된 변수가 어떤 조건을 만족할 때 반복문을 실행할 것인지 결정한다.
- 연산식: 변수가 증가하거나 감소하는 방식을 결정한다. 이 연산에 따라 조건문을 만족할지 안할지 결정된다.
- 진행 순서
- (초기화) > (처리) > (연산식) > (조건문 검사) > (참?) > (처리) > (연산식) > (조건문 검사) > (참?) > (처리) │ └>(거짓?) > (반복문을 탈출) > (이후 로직 수행)
- ※초기화는 한번만 수행한다.
예제 코드
class forClass{
public static void main(String[] args){
int i;
for (i=0; i<10; i++){
System.out.println("i의 값이 증가해요! "+i); //i
}
System.out.println("탈출 후 i의 값: "+i);
System.out.println("이 후의 코드");
}
}
i의 값이 증가해요! 0
i의 값이 증가해요! 1
i의 값이 증가해요! 2
i의 값이 증가해요! 3
i의 값이 증가해요! 4
i의 값이 증가해요! 5
i의 값이 증가해요! 6
i의 값이 증가해요! 7
i의 값이 증가해요! 8
i의 값이 증가해요! 9
탈출 후 i의 값: 10
이 후의 코드
변수 i
는 루프의 상태를 나타내기 위해 선언되고 사용된다.
i
가 0으로 초기화 되어있고, 루프가 한번 돌때 마다 i
의 값을 1씩 증가시킨다.
그러다 i
가 9에서 10으로 증가되고 더이상 조건문을 만족시키지 못하기 때문에 반복문을 빠져나와 그 이후의 코드를 실행한다.
탈출 후의 i
값을 보면 10이 출력된다.
for문의 활용
class forClass
{
public static void main(String[] args)
{
//1부터 10까지의 합
int sum = 0;
for (int j=1; j<=10; j++)
{
sum = sum+j;
}
System.out.println("1부터 10까지의 덧셈: "+sum);
//감소방법 사용은 가능하나 잘 사용하지 않는다
for (int k=10; k>0; k--)
{
System.out.println("숫자가 감소해요!! "+k+" !!!");
}
//루프 변수가 2씩 증가한다.
for (i=0; i<10; i+=2)
{
System.out.println("2씩 증가해요!! "+i);
}
//초기화 부분과 연산 부분을 밖으로 빼도 사용가능하다.
int count =0;
for (; count<10; )
{
System.out.println("증감 연산이 밖에 있어도 가능해요! "+count);
count++;
}
//루프 변수를 2개 초기화해서 사용하는 것도 가능하다.
for (int j=0, k=10; j<10; j++, k--)
{
System.out.println("j: "+j+"\tk: "+k);
}
//1~100 사이에 짝수의 합을 구하라
int even = 0;
for (int j=1; j<=100; j++)
{
if(j%2==0){ //if(j%2==1) 조건만 변경하면 홀수의 합도 구할수 있다.
even+=j;
}
}
System.out.println("짝수의 합: "+sum);
}
}
1부터 10까지의 덧셈: 55
숫자가 감소해요!! 10 !!!
숫자가 감소해요!! 9 !!!
숫자가 감소해요!! 8 !!!
숫자가 감소해요!! 7 !!!
숫자가 감소해요!! 6 !!!
숫자가 감소해요!! 5 !!!
숫자가 감소해요!! 4 !!!
숫자가 감소해요!! 3 !!!
숫자가 감소해요!! 2 !!!
숫자가 감소해요!! 1 !!!
2씩 증가해요!! 0
2씩 증가해요!! 2
2씩 증가해요!! 4
2씩 증가해요!! 6
2씩 증가해요!! 8
증감 연산이 밖에 있어도 가능해요! 0
증감 연산이 밖에 있어도 가능해요! 1
증감 연산이 밖에 있어도 가능해요! 2
증감 연산이 밖에 있어도 가능해요! 3
증감 연산이 밖에 있어도 가능해요! 4
증감 연산이 밖에 있어도 가능해요! 5
증감 연산이 밖에 있어도 가능해요! 6
증감 연산이 밖에 있어도 가능해요! 7
증감 연산이 밖에 있어도 가능해요! 8
증감 연산이 밖에 있어도 가능해요! 9
j: 0 k: 10
j: 1 k: 9
j: 2 k: 8
j: 3 k: 7
j: 4 k: 6
j: 5 k: 5
j: 6 k: 4
j: 7 k: 3
j: 8 k: 2
j: 9 k: 1
짝수의 합: 55
반복문의 사용되는 변수를 어떻게 활용하는지도 중요한 과제 이다. 후에 배열을 루프 변수와 함께 사용하는 법을 배운다. 루프 변수를 반복문 블럭에서 활용하는 법을 잘 알아야 한다.
while 문
반복문의 종류에는 for문과 while문이 있다. 하지만 두 반복문의 차이는 초기화, 조건문, 연산자를 지정하는 위치만 조금 다를뿐 그 외의 사용법은 거의 같다. 처음 반복문을 연습하는 좋은 방법은 for문으로 작성한 코드를 while문으로 고쳐보고 while문을 다시 for문으로 고쳐보는 것이다. 이런 연습을 많이 하면 반복문에 대한 개요와 동장 원리를 쉽게 이해할 수 있다.
while문의 사용방법
while (조건문){
반복할 코드
연산식
}
이후 로직
for문에 들어갔던 요소는 while문에도 빠짐없이 들어있다. 다만 위치만 변경됐을 뿐이다. 하지만 위치를 외울 필요없이 프로그램이 돌아가는 순서대로 이해하면 된다. 루프를 돌리기 위한 변수를 선언하고 조건문을 검사하고 조건문이 만족하지 않을 때 까지 연산을 진행하고 루프가 끝나면 그 이후의 로직을 수행하면 된다.
- 진행순서: (초기화) > (조건문) > (참?) > (처리) > (연산) > (조건문) > (참?) > (처리) > (연산) > … └>(거짓?) > (반복문을 탈출) > (이후 로직 수행)
“안녕하세요”를 5번 찍는 for문을 while문으로 변경해 보자.
class forClass{
//안녕하세요를 10000찍는 반복문
public static void main(String[] args){
for(int i=0; i<5; i++){
System.out.println("안녕하세요(for) " + i);
}
int w =0 ; //초기화
while(w<10){ //조건문
System.out.pirntln("안녕하세요(while) " + i)
w++; //연산식
}
}
}
안녕하세요(for) 0
안녕하세요(for) 1
안녕하세요(for) 2
안녕하세요(for) 3
안녕하세요(for) 4
안녕하세요(while) 0
안녕하세요(while) 1
안녕하세요(while) 2
안녕하세요(while) 3
안녕하세요(while) 4
while문에서 반복 변수로 사용할 w
를 선언후 초기화한다.
while문을 들어갈때 조건문을 검사하고 반복 로직을 실행한다.
처리를 하고 연산을 진행한다. 연산을 하는 위치는 코드에 따라 유연하게 변경이 가능하다.
while문의 활용
class whileClass{
public static void main(String[] args){
//무한 루프
//종료가 되지 않는 반복문을 만들 수 있다.
//프로세스가 돌때 이 무한루프를 이용한다.
//하지만 종료 시점을 설정해주지 않으면 프로그램이 영영 끝나지 않을 수 있다.
int count = 0;
while(true){
System.out.println("count: "+count);
count++;
if(count == 2000) break; //break는 현재 진행중인 루프를 강제 종료시킨다.
//조만간 자세히 다룰 예정
}
/*
*
**
***
****
*****
****
***
**
*
위에 보이는 문자가 출력되도록 while문을 사용해 작성하시오.
/**/
int w1 =0; //세로로 별을 찍을 때 사용하는 루프 변수
int w2 =0; //가로로 별을 찍을 때 사용하는 루프 변수
int temp =0; //가로로 별을 몇개나 찍을 지를 결정 변수 -> 1부터 5까지 증가했다가 감소한다.
while(w1 < 9){ //*문자들을 세로로 찍기 위해 9번 반복
if(w1 < 5) temp = temp+1; //5번째 반복문 까지는 temp의 수를 1씩 증가시키면서 반복
else temp = temp-1; //5번째 이후는 temp의 수를 1씩 감소시키면서 반복한다.
w2 = 0;
while(w2<temp){
System.out.print("*"); //*문자들을 가로로 찍기 위해 temp만큼 반복
w2++;
}
System.out.println();
w1++;
}
}
}
count: 0
count: 1
count: 2
.
.
.
count: 2000
*
**
***
****
*****
****
***
**
*
do while문
do while문은 while문의 종류로서 while 문과 딱 하나의 차이를 보이고 그 외의 사용법은 완전히 같다.
그 차이는 조건문을 검사하는 시점이 다르다는 것인데, while문은 초기화를 하고 바로 조건을 검사하지만, do while은 초기화후 반복할 코드를 한번 실행한 후 조건을 검사한다.
do while문의 사용 방법
초기화
do{
반복할 코드
연산식
}while(조건문);
이후의 코드
while 문과 가장 큰 차이점은 반복할 코드를 한번 실행한 후, 연산을 하고 조건을 검사한다.
class whileClass{
public static void main(String[] args){
int w = 0;
while(w > 0){
System.out.println("w는 0보다 큽니다");
w++;
}
}
}
위 코드를 실행하면 아무런 결과도 볼수 없다. 왜냐하면 변수 w
가 조건을 만족하지 못하기 때문에 코드 블럭이 실행되지 않는다.
class doWhileClass{
public static void main(String[] args){
int w = 0;
do{
System.out.println("w는 0보다 큽니다");
w++;
}while(w>0);
}
}
하지만 위의 코드를 실행시키면 무한루프에 빠지게 된다. 왜냐하면 조건을 검사하기 전에 출력을 하고 w
의 값을 증가 시켰기때문에 조건문을 검사할때 변수의 값은 1이다. 따라서 조건을 항상 만족하게 되어 무한루프에 빠지게 된다.
정리
do while은 무조건 한번을 실행하고 조건을 검사해야할 때 사용된다. do while문도 많이는 아니지만 적지 않게 사용되는 반복문 중에 하나이다. 특정 상황에 따라 for문, while문, do while문을 적절하게 선택해서 사용해야한다. 그리고 3가지의 반복문을 서로 바꿔보는 연습이 반복문을 이해하는 가장 좋은 방법이다.
- for문 : 반복해야할 횟수가 구체적으로 정의되어 있을 때 사용한다.
- ex) 10번 반복, 20번 반복 등
- while문 : 특정 조건에 부합할때까지 반복을 진행한다.
- Ex) 10개의 수를 모두 입력 받을 때까지 계속해서 반복(입력이 틀리면 다시 입력 -> 10번 이상의 반복을 하다가 10개가 다 입력되면 종료한다.)
- do while문 : 조건에 관계없이 한번 실행한 후, 특정 조건에 부합할때까지 반복을 진행한다.
Comments