본문 바로가기

Java 기본 문법 - 참조 서적 [이것이 자바다 - 한빛미디어]/2. 제어문

2. Java 자바 - 반복문 (for, while, do-while)

 

 

반복문에는 for, while, do-while 문이 있다.

 

for 문은 반복횟수를 알고 있을 때,

while 문은 반복 조건위주에 따라 반복할 때 사용된다.

 

 

1. for 문

형태


  for (1 초기화식; 2 조건식; 4 증감식) {

      3 실행문;

  }

 

1 초기화식 : 반복 횟수를 제어하는 변수 초기화식이 제일 먼저 실행된다.

 

2 조건식 : 조건식을 검사해서 true 이면 3 : 실행문을 실행, false 이면 for 문을 종료한다.

 

4 증감식 : 3 실행문이 모두 실행되면, 4 증감식을 실행한 후 다시 2 조건식을 검사한다.

    true 이면 3 실행문을 또 다시 실행하고, 다시 4 증감식을 실행을 반복한다.

 

 

ex) 1 ~ 10 까지 출력하는 프로그램

 

public class ForPrint1to10 {
    public static void main(String[] args) {
    	for (int i = 1; i <= 10; i++) {
        	System.out.println(i);
        }
    }
}

 

만약 초기화식이 필요 없는 경우, 생략이 가능하다.

 

for ( ; i <=100; i++)

 

초기화식은 둘 이상 가능하고, 증감식도 둘 이상 가능하다. (쉼표로 구분한다.)

 

for (int i = 0, j = 100; i <= 50 && j <= 50; i++, j--) { . . . }

 

초기화식에 사용되는 변수( i )는 for 문 블록에서만 유효한 지역 변수이다. (for 문이 끝나면 사라짐)

 

ex) 1 ~ 100 까지 합을 출력하는 프로그램

 

public class ForSum1To100Exam {
    public static void main(String[] args) {
    	int sum = 0;  //합계 변수
        
        for (int i = 1; i <= 100; i++) {
        	sum += i;
        }
        
        System.out.println("1 ~ 100 까지의 합 : "+sum);
    }
}

 

초기화식에 사용되는 루프 카운트 변수로 부동소수점을 사용하면 안된다!

 

public class ForFloatCounterExam {
    public static void main(String[] args) {
    	for (float x = 0.1f; x <= 1.0f; x += 0.1f) {
        	System.out.println(x);
        }
    }
}

 

0.1은 float 타입으로 정확히 표현할 수 없기 때문에, x에 더해지는 값은 실제 0.1 보다 약간 크다. (근사치)

 

따라서 루프가 9번만 실행된다. (x = 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.700005, 0.8000001. 0.9000001)

 

 

- 중첩 for 문 (구구단)

 

바깥쪽 for 문이 한 번 수행될 때 안쪽 for 문이 지정된 횟수만큼 수행된 후 다시 바깥쪽 for 문으로 돌아간다.

 

ex) 구구단 출력 프로그램

 

public class ForGuguTableExam {
    public static void main(String[] args) {
    	for (int m = 2; m <= 9; m++) {
        	System.out.println("=== "+m+" 단 ===");
            for (int n = 1; n <= 9; n++) {
            	System.out.println(m + " X " + n + " = " + (m * n));
            }
        }
    }
}

 

 

 


2. while 문

조건식이 true 일 경우에 계속해서 반복한다. 조건식에는 주로 논리 연산식이 온다.

false 일 경우 반복 멈추고 while 블록을 종료한다.

 

형태


  while (1 조건식) {

      2 실행문  <반복 영역>

  }

 

1 : 조건식이 true 이면, 2 : 실행문을 실행한 후, 다시 1 : 조건문을 검사한다.

1 : 조건식이 false 이면, while 문을 종료한다.

 

ex) 1 ~ 100 까지의 합 출력

 

public class WhileSumExam {
    public static void main(String[] args) {
    	int sum = 0;  // 합계 저장 변수
        
        int i = 1;    // 카운터 변수
        
        while(i <= 100) {
        	sum += i;
            i++;
        }
        System.out.println("1 ~ + (i-1) + " 합 : "+ sum);
    }
}

 

조건식의 결과가 항상 true 라면, 무한 루프를 돌게 된다. (while(true))

 

무한 루프시, while 문을 빠져나가기 위한 코드가 필요하다.

(true → false, break 문 이용)

 

* 키보드로 while문 제어하기

- 키보드에서 1, 2를 입력하면 속도를 증속, 감속시키고 3을 입력하면 프로그램 종료시키는 프로그램

 

키보드로부터 입력된 키 코드를 반환하는 메소드

 

int keyCode = System.in.read();

 

* 키보드 각 키가 가지고 있는 키코드

 

숫자 알파벳       기능키 방향키

0 = 48

1 = 49

2 = 50

3 = 51

4 = 52

5 = 53

6 = 54

7 = 55

8 = 56

9 = 57

A = 65

B = 66

C = 67

D = 68

E = 69

F = 70 

G = 71

H = 72

I = 73

J = 74

K = 75

L = 76

M = 77

N = 78

O = 79

P = 80

Q = 81

R = 82

S = 83

T = 84

U = 85

V = 86

W = 87

X = 88

Y = 89

Z = 90

a = 97

b = 98

c = 99

d = 100

e = 101

f = 102

g = 103

h = 104

i = 105

j = 106

k = 107

l = 108

m = 109

n = 110

o = 111

p = 112

q = 113

r = 114

s = 115

t = 116

u = 117

v = 118

w = 119

x = 120

y = 121

z = 122

Backspace = 8

Tab = 9

Enter = [CR=13, LF=10]

shift = 16

Ctrl = 17

Alt = 18

ESC = 27

Space = 32

PAGE UP = 33

PAGE DOWN = 34

← = 37

↑ = 38

→ = 39

↓ = 40

 

 

public class WhileKeyControlExam {
    public static void main(String[] args) {
    	boolean run = true;
        int speed = 0;
        int keyCode = 0;
        
        while(run) {
        	if (keyCode != 13 && keyCode != 10) {
        	// 엔터키가 입력되면, 캐리지리턴과 라인피가 입력되므로 값을 제외시킨다.
            	System.out.println(" ====================== ");    // 메뉴 생성
                System.out.println("1. 증속, 2. 감속, 3. 중지");
            	System.out.println(" ====================== ");
            	System.out.print("선택 : ");
            }
            
            keyCode = System.in.read();    // 키보드의 키 코드를 읽음 while문 일시 정지
            
            if (keyCode == 49) { // 1을 읽은 경우
            	speed++;
                System.out.println("현재 속도 = "+speed);
            } else if (keyCode == 50 {  // 2를 읽은 경우
            	speed--;
                System.out.println("현재 속도 = "+speed);
            } else if (keyCode == 51 {  // 3을 읽은 경우
            	run = false;
            }
        }
        
        System.out.println("프로그램 종료");
    }
}

현재 keyCode = System.in.read( ); 에서 입력을 기다리는 상태이다.

콘솔 창에 "1" 을 입력하고 엔터키를 누르면

while문이 3번 반복되고, keyCode = System.in.read( ); 에서 3번의 키 코드를 읽게 된다.

(1, 캐리지리턴, 라인피드)

 

첫 번째는 "1"의 키코드인 49, 두 번째는 엔터키의 캐리지리턴 13,

세 번째는 엔터키의 라인피드 10을 읽는다.

 

이후 다른 키를 받기 위해 다시 입력을 기다린다. (2를 입력해도 마찬가지)

 

"3"을 입력하면 run 변수가 false 되어 while 문이 종료되고 프로그램이 종료된다.

 

* System.out.println( );   // 출력 이후 다음 행으로 이동

  System.out.print( );       // 출력 이후 다음 행 이동하지 않음

 

 


3. do - while 문

블록 내부를 한번 실행 후, 조건식을 검사하여 반복 여부를 결정한다.

 

형태

 
  do {

      1 실행문;

  } while (2 조건식);

 

while( ) 뒤에는 반드시 세미콜론 ";"이 붙어야 한다.

 

1 실행문이 우선 수행된 후,

2 조건식을 검사, true 이면 1 실행문을 반복 수행하고, false 이면 do - while 문을 종료한다.

 

 


* 콘솔에서 입력한 문자열을 읽는 방법 (C 에서의 scanf ( ); 처럼!)

 

System.in.read( ); 메소드는 하나의 키 코드만 읽기 가능 (문자열 불가)

 

아래와 같이 Scanner 객체를 생성하고, nextLine( ) 메소드를 호출하면

콘솔에 입력된 문자열을 한 번에 읽을 수 있다.

 

nextLine( ); 메소드로 읽은 문자열을 저장하기 위해서는 String 변수가 필요하다 (inputString 변수)

 

 
  Scanner scanner = new Scanner(System.in);      // Scanner 객체 생성

  String inputString = scanner.nextLine( );           // nextLine( ); 메소드 호출

 

Scanner(클래스)를 사용하려면 import 문이 필요하다.

 

import java.util.Scanner;


 

ex) 키보드로부터 문자열을 입력받아 출력하는 프로그램

 

import java.util.Scanner;

public class DoWhileExam {
    public static void main(String[] args) {
            System.out.println("메시지를 입력하세요");
            System.out.println("종료하시려면 q를 입력하세요.");
        
            Scanner scanner = new Scanner(System.in);
            String inputString;
        
        do {
            System.out.print(">");
            inputString = scanner.nextLine();   //입력한 문자열 얻음
            System.out.println(inputString);
        } while ( !inputString.equals("q"); );     //문자열 비교 시 equals() 메소드 이용
        
        System.out.println();
        System.out.println("프로그램 종료");
    }
}

 

Scanner를 생성, nextLine( ) 메소드로 문자열을 읽는다.

 

! inputString.equals("q");      // 리턴한 결과를 반대로 바꾼다.

 

equals( ) 메소드는 inputString의 문자열과 "q"와 같으면 true, 그렇지 않으면 false 반환한다.

 

하지만, 논리 부정연산자에 의해 "q" 가 저장되어 있으면 false가 반환되어 do - while 문을 종료한다.

 

 


4. break 문

반복문 (for, while, do - while)의 실행을 중지할 때 사용된다. 또한 swich 문에서도 종료 용도로 쓰인다.

 

if 문과 함께 조건식에 따라 while, for 문을 종료한다.

 

ex) 주사위 6이 나오면 while 문 종료

 

public class BreakExam {
    public static void main(String[] args) {
    	while(true) {   // 무한루프
        	int num = (int)(Math.random() * 6) + 1;
            System.out.println(num);
            
            if (num == 6) {
            	break;      // 6이 나오면 종료
            }
        }
        
        System.out.println("프로그램 종료");
    }
}

 

반복문이 중첩되있는 경우 break 문은 가장 가까운 반복문만 종료시킨다.

 

만약 중첩된 반복문에서 바깥쪽 반복문까지 종료시키려면, 바깥쪽 반복문에 이름(라벨)을 붙인다.

 

이름:for ( ... ) { ... }  // 이름 붙이기

 

break 이름;   // 해당 이름의 반복문 종료

 

public class BreakOutExam {
    public static void main(String[] args) {
    
    	Outter:for (char upper = 'A'; upper <= 'Z'; upper++) {
        	for (char lower = 'a'; lower <= 'z'; lower++) {
            	System.out.println(upper + " - " + lower);
                if (lower == 'g') {
                	break Outter;
                }
            }
        }
        System.out.println("프로그램 실행 종료");
    }
}

 

 


5. continue 문

반복문 (for, while, do - while) 에서만 사용된다.

 

continue 문을 만나면 바로 조건식으로 이동한다.

 

형태

 
  for ( . . . ) { 

      . . .

      continue;   // 조건식으로 이동!

      X // 더이상 진행 안됨

  }

  while ( . . . ) {

      . . .

      continue;  // 조건식으로 이동!

      X // 더이상 진행 안됨

  }

 

break 문은 반복문을 아예 종료하지만,

continue 문은 종료하지 않고 다시 조건식으로 이동한다. (반복문은 계속 수행된다.)

 

특정 조건을 만족하는 경우, continue 문을 사용해서 이후 문장을 실행하지 않고 다음 반복으로 넘어간다.

 

ex) 1 ~ 10 사이 짝수만 출력

 

public class ContinueExam {
    public static void main(String[] args) {
    	for (int i = 1; i <= 10; i++) {
        	if (i % 2 != 0) { // 홀수인 경우!
            	continue;     // 다음 반복으로 넘어감
            }
            
            System.out.println(i);
        }
    }
}