[KOSTA JAVA] #Day 2 (if/switch, for/while, Scanner input/output, Exam Quiz)

0f1c04·2021년 2월 19일
0

KOSTA JAVA TIL

목록 보기
2/11
post-thumbnail

신용권님의 ''이것이 자바다'' 공부 기록

책을 보면서 내용을 정리했습니다. 이것이 자바다 커뮤니티 : https://cafe.naver.com/thisisjava

코드 실행 흐름 제어

정상적인 코드 실행 흐름

  • main() 메소드의 시작인 중괄호 {에서 끝 중괄호 }까지 위에서 아래 방향으로 실행

제어문의 역할

  • 코드 실행 흐름을 개발자가 원하는 방향으로 변경할 수 있도록 도와줌

제어문의 종류

조건문 : if, switch

반복문 : for, while, do-while

제어문의 중첩

제어문의 중괄호 내부에 다른 제어문 작성 가능 (다양한 흐름 발생 가능)


if문

	private static void ifTest() {
		int score = 100;
		
		// if문
		if(score >= 90) {
			System.out.println("합");
		}
		
		// 3항 연산자
		System.out.println(score >= 90 ? "합" : "");
	}

간단한 if문 같은 경우 3항 연산자로 간단히 표현 가능


if-else문

	private static void ifElseTest() {
		int score = 100;

		// if-else문
		if (score >= 60) {
			// 조건 결과가 참인 경우 실행
			System.out.println("합");
		} else {
			// 조건 결과가 거짓인 경우 실행
			System.out.println("불합");
		}

		// 3항 연산자
		System.out.println(score >= 60 ? "합" : "불합");
	}

if-else문도 간단한 조건식이라면 3항 연산자로 표현가능


if-else if-else문

	private static void ifElseIfElse() {
		int score = 100;
		char grade;
		if(score >= 90) {
			grade = 'A';
		}
		else if (score >=80) {
			grade = 'B';
		}
		else if (score >=70) {
			grade = 'C';
		}
		else if (score >=60) {
			grade = 'D';
		}
		else {
			grade = 'F';
		}
		System.out.println("your grade is " + grade);
	}

복수의 조건식 중 만족하는 조건문만 실행한다.


중첩 if문

private static void ifElseIfElse() {
		int score = 100;
		char grade;
		if (score >= 90) {
			grade = 'A';
			if (score >= 95) {
				grade = '+';
			} else {
				grade = '-';
			}
		} else if (score >= 80) {
			grade = 'B';
		} else if (score >= 70) {
			grade = 'C';
		} else if (score >= 60) {
			grade = 'D';
		} else {
			grade = 'F';
		}
		System.out.println("your grade is " + grade);
	}

if문 안에 if문을 사용하여 중첩 if문을 사용할 수 있으므로 코드 실행 흐름을 이해하는 것이 중요하다.


예제(1~6의 랜덤한 숫자가 홀수인지 짝수인지 판단하기)

	private static void ifDiceExample() {
		int num = (int) (Math.random() * 6) + 1;

		// 홀짝 구분
		String result;
		if (num % 2 == 1) {
			result = "홀수입니다.";
		} else {
			result = "짝수입니다.";
		}
		System.out.println(num + " " + result);

		// 3항 연산자
		System.out.println(num + " " + (num % 2 == 1 ? "홀수입니다." : "짝수입니다."));
	}

Switch문

package com.kosta.day02;

public class SwitchTest {

	public static void main(String[] args) {
		int score = (int)(Math.random() * 101);
		String grade;
		
		switch(score/10) {
		case 10: 
			grade = "A+"; 
			break;
		case 9:	
			grade = "A"; 
			break;
		case 8: 
			grade = "B"; 
			break;
		case 7: 
			grade = "C"; 
			break;
		case 6: 
			grade = "D"; 
			break;
		default: 
			grade = "F"; 
			break;
		}
		System.out.println("your grade is " + grade);
	}
}

switch문은 변수나 연산식의 값에 따라 실행문 선택할 때 사용한다. break는 해당 조건문을 중지시킨다.


반복문의 역할

  • 중괄호 블록 내용을 반복적으로 실행할 때 사용

반복문 종류 : for, while, do-while

for문

	private static void forTest() {
		int sum = 0;
		for(int i = 1; i< 100; i++) {
			sum += 1;
		}
		System.out.println(sum);
	}

반복 횟수를 알고 있을 때 많이 사용한다. 위 예제는 1부터 100까지의 합을 나타내는 반복문이다.


while문

	private static void whileTest() {
		int sum = 0;
		while (sum < 99) {
			sum += 1;
		}
		System.out.println(sum);
	}

조건에 따라 반복을 계속 진행할지 결정할 때 사용한다.


do-while문

	private static void doWhileTest() {
		int sum = 0;
		do {
			sum += 1;
		}while(sum < 99);
		System.out.println(sum);
	}

조건 따라 반복을 계속할지 결정할 때 사용하는 것은 while문과 동일하다. 다른 점은 무조건 중괄호 {} 블록을 한 번 실행 후, 조건을 검사하여 반복을 결정한다.


break문

for, while, do-while문 종료하는 구문이다. 대개 if문과 함께 사용하여 if 조건식에 따라 for문과 while문을 종료할 때 사용한다.


예제) for, while, do-while을 활용하여 1~10까지의 합 구하기

	private static void doWhileSum() {
    	// 1~10까지 더하기
		int sum = 0;
		int i = 1;
		do {
			sum += i;
			i++;
		}while(i <= 9);
		System.out.println(sum);		
	}

	private static void whileSum() {
    	// 1~10까지 더하기
		int sum = 0;
		int i = 1;
		while(i <= 9) {
			sum += i;
			i++;
		}
		System.out.println(sum);
	}

	private static void forSum() {
		// 1~10까지 더하기
		int sum = 0;
		for(int i = 0; i < 10; i++) {
			sum += i;
		}
		System.out.println(sum);
	}

Label

package com.kosta.day02;

public class ForTest2 {

	public static void main(String[] args) {
		AA:for(int i = 2; i <= 9; i++) {
			System.out.println(i + "-----------");
			//if(i == 4) break;
			for(int j = 1; j <= 9; j++) {
				//if(i == 4) break;
				if(i == 4) break AA;
				System.out.println(i + "*" + j);
			}
		}
		System.out.println("For End");
	}

}

break는 가장 가까운 반목문을 중지하는데, 중첩반복문을 한번에 종료하려면 Label을 활용한다.


continue문

for, while, do-while문에서 사용하며 for문에서는 증감식으로 이동하고 while과 do-while문에서는 조건식으로 이동한다.

private static void test2() {
		for(int i = 1; i <= 10; i++) {
			if(i == 3) {
				continue; //아래문장들을 무시하고 반복문은 계속 수행
			}
			System.out.println(i);
		}
	}

continue문 아래문장들은 무시하고 반복문은 계속 수행한다.


Scanner Class

import java.util.Scanner;
// java.utill 패키지에 있는 Scanner 클래스 사용 가능
// java.lang 패키지에 들어있는 class는 언제나 사용 가능
// 다른 패키지에 들어있는 class들은 import하고 사용 가능

public static void main(String[] args) {
		// System.out : 표준출력(모니터)
		// System.in : 표준입력(키보드)
		// Scanner class : 표준입출력을 쉽게 하도록 도와주는 클래스
        
		Scanner sc = new Scanner(System.in);
		int num = sc.nextInt();
		inputArgumentSum(num);
        
        sc.close();
	}

표준 입출력을 도와주는 클래스로 사용자가 입력한 값을 활용할 수 있다.


문제 풀이

이름과 나이 묻기

package com.kosta.day02;

import java.util.Scanner;

public class ScannerTest {

	public static void main(String[] args) {
		method1();
	}

	private static void method1() {
		Scanner sc = new Scanner(System.in);
		System.out.print("이름>>");
		String name = sc.next();
		System.out.print("나이>>");
		int age = sc.nextInt();
		
		System.out.println(name + " " + age);
	}

}

속도 증가감소

package com.kosta.day02;

import java.util.Scanner;

public class WhileKeyControlExample {

	public static void main(String[] args) {
		boolean run = true;
		int speed = 0;
		int keycode = 0;
		Scanner sc = new Scanner(System.in);
		
		while(run) {
			System.out.println("---------");
			System.out.println("1. 증속");
			System.out.println("2. 감속");
			System.out.println("3. 중지");
			System.out.println("---------");
			System.out.print("선택>");
			
			keycode = sc.nextInt();
			if(keycode == 1) {
				speed++;
			}else if(keycode == 2) {
				speed--;
			}else if(keycode == 3) {
				run = false;
			}
			System.out.println("현재속도:" + speed);
		}
		System.out.println("Program terminate");
	}
}

윤년 구하기

if문 활용

package com.kosta.day02;

import java.util.Scanner;

public class LeapYear {

	public static void main(String[] args) {
		// 년, 월에 따른 월의 말일 출력
		Scanner sc = new Scanner(System.in);
		System.out.println("년 월을 입력하시오(ex:2000 2) >>");
		int year = sc.nextInt();
		int month = sc.nextInt();
		sc.close();

		// 4의 배수이고 100의 배수가 아니면 윤년
		// 100의 배수이면서 400의 배수인 해는 윤년
		// 윤년이면 2월은 29일까지, 아니면 28일까지
		// 1, 3, 5, 7, 8, 10, 12 -> 31
		// 4, 6, 11 -> 30
		int day = 31;
		
		if(month == 2) {
			if(year % 4 == 0) {
				if(year % 100 == 0 && year % 400 != 0) {
					day = 29;
				}
			}else {
				day = 28;
			}
		}else if(month == 4 || month == 6 || month == 11) {
			day = 30;
		}
		System.out.println(year + "년 " + month + "월의 말일은 " + day + "일입니다.");
	}
}

switch문 활용

private static void switchTest(int year, int month) {
		int day = 31;
		switch (month) {
		case 2:
			if (year % 4 == 0 && year % 100 != 0 || year % 4 == 0 && year % 400 == 0) { // ||보다 &&가 우선순위가 먼저임
				day = 29;
			} else {
				day = 28;
			}
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			day = 30;
		}
		System.out.println(year + "년 " + month + "월의 말일은 " + day + "일입니다.");
	}

if, for, Scanner 활용 문제

숫자의 합 출력

private static void sumTest() {
		Scanner sc = new Scanner(System.in);
		System.out.print("숫자를 입력하시오: ");
		int num = sc.nextInt();
		sc.close();

		int start = 1;
		int sum = 0;

		if (num % 2 == 0) {
			start = 0;
		}
		for (int i = start; i <= num; i += 2) {
			sum += i;
		}
		System.out.println("결과 값 : " + sum);
	}

hokeyGraphics

	private static void hokeyGraphics(char cell, int size, boolean isRect) {
		if (isRect) {
			for (int row = 0; row < size; row++) {
				for (int col = 0; col < size; col++) {
					System.out.print(cell);
				}
				System.out.println(); //개행
			}
		} else {
			for (int row = 1; row <= size; row++) {
				for (int col = 1; col <= row; col++) {
					System.out.print(cell);
				}
				System.out.println(); //개행
			}
		}
	}

'*'로 역삼각형 만들기

private static void inverseTriangle() {
		Scanner sc = new Scanner(System.in);
		System.out.print("직각 역삼각형을 출력할 줄 수: ");
		int num = sc.nextInt();
		sc.close();
		
		for(int row = 1; row <= num; row++) {
			for(int col = 1; col <= num+1-row; col++) {
				System.out.print("*");
			}
			System.out.println();
		}
	}

50이하의 모든 소수 출력

private static void printPrime() {
		System.out.print(2 + " ");
		AA:for (int i = 3; i < 50; i++) {
			for (int j = 2; j < i; j++) {
				if (i % j == 0) continue AA;
			}
			System.out.print(i + " ");
		}
	}

Factorial 문제

private static void factorialTest() {
		Scanner sc = new Scanner(System.in);
		System.out.print("1보다 크고 10보다 작은 정수를 입력하세요. : ");
		int num = sc.nextInt();
		sc.close();
        
        if(num > 10) {
        	System.out.println("10보다 작은 수를 입력하세요.");
            return;
        }
		
		int result = 1;
		for(int i = 1; i <= num; i++) {
			result *= i;
		}
		System.out.println(result);
	}

최대공약수 구하기

package com.kosta.day02;

public class 최대공약수 {
	public static void main(String[] args) {
		gcd(2, 5);
		gcd(5, 15);
		gcd(250, 30);
	}

	private static void gcd(int a, int b) {
		int result = 1;
		while(result > 0) {
			result = a % b;
			a = b;
			b = result;
		}
		System.out.println(a);
	}

유클리드 호제법을 활용하여 풀이한다.

profile
라면 먹고 싶다. 두 개 끓여서 혼자 먹고 싶다. - 임덕배 (1997. 06 ~ )

0개의 댓글