자바의 정석 <기초편> 📌chapter4. 조건문과 반복

모깅·2023년 1월 29일
0

📖 01. if문

  • 제어문(control statement) 2가지 존재한다.
  1. 조건문 : 조건에 따라 다른 문장이 수행되도록 함.

  2. 반복문 : 특정 문장들을 반복해서 수행함.

    if (조건식) {
            // 조건식이 참(true)일 때 수행될 문장들을 적는다.
    }

<예제 4-1 >

✍️ 입력

class Ex4_1 {
	public static void main(String args[]) {
		int score = 80;

		if (score > 60) {
			System.out.println("합격입니다.");
		}
	}
}

💻 출력
합격입니다.


📖 02. 조건식의 다양한 예

<예제 4-2 >

✍️ 입력

class Ex4_2 {
	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)");

		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)");
	}
}

💻 출력
x=0 일 때, 참인 것은
x==0
!(x!=0)
x=1 일 때, 참인 것은
x!=0
!(x==0)


📖 03. 블럭{}

  • if문 뒤에 블럭을 사용할것
    -> 수행해야 할 문장이 한문장이라면 생략 가능

📖 04. if-else문

if (조건식) {
      // 조건식이 참(true)일 때 수행될 문장들을 적는다.
} else {
      // 조건식이 거짓(false)일 때 수행될 문장들을 적는다.
}

<예제 4-3 >

✍️ 입력

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

class Ex4_3 {
	public static void main(String[] args) {  
		System.out.print("숫자를 하나 입력하세요.>");
		Scanner scanner = new Scanner(System.in);
		int input = scanner.nextInt(); // 화면을 통해 입력받은 숫자를 input에 저장

		if(input==0) {
			System.out.println("입력하신 숫자는 0입니다.");	
		} else { // input!=0인 경우
			System.out.println("입력하신 숫자는 0이 아닙니다.");
		}
	} // main의 끝
}

💻 출력
결과 1)
숫자를 하나 입력하세요.>5
입력하신 숫자는 0이 아닙니다.

결과 2)
숫자를 하나 입력하세요.>0
입력하신 숫자는 0입니다.


📖 05. if-else if문

  • 조건을 많이 사용해야 할 때 사용하자.
if (조건식1) {
      // 조건식1의 연산결과가 참일 때 수행될 문장들을 적는다.
} else if (조건식2) {
      // 조건식2 연산결과가 참일 때 수행될 문장들을 적는다.
} else if (조건식3) {
      // 조건식3 연산결과가 참일 때 수행될 문장들을 적는다.
} else {  // 마지막은 보통 else블럭으로 끝나며, else블럭은 생략가능하다.
      // 위의 어느 조건식도 만족하지 않을 때 수행될 문장들을 적는다.
}

-> 조건식이 참이 되는게 있다면 묶여있는 else if문 모든것을 빠져나온다.


📖 06. if-else if문 예제

<예제 4-4 >

✍️ 입력

import java.util.Scanner;

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

		System.out.print("점수를 입력하세요.>");
		Scanner scanner = new Scanner(System.in);
		score = scanner.nextInt(); // 화면을 통해 입력받은 숫자를 score에 저장

		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)
점수를 입력하세요.>70
당신의 학점은 C입니다.

결과 2)
점수를 입력하세요.>63
당신의 학점은 D입니다.

-> grade를 D로 초기화 했다면 마지막 else문을 생략 할 수 있다.
* 마지막 else문을 생략 할 수 있는지 항상 확인하자.


📖 07. 중첩 if문

  • else 문은 가장 가까운 if 문을 찾는다. 아래 예시처럼 될 수 있으니 조심하자.

📖 08. 중첩 if문 예제

<예제 4-5 >

✍️ 입력

import java.util.Scanner;

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

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

		Scanner scanner = new Scanner(System.in);
		score = scanner.nextInt(); // 화면을 통해 입력받은 점수를 score에 저장

		System.out.printf("당신의 점수는 %d입니다.%n", 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)
점수를 입력해주세요.>81
당신의 점수는 81입니다.
당신의 학점은 B-입니다.

결과 2)
점수를 입력해주세요.>85
당신의 점수는 85입니다.
당신의 학점은 B0입니다.

결과 3)
점수를 입력해주세요.>100
당신의 점수는 100입니다.
당신의 학점은 A+입니다.

-> grade를 'C'로 초기화하면 else문 생략이 가능하다.


📖 09. switch문

  • else if문이 많아질 경우 switch문 사용하자.
    -> 조건을 하나만 검사해서 시간이 덜 걸린다. + 가독성이 좋음.
  • break문을 생략하면 아래 case까지 넘어가서 실행된다. 주의 할 것!

📖 10. switch문 제약조건

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

📖 11. switch문 제약조건 예제

<예제 4-6 >

✍️ 입력

import java.util.Scanner;

class Ex4_6 {
	public static void main(String[] args) { 
		System.out.print("현재 월을 입력하세요.>");

		Scanner scanner = new Scanner(System.in);
		int month = scanner.nextInt();  // 화면을 통해 입력받은 숫자를 month에 저장

		switch(month) {
			case 3: 
			case 4: 
			case 5:
				System.out.println("현재의 계절은 봄입니다.");
				break;
			case 6: case 7: case 8:
				System.out.println("현재의 계절은 여름입니다.");
				break;
			case 9: case 10: case 11:
				System.out.println("현재의 계절은 가을입니다.");
				break;
			default:
	//		case 12:	case 1: case 2:
				System.out.println("현재의 계절은 겨울입니다.");
		}
	} // main의 끝
}

💻 출력
현재 월을 입력하세요.>3
현재의 계절은 봄입니다.


📖 12. 임의의 정수만들기 Math.random()

  • 난수를 얻기 위해선 Math.random() 사용하자.
    -> 0.0 <= Math.random() < 1.0 값 반환한다.

  • 만일 1 과 3 사이의 정수를 구하기 원한다면?

<예제 4-7 >

✍️ 입력

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

		// 괄호{} 안의 내용을 5번 반복한다.
		for (int i = 1; i <= 5; i++) {
			num = (int) (Math.random() * 6) + 1;
			System.out.println(num);
		}
	}
}

💻 출력
1 ~ 6 사이값 랜덤 출력 (5번)


📖 13. for문

  • 반복 횟수 알고 있다면 for문, 아니라면 while문 사용하자.

  • for문의 구조와 수행순서

<예제 4-8 >

✍️ 입력

class Ex4_8 {
	public static void main(String args[]) {
		for (int i = 1; i <= 3; i++) { // 괄호{}안의 문장을 3번 반복
			System.out.println("Hello");
		}
	}
}

💻 출력
Hello
Hello
Hello

  • 초기화
    -> 둘 이상의 변수를 초기화 할 수 있다.
    for(int i=1, j=0; i<=10; i++) { ... }

  • 조건식
    for(int i=1; i<=10; i++) { ... }
    -> 조건식이 true일 때 반복한다.

  • 증감식
    -> 둘 이상 증감식 사용 가능하다.
    for(int i=1, j=0; i<=10; i++, j--) { ... }

  • for(;;) { . . . } => 모두 참(true)
    -> 특정 조건을 넣어서 for문을 빠져나와야 한다.


📖 14. for문 예제

<예제 4-9 >

✍️ 입력

class Ex4_9 {
	public static void main(String[] args) { 
		for(int i=1;i<=5;i++)
			System.out.println(i); // i의 값을 출력한다.

		for(int i=1;i<=5;i++)
			System.out.print(i);   // print()를 쓰면 가로로 출력된다.

		System.out.println();
	}
}

💻 출력
1
2
3
4
5
12345

<예제 4-10 >

✍️ 입력

class Ex4_10 {
	public static void main(String[] args) { 
		int sum = 0;	// 합계를 저장하기 위한 변수.

		for(int i=1; i <= 5; i++) {
			sum += i ;	// sum = sum + i;
			System.out.printf("1부터 %2d 까지의 합: %2d%n", i, sum);
		}
	} // main의 끝
}

💻 출력
1부터 1 까지의 합: 1
1부터 2 까지의 합: 3
1부터 3 까지의 합: 6
1부터 4 까지의 합: 10
1부터 5 까지의 합: 15


📖 15. 중첩 for문

<예제 4-11 >

✍️ 입력

import java.util.*;

class Ex4_11 {
	public static void main(String[] args) { 

		for(int i=1;i<=5;i++) {
			for(int j=1;j<=i;j++) {
				System.out.print("*");
			}
			System.out.println();
		}
	} // main의 끝
}

💻 출력
*
**
***
****
*****


📖 16. while문

while (조건식) {
      // 조건식의 연산결과가 참(true)인 동안, 반복될 문장들을 적는다.
}

  • while문과 for문은 항상 변환이 가능하다.

📖 17. while문 예제1

<예제 4-12 >

✍️ 입력

class Ex4_12 {
	public static void main(String[] args) { 
		int i= 5;

		while(i-- != 0) {
			System.out.println(i + " - I can do it.");
		}
	} // main의 끝
}

💻 출력
4 - I can do it.
3 - I can do it.
2 - I can do it.
1 - I can do it.
0 - I can do it.

<예제 4-13 >

✍️ 입력

class Ex4_13 {
	public static void main(String[] args) {
		int sum = 0;
		int i = 0;
		// i를 1씩 증가시켜서 sum에 계속 더해나간다.
		while (sum <= 100) {
			System.out.printf("%d - %d%n", i, sum);
			sum += ++i;
		}
	} // main의 끝
}

💻 출력
0 - 0
1 - 1
2 - 3
3 - 6
4 - 10
5 - 15
6 - 21
7 - 28
8 - 36
9 - 45
10 - 55
11 - 66
12 - 78
13 - 91


📖 18. while문 예제2

<예제 4-14 >

✍️ 입력

import java.util.*;

class Ex4_14 {
	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();  // 화면을 통해 입력받은 내용을 tmp에 저장
		num = Integer.parseInt(tmp);      // 입력받은 문자열(tmp)을 숫자로 변환

		while(num!=0) {    
			// num을 10으로 나눈 나머지를 sum에 더함
			sum += num%10; 	// sum = sum + num%10;
			System.out.printf("sum=%3d num=%d%n", sum, num);

			num /= 10;   // num = num / 10;  num을 10으로 나눈 값을 다시 num에 저장
		}

		System.out.println("각 자리수의 합:"+sum);
	}
}

💻 출력
숫자를 입력하세요.(예:12345)>12345
sum= 5 num=12345
sum= 9 num=1234
sum= 12 num=123
sum= 14 num=12
sum= 15 num=1
각 자리수의 합:15

-> 어떤 수를 10으로 나머지 연산하면 마지막 자리를 얻을 수 있다. 그리고 10으로 나누면 마지막 한자리가 제거된다.


📖 19. do-while문

  • do-while문은 최소 한 번 실행하고 조건을 검사하며 반복한다.
do{
   // 조건식의 연산결과가 참일 때 수행될 문장들을 적는다.(처음 한 번은 무조건 실행)
} while (조건식); <- 끝에 ';' 잊지말자.

<예제 4-15 >

✍️ 입력

import java.util.*;

class Ex4_15 {
	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("정답입니다.");
	}
}

💻 출력
(생략)


📖 20. break문

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

<예제 4-16 >

✍️ 입력

class Ex4_16 {
	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);
	}   
}

💻 출력
i=14
sum=105


📖 21. continue문

  • continue문은 반복문 내에서만 사용될 수 있으며, 반복이 진행되는 도중에 continue문을 만나면 반복문의 끝으로 이동하여 다음 반복으로 넘어간다.

<예제 4-17 >

✍️ 입력

class Ex4_17 {
	public static void main(String[] args) {
		for(int i=0;i <= 10;i++) {
			if (i%3==0)
				continue;
			System.out.println(i);
		}
	}
}

💻 출력
1
2
4
5
7
8
10


📖 22. break문과 continue문 예제

<예제 4-18 >

✍️ 입력

import java.util.*;

class Ex4_18 {
	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.print("원하는 메뉴(1~3)를 선택하세요.(종료:0)>");

			String tmp = scanner.nextLine(); // 화면에서 입력받은 내용을 tmp에 저장
			menu = Integer.parseInt(tmp);    // 입력받은 문자열(tmp)을 숫자로 변환

			if(menu==0) {
				System.out.println("프로그램을 종료합니다.");
				break;
			} else if (!(1 <= menu && menu <= 3)) {
				System.out.println("메뉴를 잘못 선택하셨습니다.(종료는 0)");
				continue;		
			}
			
			System.out.println("선택하신 메뉴는 "+ menu +"번입니다.");
		}
	} // main의 끝
}

💻 출력
(1) square
(2) square root
(3) log
원하는 메뉴(1~3)를 선택하세요.(종료:0)>4
메뉴를 잘못 선택하셨습니다.(종료는 0)
(1) square
(2) square root
(3) log
원하는 메뉴(1~3)를 선택하세요.(종료:0)>1
선택하신 메뉴는 1번입니다.
(1) square
(2) square root
(3) log
원하는 메뉴(1~3)를 선택하세요.(종료:0)>0
프로그램을 종료합니다.


📖 23. 이름 붙은 반복문

  • break문은 근접한 단 하나의 반복문만 벗어날 수 있기 있다.
    따라서 여러 개의 반복문이 중첩 될 경우 중첩 반복문 앞에 이름을 붙이고 break문에 이름을 지정해서 빠져나오자.

<예제 4-19 >

✍️ 입력

class Ex4_19
{
	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

	}
}

💻 출력
2*1=2
2*2=4
2*3=6
2*4=8


📖 24. 이름 붙은 반복문 예제

<예제 4-20 >

✍️ 입력

import java.util.*;

class Ex4_20 {
	public static void main(String[] args) { 
		int menu = 0, num  = 0;
		Scanner scanner = new Scanner(System.in);

		outer:   // while문에 outer라는 이름을 붙인다. 
		while(true) {
			System.out.println("(1) square");
			System.out.println("(2) square root");
			System.out.println("(3) log");
			System.out.print("원하는 메뉴(1~3)를 선택하세요.(종료:0)>");

			String tmp = scanner.nextLine(); // 화면에서 입력받은 내용을 tmp에 저장
			menu = Integer.parseInt(tmp);    // 입력받은 문자열(tmp)을 숫자로 변환

			if(menu==0) {  
				System.out.println("프로그램을 종료합니다.");
				break;
			} else if (!(1<= menu && menu <= 3)) {
				System.out.println("메뉴를 잘못 선택하셨습니다.(종료는 0)");
				continue;		
			}

			for(;;) {
		      System.out.print("계산할 값을 입력하세요.(계산 종료:0, 전체 종료:99)>");
				tmp = scanner.nextLine();    // 화면에서 입력받은 내용을 tmp에 저장
				num = Integer.parseInt(tmp); // 입력받은 문자열(tmp)을 숫자로 변환

				if(num==0)  
					break;        // 계산 종료. for문을 벗어난다.

				if(num==99) 
					break outer;  // 전체 종료. for문과 while문을 모두 벗어난다.

				switch(menu) {
					case 1: 
						System.out.println("result="+ num*num);		
						break;
					case 2: 
						System.out.println("result="+ Math.sqrt(num)); 
						break;
					case 3: 
						System.out.println("result="+ Math.log(num));  
						break;
				} 
			} // for(;;)
		} // while의 끝
	} // main의 끝
}

💻 출력
(1) square
(2) square root
(3) log
원하는 메뉴(1~3)를 선택하세요.(종료:0)>1
계산할 값을 입력하세요.(계산 종료:0, 전체 종료:99)>2
result=4
계산할 값을 입력하세요.(계산 종료:0, 전체 종료:99)>3
result=9
계산할 값을 입력하세요.(계산 종료:0, 전체 종료:99)>0
(1) square
(2) square root
(3) log
원하는 메뉴(1~3)를 선택하세요.(종료:0)>2
계산할 값을 입력하세요.(계산 종료:0, 전체 종료:99)>4
result=2.0
계산할 값을 입력하세요.(계산 종료:0, 전체 종료:99)>99





[출처] 자바의 정석 <기초편> (남궁 성 지음)

profile
멈추지 않기

0개의 댓글