Java/Java의 정석

Chapter 04 조건문과 반복문

계란💕 2022. 2. 19. 23:16

1. 조건문 - if, switch

  - 처리할 경우의 수가 많으면 if 보다 switch가 효율적이지만 if 보다 제약이 많다.

  1.1 if문

  - 결과가 참인 조건식을 만날 때까지 첫 번째 조건식부터 순서대로 평가한다.

<hide/>
package javaStudy;
import java.util.*;
public class FlowEx2 {
	public static void main(String[] args) {
		int input;
		System.out.print("숫자를 하나 입력하세요.>");
		Scanner scanner = new Scanner(System.in); 
		String tmp = scanner.nextLine(); // 화면 통해 입력받은 내용을 tmp에 저장
		input = Integer.parseInt(tmp); // 입력받은 문자열 tmp를 숫자로 변환한다.
		if( input == 0) {
			System.out.println("입력하신 숫자는 0입니다.");
		}if( input != 0) {
			System.out.println("입력하신 숫자는 0이 아닙니다.");			
			System.out.printf("입력하신 숫자는 %d입니다." , input);
		}
	}
}

  Note) 실행 결과

  - import java.util.* : Scanner 클래스 사용하기 위해 추가한다.

  - String tmp = scanner.nextLine() : 화면을 통해 입력받은 내용을 tmp에 저장한다.

  - Integer.parseInt(문자열) : 문자열을 숫자로 변환한다.

 

  1.4 중첩 if문

  1.5 switch문

  - 각 case마다 Break를 꼭 적어줘야한다.

  - 제약조건

    -> switch문의 조건식 결과는 정수 또는 String이어야 한다.

    -> case문의 값은 정수 상수(ex) ONE,  ONE은 final이 붙은 정수 상수이다.)만 가능하며, 중복되지 않아야 한다.

<hide/>
switch (조건식) {
	case 값1: 
		// 조건식의 결과가 값1과 같은 경우 수행될 문장들
		break;
	case 값2:
		// 조건식의 결과가 값2과 같은 경우 수행될 문장들
		break;
	default:
		// 조건식의 결과와 일치하는 case문이 없을 때 수행될 문장들
}

  Ex 4-7)

<hide/>
package javaStudy;
import java.util.*;
public class FlowEx7 {
	public static void main(String[] args) {
		System.out.print("가위(1), 바위(2), 보(3) 중 하나를 입력하세요.>");
		Scanner scanner = new Scanner(System.in);
		int user = scanner.nextInt();  //  화면 통해 입력 받은 숫자를 user에 저장한다.
		int com = (int)(Math.random() * 3) + 1; // 1, 2, 3 중 하나가 com에 저장된다.
		System.out.println("당신은 " + user + "입니다.");
		System.out.println("컴은 " + com + "입니다.");
		switch (user - com) {
			case 2: case -1:
				System.out.println("당신이 졌습니다.");
				break;
			case 1: case -2: 
				System.out.println("당신이 이겼습니다.");
				break;
			case 0:
				System.out.println("비겼습니다."); // 마지막 문장은 break 필요 없다.
		}
	}
}

  Note) 실행 결과

  - user: 사용자가 입력한 값, com: 컴퓨터가 생성한 난수 

  - 가위(1), 바위(2), 보(3)라고 했을 때,

    -> user - com = 1 또는 -2 인 경우: user승

    -> user - com  = -1 또는 2 인 경우: com승 

    -> user - com  = 0 : 무승부

 

  - Math.random() : 난수(임의의 수)를 얻기 위해 이용한다.

    ->  0.0과 1.0 사이의 범위에 속하는 하나의 double값을 반환한다.

    ->  0.0  <=  Math.random()  <  1.0

    -> 만약 1과 3 사이의 정수를 구하기 원한다면?

    (1) 각 변에 3을 곱한다.

        0.0  <=  Math.random() * 3  <  3.0

    (2) 각 변을 int형으로 변환한다.

        (int)0.0  <=  (int) (Math.random() * 3 )  <  (int)3.0

       0  <=  (int) (Math.random() * 3 )  < 3

    (3) 각 변에 1을 더한다.

        1 <=  (Math.random() * 3 ) + 1  <  4

 

  - 문자열.charAt(i): 문자열의 i번째 인덱스(0부터 시작)에 있는 문자를 가져온다

  - char타입은 값은 문자가 아닌 정수(유니코드)로 저장된다.

  - 따라서, 이처럼 char타입의 값도 switch문의 조건식과 case문에 사용할 수 있다. 

 

 

2. 반복문 - for, while, do-while

  2.1 for문

  • for, while 중에서 for는 반복 횟수를 알고 있을 때 적합하다.
  • for( 초기화; 조건식; 증감식 ){ 수행될 문장 }
    • 순서: 초기화 -> 조건식이 참일 때 -> 수행될 문장 -> 증감식
    • 순서: 초기화 -> 조건식이 거짓일 때 -> for문을 빠져 나온다.
  • for문의 세 가지 요소는 생략 가능하다. for(;;), 
    • 이 때, 조건식은 참이 된다.

 

  Note) 향상된 for문 (for each문)

    -> for( 타입 변수명 : 배열 또는 컬렉션 ){ 반복할 문장 }

    -> Arrays.stream().forEach(e -> {System.out.println(e);}); ...도 많이 쓴다.

    Ex)

<hide/>

String[] str = {"홍길동", "이순신", "세종대왕"};
Arrays.stream(str).forEach(e -> {
	System.out.println(e);
});

 

  Ex 4-22) for each문

<hide/>
package javaStudy;
public class FlowEx22 {
	public static void main(String[] args) {
		int [] arr = {10, 20, 30, 40, 50};
		int sum = 0;
		for(int i= 0; i < arr.length; ++i )
			System.out.printf("%d " , arr[i]);
		System.out.println();
		for(int tmp : arr) {
			System.out.printf("%d ", tmp);
			sum += tmp;
		}
		System.out.println();
		System.out.println("sum = " + sum);	
	}
}

  Note) 실행 결과

  - 배열 arr 의 모든 요소를 출력한다. 

  - for문 보다 간결하다. 

  - 그러나, for문과 달리 배열이나 컬렉션에 저장된 요소들을 읽어오는 용도로만 사용할 수 있다는 제약이 있다.

 

  2.2 while문

  - while(조건식){ 조건식이 참일 때, 반복될 문장들 }

  - 조건식이 거짓이면 반복문을 빠져나간다.

  - for문과 다르게 초기화를 while문 밖에 적는다. 

  - 조건식은 생략 불가.

  Ex 4-23)

<hide/>
package javaStudy;
public class FlowEx23 {
	public static void main(String[] args) {
		int i = 5;
		while(i-- != 0 ) {
			System.out.println( i + " - I can do it.");
		}
	}
}

  Note) 실행 결과

  - 조건식( i-- != 0): i값이 0이 아닌 동안만 참이 되고 i값이 매 반복마다 1씩 감소하다가

  - 0이 되면 조건식은 거짓이 되어 while문을 빠져나간다. 

  - i--는 후위형이므로 조건식이 평가된 다음에 i값이 감소된다. 

    -> 예를 들어 i = 1일 때, 조건식이 참이므로 평가된 후에 i = 0이 된다. 

 

  Ex 4-25)

<hide/>
package javaStudy;
import java.util.*;
public class FlowEx25 {
	public static void main(String[] args) {
		int num = 0, sum = 0;
		System.out.print("숫자를 입력하세요.(예:12345)>");	
		Scanner scanner = new Scanner(System.in);
		String tmp = scanner.nextLine();
		num = Integer.parseInt(tmp);		
		while( num != 0) {
			// num을 10으로 나눈 나머지를 sum에 더한다.
			sum += num % 10;
			System.out.printf("sum = %3d num = %d%n", sum, num);			
			num /= 10;
		}
		System.out.println("각 자리수의 합: "+ sum);	
	}
}

  Note) 실행 결과

  - 사용자로부터 숫자를 입력 받고 이 숫자의 각 자리의 합을 구하는 예제이다.  

  - 2423을 입력하면 결과는 11이다. 

  - 어떤 수를 10으로 나머지 연산하면 마지막 자리를 얻을 수 있다. 

  - 그 다음 10으로 나누면 마지막 한 자리가 제거된다. 

  - 입력 받은 숫자  num을 0이 될 때까지 반복해서 10으로 나눠가면서 10으로 나머지연산하면 된다. 

 

  2.3 do-while문

  - do{ 조건식의 결과가 참일 때 수행될 문장} while( 조건식 );

  - while문 뒤에 세미콜론 ; 을 꼭 붙인다.

  - while문과 다르게 블럭 안의 문장이 반드시 한 번이상 수행된다. while 문과 조건식과 블럭의 순서만 다르다.  

  Ex 4-28)

<hide/>
package javaStudy;
import java.util.*;
public class FlowEx28 {
	public static void main(String[] args) {
		int input = 0, answer  = 0;
		answer = (int) (Math.random() * 100) + 1;	// 1~100 사이 임의 값 저장
		Scanner scanner = new Scanner(System.in);		
		do {
			System.out.print("1과 100사이의 정수를 입력하세요.>");
			input = scanner.nextInt();
			if(input > answer) {
				System.out.println("더 작은 수로 다시 시도해보세요.");
			}else if(input < answer) {
				System.out.println("더 큰 수로 다시 시도해보세요.");
			}
		}while( input != answer );
		System.out.println("정답입니다.");
	}
}

  Note) 실행 결과

  - Math.randeom()을 이용해서 1과 100 사이의 임의의 수를 변수 answer에 저장한다. 

  - 이 값은 맞출 때까지 반복하는 예제이다. 

  - 사용자가 입력한 input이 변수와 다른 동안 반복하다가 두 값이 같으면 반복문을 벗어난다.

  

  Ex 4-29)  369 게임

<hide/>
package javaStudy;
public class FlowEx29 {
	public static void main(String[] args) {
		for(int i = 1;i <= 100; ++i) {
			System.out.printf("i = %d", i);
			int tmp = i;
			do {
				//tmp의 일의자리가 3의 배수인지 확인
				if( tmp % 10 % 3 == 0 && tmp % 10 != 0 ) {
					System.out.print(" 짝");
				}
			}while( (tmp  /= 10) != 0 );	
			System.out.println();
		}
	}	
}

  Note) 실행 결과

...

  - 숫자 중에 3의 배수가 있으면 포함된 개수만큼 손뼉을 치는 369게임을 1~100까지 출력하는 예제이다.

  - 숫자의 각 자리를 확인해야하기 때문에 10으로 나누고 10으로 나머지 연산을 한다. 

  - 이 작언을 변수i에 직접 하면 안 되고 다른 변수(tmp)에 저장해서 처리해야한다.

  - 변수 i는 for문의 제어에 사용되는 변수이기 때문이다. 

  - if문에서 조건식을 보면 tmp % 10이 3의 배수인지 확인한다.(tmp % 10 = 0이 되는 경우는 제외)

 

  2.4 break문

  Def) break문: 자신이 포함된 가장 가까운 반복문을 벗어난다.  

  Ex 4-30)

<hide/>
package javaStudy;
public class FlowEx30 {
	public static void main(String[] args) {
		int sum = 0;
		int i = 0; 	
		while( true ) {
			if( sum > 100 )
				break;
			++i;
			sum += i;
		}
		System.out.println("i = "+i);
		System.out.println("sum = " + sum);
	}
}

  Note) 실행 결과

  - 1부터 자연수를 계속 더해서 몇 까지 더하면 합이 100보다 커지는지 알아내는 문제이다.

  - sum이 100을 넘으면 if문의 조건식이 참이므로 break문이 수행되어 자신이 속한 반복문(while 문)을 빠져나간다. 

  - break가 없으면 무한 반복문이 된다. 

 

  2.5 continue문

  Def) continue문: 반복이 진행되는 도중에 continue문을 만나면 반복문의 끝으로 이동하여 다음 반복으로 이동한다. 

  - 반복문 내에서만 사용할 수 있다. 

  - 반복문 전체를 벗어나지 않고 다음 반복을 계속 수행한다는 점이 break문과 다르다.

    -> for문의 경우: 증감식으로 이동

    -> while문, do-while문의 경우: 조건식으로 이동한다. 

  - 주로 if문과 함께 사용되어 특정 조건을 만족하는 경우,

  - continue문 이후의 문장들을 수행하지 않고 다음 반복으로 넘어간다.

 

  Ex 4-32)

<hide/>
package javaStudy;
import java.util.*;
public class FlowEx31 {
	public static void main(String[] args) {
		int menu = 0;
		int num = 0;
		Scanner scanner = new Scanner(System.in);
		while(true) {
			System.out.println("(1) square");
			System.out.println("(2) square root");
			System.out.println("(3) log");
			System.out.println("원하는 메뉴(1~3)을 선택하세요.(종료 : 0)");
			String tmp = scanner.nextLine();
			menu = Integer.parseInt(tmp);
			if( menu == 0) {
				System.out.println("프로그램을 종료합니다. ");
				break;
			}else if( !( 1 <= menu && menu <= 3) ) {
				System.out.println("메뉴를 잘못 선택하셨습니다. (종료는 0)");
				continue;
			}
			System.out.println("선택하신 메뉴는 " + menu + "번입니다.");
		}
	}
}

  Note) 실행 결과

  - 메뉴를 보여주고 선택하게 하는 예제이다. 

  - 메뉴를 잘못 선택하는 경우, continue문으로 다시 메뉴를 보여준다.

  - 종료를 선택하는 경우, break문으로 반복을 빠져나가서 프로그램이 종료된다. 

 

  2.6 이름 붙은 반복문

  • break문은 근접한 단 하나의 반복문만 벗어날 수 있다. 
  • 여러 개의 반복문이 중첩된 경우에는 break문으로 중첩 반복문을 완전히 벗어날 수 없다. 
  • 이 때는 중첩 반복문 앞에 이름을 붙이고 break문과 continue문에 이름을 지정해주면 하나 이상의 반복문을 벗어나거나 반복을 건너뛸 수 있다. 

  Ex) 

<hide/>
Loop1:
    for (int i = 2; i <= 9; ++i) {
        for (int j = 1; j <= 9; ++j) {
            if (j == 5) {
                break Loop1;
//                break;
//                continue Loop1;
//                continue ;
            }
            System.out.println(i + " * " + j + " = " + i * j);
        }
        System.out.println();
    }

  Note) 실행 결과

'Java > Java의 정석' 카테고리의 다른 글

Chapter 06 객체지향 프로그래밍 I  (0) 2022.02.22
Chapter 05 배열(Array)  (0) 2022.02.20
Chapter 03 연산자(Operator)  (0) 2022.02.19
Chapter 02 변수(Variable)  (0) 2022.02.17
Chapter 01 자바를 시작하기 전에  (0) 2022.02.15