Java의 정석: CHAPTER 04 조건문과 반복문

mucha·2023년 4월 16일

Java의 정석

목록 보기
4/6
post-thumbnail

CHAPTER 04 조건문과 반복문

제어문: 조건에 따라 문장을 건너뛰고, 때로는 같은 문장을 반복해서 수행하는 문장들

1. 조건문 - if, switch


조건문: 조건에 따라 다른 문장이 수행되도록 하는 것.
경우의 수가 많을 때는 switch문이 효율적, 그러나 제약이 if 보다 많음.

1.1 if문

if (조건식) {
	// 조건식이 참이면 여기의 문장이 수행
}

조건식
일반적으로 비교연산자와 논리연산자로 구성.

class FlowEx1 {
	public static void main(String[] args) { 
		int x= 0;

		System.out.printf("x=%d 일때, 참인 것은%n", x);

		if(x==0) System.out.println("x==0");
		if(x!=0) System.out.println("x!=0");
		if(!(x==0)) System.out.println("!(x==0)");
		if(!(x!=0)) System.out.println("!(x!=0)");
		System.out.println();

		x = 1;
		System.out.printf("x=%d 일때, 참인 것은%n", x);

		if(x==0) System.out.println("x==0");
		if(x!=0) System.out.println("x!=0");
		if(!(x==0)) System.out.println("!(x==0)");
		if(!(x!=0)) System.out.println("!(x!=0)");
	}
}

블럭{ }
괄호를 이용하여 여러 문장을 하나의 단위로 묶은 것.

import java.util.*; // Scanner클래스를 사용하기 위해 추가

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.println("입력하신 숫자는 "+ input +"입니다.");
	} // main의 끝
}

1.2 if-else문

if (조건식) {
	// 참일때
} else {
	// 거짓일때
}
import java.util.*; // Scanner클래스를 사용하기 위해 추가

class FlowEx3 {
	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입니다.");	
		} else { // input!=0인 경우
			System.out.println("입력하신 숫자는 0이 아닙니다.");
		}
	} // main의 끝
}

1.3 if-else if문

처리해야할 경우의 수가 셋 이상인 경우

if (조건식1) {
	// 조건식 1이 참일때
} else if (조건식 2) {
	// 조건식 1이 참이 아닌것중에서 조건식 2가 참일때
} else {
	// 거짓일때
}
import java.util.*;

class FlowEx4 {
	public static void main(String[] args) { 
		int score  = 0;   // 점수를 저장하기 위한 변수
		char grade =' ';  // 학점을 저장하기 위한 변수. 공백으로 초기화한다.

		System.out.print("점수를 입력하세요.>");
		Scanner scanner = new Scanner(System.in);
		String tmp = scanner.nextLine(); // 화면을 통해 입력받은 내용을 tmp에 저장
		score = Integer.parseInt(tmp);   // 입력받은 문자열(tmp)을 숫자로 변환

		if (score >= 90) {         // score가 90점 보다 같거나 크면 A학점
			 grade = 'A';             
		} else if (score >=80) {   // score가 80점 보다 같거나 크면 B학점 
			 grade = 'B'; 
		} else if (score >=70) {   // score가 70점 보다 같거나 크면 C학점 
			 grade = 'C'; 
		} else {                   // 나머지는 D학점
			 grade = 'D'; 
		}
            
		System.out.println("당신의 학점은 "+ grade +"입니다."); 
	}
}

1.4 중첩 if문

if문 안에 또 다른 if문을 포함시키는 것.

if (조건식1) {
	if (조건식2) {
		// 조건식 1과 2가 둘다 참인 경우
	} else {
		// 조건식 1만 참인 경우
	}
} else {
	// 거짓일때
}
import java.util.*;

class FlowEx5 {
	public static void main(String[] args) { 
		int  score = 0;
		char grade = ' ';
		char opt   = '0';

		System.out.print("점수를 입력해주세요.>");

		Scanner scanner = new Scanner(System.in);
		String tmp = scanner.nextLine(); // 화면을 통해 입력받은 내용을 tmp에 저장
		score = Integer.parseInt(tmp);   // 입력받은 문자열(tmp)을 숫자로 변환
		
		System.out.printf("당신의 점수는 %d입니다.", score);

		if (score >= 90) {		      // score가 90점 보다 같거나 크면 A학점(grade)
			grade = 'A';
			if (score >= 98) { 	      // 90점 이상 중에서도 98점 이상은 A+
				opt = '+';	
			} else if (score < 94) {  // 90점 이상 94점 미만은 A-
				opt = '-';
			}
		} else if (score >= 80){	  // score가 80점 보다 같거나 크면 B학점(grade)
			grade = 'B';
			if (score >= 88) {
				opt = '+';
			} else if (score < 84)	{
				opt = '-';
			}
		} else {				      // 나머지는 C학점(grade)
			grade = 'C';
		}
			
		System.out.printf("당신의 학점은 %c%c입니다.%n", grade, opt);
	}
}

1.5 switch문

처리할 경우의 수가 많은 경우에는 if문보다 switch문으로 작성하는 것이 좋음.
단, switch문은 제약조건이 있음.

switch (level) {
	case 1:
	case 2:
	case 3:
}

switch문의 제약 조건
1. 조건식 결과는 정수 또는 문자열이여야 한다.
2. case문의 값은 정수 상수만 가능하며, 중복되지 않아야 한다.

public static void main (String[] args) {
	int num, result;
	final int ONE = 1;
	
	switch (result) {
		case '1': // OK 문자상수
		case ONE: // OK 정수상수
		case "YES": // OK 문자열상수
		case num: // Error 변수는 불가
		case 1.0: // Error 실수도 불가
	}
}

switch문의 중첩
주의점: break문을 빼먹기 쉬움

import java.util.*;

class FlowEx11 {
	public static void main(String[] args) { 
		char gender;
		String regNo = "";
		System.out.print("당신의 주민번호를 입력하세요.(011231-1111222)>");

		Scanner scanner = new Scanner(System.in);
		regNo = scanner.nextLine();

		gender = regNo.charAt(7); // 입력받은 번호의 8번째 문자를 gender에 저장

		switch(gender) {
			case '1':
			case '3':
				switch(gender) {
					case '1':
					System.out.println("당신은 2000년 이전에 출생한 남자입니다.");
						break;
					case '3':
					System.out.println("당신은 2000년 이후에 출생한 남자입니다.");
				}
				break;    // 이 break문을 빼먹지 않도록 주의
			case '2':
			case '4':
				switch(gender) {
					case '2':
					System.out.println("당신은 2000년 이전에 출생한 여자입니다.");
						break;
					case '4':
					System.out.println("당신은 2000년 이후에 출생한 여자입니다.");
						break;
				}
				break;
			default:
				System.out.println("유효하지 않은 주민등록번호입니다.");;
		}
	} // main의 끝
}

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


반복문: 어던 작업이 반복적으로 수행되도록 할 때 사용

2.1 for문

반복 횟수를 알고 있을 때 적합.

for (int i = 1; i <= 5; i++) { //(초기화; 조건식; 증감식)
	System.out.println("!");
}

초기화
반복문에 사용될 변수를 초기화하는 부분. 처음에 한번만 수행.
둘 이상의 변수가 필요할 때는 아래와 같이 콤마를 구분자로 변수를 초기화 하면 됨.
for (int i = 1, j = 0; i <= 10; i++)

조건식
조건식이 참인 동안 반복을 계속 함.

증감식
반복문을 제어하는 변수의 값을 증가 또는 감소시키는 식.
쉼표 사용하여 두 문장 이상을 하나로 연결해서 쓸 수 있음.
for (int i = 1, j = 0; i <= 10; i++, j++)

중첩 for문
for문안에 for문을 포함시키는 것.

class FlowEx16 {
	public static void main(String[] args) { 
		for(int i=1;i<=5;i++) { 
			for(int j=1;j<=10;j++) {
				System.out.print("*");			
			}
			System.out.println();
		}
	} // main의 끝
}

향상된 for문(enhanced for statement)

for (타입 변수명 : 배열 또는 컬렉션) {
	// 반복할 문장
}
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);
	} // main의 끝
}

2.2 while문

while (조건식) {
	// 조건식이 참인 동안 반복 수행
}
import java.util.*;

class FlowEx27 {
	public static void main(String[] args) { 
		int num;
		int sum = 0;
		boolean flag = true;   // while문의 조건식으로 사용될 변수

		System.out.println("합계를 구할 숫자를 입력하세요.(끌내려면 0을 입력)");

		while(flag) {    // flag의 값이 true이므로 조건식은 참이 된다.
			System.out.print(">>");

			Scanner scanner = new Scanner(System.in);
			String tmp = scanner.nextLine();
			num = Integer.parseInt(tmp);  

			if(num!=0) {  
				sum += num; // num이 0이 아니면, sum에 더한다.
			} else {
				flag = false;   // num이 0이면, flag의 값을 false로 변경.
			}
		} // while문의 끝

		System.out.println("합계:"+ sum);
	}
}

2.3 do-while문

do-while문은 while문의 변형으로 기본 구조는 while과 같으나 조건식과 블럭의 순서를 바꿔 놓은 것.
do-while문은 최소한 한번은 수행될 것을 보장.

do {
	// 참일때 수행될 문장들
} while (조건식);
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 {
				if(tmp%10%3==0 && tmp%10!=0) // tmp%10이 3의 배수인지 확인(0 제외)
					System.out.print("짝");
			} while((tmp/=10)!=0);  // tmp /= 10은 tmp = tmp / 10과 동일

			System.out.println();
		}
	} // main
}

2.4 break문

break문은 자신이 포함된 가장 가까운 반복문을 벗어남.

class FlowEx30 {
	public static void main(String[] args) { 
		int sum = 0;
		int i   = 0;

		while(true) {
			if(sum > 100)
				break;
			++i;
			sum += i;
		} // end of while

		System.out.println("i=" + i);
		System.out.println("sum=" + sum);
	}   
}

2.5 continue문

반복이 진행되는 도중에 continue를 만나면 반복문의 끝으로 이동하여 다음 반복으로 넘어간다.

class FlowEx31 {
	public static void main(String[] args) {
		for(int i=0;i <= 10;i++) {
			if (i%3==0)
				continue; //만나면
			System.out.println(i);
//여기로
		}
	}
}

2.6 이름 붙은 반복문

중첩 반복문 앞에 이름을 붙이고 break문과 continue문에 이름을 지정해 줌으로써 하나 이상의 반복문을 벗어나거나 반복을 건너뛸 수 있음.

class FlowEx33 {
	public static void main(String[] args)
	{
        // for문에 Loop1이라는 이름을 붙였다.
		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);
				} // end of for i
				System.out.println();
		} // end of Loop1

	}
}

0개의 댓글