자바의 정석 Chapter4

채예찬·2023년 1월 8일
0

자바의정석

목록 보기
4/5
post-thumbnail

조건문과 반복문 (제어문)

1. if문, if-else문, 중첩if문

  • if(조건식) {} --> if문 안에 조건이 true일 때만 블럭{}안에 식이 실행된다. 너무 기본적인 내용이라서 더이상은 설명하지 않고 예제로 대체하려고 한다.

조건1. score가 90보다 같거나 크면 A
조건2. 90점 이상 중에서도 98점 이상일 때에는 A+
조건3. 90점 이상 94점 미만의 경우 A-
조건4. 80점 보다 크거나 같으면 B
조건5. 나머지 학점은 C

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

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

		Scanner scanner = new Scanner(System.in);
		score = scanner.nextInt(); 

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

--> 여러 경우의 수를 노트에 먼저 필기해 놓으면 여러 if문을 사용하여 코드를 작성할 때 편하다.

2.switch문

  • 처리해야 하는 경우의 수가 많은 경우 if문 보다 switch문이 더 적합니다.

* 조심!!
--> 실수로 break문을 빼먹지 않도록 주의해야 한다.
* switch문의 제약조건!!

  • switch문의 조건식 결과는 정수 또는 문자열(jdk1.7이상)이어야 한다.
  • case문의 값은 정수,상수(문자포함),문자열만 가능하며,변수는 x, 중복되지 않아야 한다.
public static void main(String[] args) { 
		System.out.print("현재 월을 입력하세요.>");

		Scanner scanner = new Scanner(System.in);
		int month = scanner.nextInt();

		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의 끝

--> break문을 입력하지 않을 시 무한루프에 빠지게 된다. 꼭 조건이 완료되었을 때 빠져나올 수 있는 break문을 작성해야 한다.

3. Math.random()

  • 0.0과 1.0사이의 임의의 double값을 반환

임의의 정수 만들기(난수) --> 간단한 게임, 섞기

  • 만약 1부터 3까지의 임의의 숫자를 뽑고 싶다면??

1) 각 변에 3을 곱한다. ( 곱하는 3이 개별값의 갯수가 된다. )

0.0 <= Math.random() 3 < 1.0 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을 더한다.
0 + 1 <= (int)(Math.random() 3) + 1 < 3 + 1
1 <= (int)(Math.random()
3) + 1 < 4

int num = 0;

		for (int i = 1; i <= 20; i++) {
			num = (int) (Math.random() * 6) + 1;
			System.out.println(num);
			System.out.println(Math.random()); // 0.0 <= x < 1.0
			System.out.println(Math.random()*10); // 0.0 <= x < 10.0
			System.out.println((int)(Math.random()*10)); // 0 <= x 10
			System.out.println((int)(Math.random()*10)+1); // 1 <= x < 11
			System.out.println((int)(Math.random()*11)-5); // -5 <= x < 6
		}

--> 경우에 따라 여러 난수의 범위를 설정 할 수 있다. 생각보다 Math.random()을 사용하는 경우가 가끔씩 발생하하기 떄문에 매일 찾아보지 않기 위해서 확실하게 쓰는 방식을 알아두는게 좋다 !!

4. for문

  • for( 초기화 ; 조건식 ; 증감식) { 수행될문장 }; --> 기본틀이다!!.
  • 조건을 만족하는 동안 블럭{}을 반복 - 반복횟수를 알 때 적합 ( 항상 조건식을 조심해야 한다.)
for(int i = 10; 1 >= 1; i--) {
	System.out.println(i);
	}

--> 이럴 경우에는 무한반복에 빠지게 된다.
--> 항상 기본 코드를 짜 놓고 이거를 어떻게 for문으로 바꿀 수 있는지를 고민하자

  • 가장 기본적으로 별찍기 예제가 있다. 쉽게 말해서 아래로 카운트 하고 옆으로 카운트하고 싶을 때 for문을 두번 돌려서 연속적인 값으로 표현 할 수 있다.
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();
		}
	}

5. while문

  • for문에 비해 구조가 간단하다. for <-> while문 변환을 해보자!!
  • 각 자리 숫자의 합을 더하는 예제이다.
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);      // 입력받은 문자열(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);
	
	}

--> 10으로 나눈 후 나머지의 값으로 한다는 사고방식 자체를 머리속에 넣어두면 좋겠다고 생각했다.

6. do-while문

  • 블럭{}을 최소한 한 번 이상 반복 - 사용자 입력받을 때 유용하다.

do {
// 조건식의 연산결과가 참일 때 수행될 문장들을 적는다. (처음 한 번은 무조건 실행)
} while (조건식); <- 끝에 꼭 ';'을 잊지 않도록 주의!!

  • 예제로 do-while문과 while문을 쓸 때의 쓰는 방식의 차이를 정리해 놓았다.
  1. do-while문 사용
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("정답입니다.");
	}
  1. while문만 사용
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);

		System.out.print("1과 100사이의 정수를 입력하세요.>");
		input = scanner.nextInt();
		while (input != answer) {

			if (input > answer) {
				System.out.println("더 작은 수로 다시 시도해보세요.");
			} else if (input < answer) {
				System.out.println("더 큰 수로 다시 시도해보세요.");
			}

			System.out.print("1과 100사이의 정수를 입력하세요.>");
			input = scanner.nextInt();

		}
		System.out.println("정답입니다.");
	}
}

7. break문, continue문

  • break문에서 for문은 true를 생략할 수 있는데 while문은 true를 생략할 수 없다는 사실만 유의하자!!
  • continue는 자신이 포함된 반복문 끝이로 이동 - 다음 반복으로 넘어간다. 전체 반복 중에서 특정 조건 시 반복을 건너뛸 때 유용하다.
    --> 뭔가를 빼고 싶을 때 사용한다.
  • break문과 continue문을 함께 사용한것 !! 예제로 작성
	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(); 
			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 +"번입니다.");
		}
	} 

--> 빠져나올 때와 계속 이어나갈 때의 기준을 잘 세워서 작성해야 한다.

8. 이름붙은 반복문

  • 반복문에 이름을 붙여서 하나 이상의 반복문을 벗어날 수 있다. ( break문 같은 경우에는 하나의 반복문 만 벗어날 수 있다.)
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;      --> 기존 for문에서만 빠져나가고 싶을 때 
						continue Loop1;
						continue;
					System.out.println(i+"*"+ j +"="+ i*j);
				} // end of for i
				System.out.println();
		} // end of Loop1

	}

Chapter4 review

당연하게 써왔던 for문에 대해서 다시 한번 점검할 수 있는 시간이였다. 가끔 break문을 쓰지 않아서 무한루프에 빠지는 경우가 있었는데.. 조금 더 신중하게 사용해야겠다. 또한 2중 for문을 쓸 경우 스스로 작성하면서도 햇갈리는 경우가 있었는데 동시발생의 개념으로 2가지 일에 대한 처리를 할 때 사용한다는 개념으로 받아들여야 겠다. 예를 들어 별찍기에 경우 for문을 한번만 사용할 경우 가로축 or 세로축 중에서 하나만 실행되고 가로축과 세로축을 동시에 실행시키고 싶을 때 2중 for문을 사용한다는 개념으로 작성해야 겠다.

profile
쿰척쿰척 개발기록

0개의 댓글