course 2021/JAVA

day05 - control statement

코딩하는토끼 2021. 8. 18. 11:57

*제어문

1) 조건문 (if, switch) - 특정 조건 만족 시 코드 실행

2) 반복문 (while, do~while, for, 향상된 for) - 코드 반복 실행

3) 탈출문 (break, continue, return) - 반복문 실행 중 중지


> 조건문

1. if ~ else

if (조건식) {    } else {    }

조건식 결과는 반드시 boolean형

조건식 결과 true → if 블록 , false → else블록 실행

만약 결과가 false 일 때 실행할 문장이 없으면 else 생략 가능 (if문은 else문 없이 사용 가능, else문은 if문 없이 단독 사용 불가)

// 0~100 사이의 점수를 랜덤으로 받아, 70점 이상은 합격, 70점 미만은 불합격

int a = (int)(Math.random()*101);
System.out.println("점수:" + a); //점수: a

if (a >= 70) {
    System.out.println("70점 이상입니다. 합격."); //a가 70 이상이면 출력
} else {
    System.out.println("70점 미만입니다. 불합격."); //a가 70 미만이면 출력
}

2. if ~ else if ~ else

if (조건식) {    } else if (조건식) {    } else {    }

조건을 여러 개 설정하기 위해 사용

조건을 위에서부터 차례대로 검색하며 내려가므로 조건식 설정에 유의

//0~100 사이의 점수를 입력받아 구간에 따른 학점 출력

Scanner scan = new Scanner(System.in);

System.out.print("점수>");
int a = scan.nextInt(); //점수> a
		
//구간에 따른 학점
if(a >= 90) {
	System.out.println("A학점"); //a가 90 이상이면 출력
} else if(a >= 80) {
	System.out.println("B학점"); //a가 80이상 (90미만) 이면 출력
} else if(a >= 70) {
	System.out.println("C학점"); //a가 70이상 (80미만) 이면 출력 
} else if(a >= 60) {
	System.out.println("D학점"); //a가 60이상 (70미만) 이면 출력
} else {
	System.out.println("F학점"); //a가 60 미만이면 출력
}

// if나 else if에서 실행하고 나면 더 내려가지 않고 종료

3. switch ~ case

switch(판단조건) {  case 값:  실행문  case 값:  실행문  ...  default :  실행문  }

- 판단조건: 값을 갖는 변수, 표현식 (if문과 달리 조건식X)

datatype: int, String, enum (정수O, 문자열O, 실수X) 

- case문 뒤의 값은 반드시 상수 (변수X), 위의 판단조건과 대응되는 datatype

- default는 if ~ else 의 else와 비슷한 역할

- 조건은 위에서부터 아래로 차례대로 검색

- break; 가 없으면 조건을 만족하는 case부터 마지막 case까지 모두 실행

break; 를 써줌으로써 해당 case까지만 실행하고 종료할 수 있음

int a = 1;

switch(a) {

case 0: 
    System.out.println("0 입니다."); //만족X
    break;
case 1: 
    System.out.println("1 입니다."); //만족O
case 2:
    System.out.println("2 입니다."); 
    break; //종료
default:
    System.out.println("0, 1, 2가 아닙니다.");
    break;
}
// 1 입니다.
// 2 입니다.
int a = 1;

switch(a) {

case 0: 
    System.out.println("0 입니다."); //만족X
    break;
case 1: 
    System.out.println("1 입니다."); //만족O
    break;  //종료
case 2:
    System.out.println("2 입니다.");
    break;
default:
    System.out.println("0, 1, 2가 아닙니다.");
    break;
}

// 1 입니다

*명령행 인자 args - 외부(운영체제)에서 값을 전달받을 때 사용하는 매개변수

이클립스에서 운영체제를 통해 값을 전달받는 방법: run - run configuration - class 선택 - argument 탭 - program arguments 에 ${string_prompt}

-명령행 인자 값에 *(곱셈 연산자) 사용하면 인식 오류 발생 (운영체제에서 임의의 문자열 표현하는 메타문자 *와 겹치기 때문)

*String → int 치환

Integer.parseInt(문자열이름)

단, String 변수 값은 반드시 숫자 형태

String str = "2002";
int year = Integer.parseInt(str);
//year에 정수 2002 할당됨

> 반복문

1. while

while(조건식) { 실행문 }

조건식 만족하는 동안 반복문 실행

조건식 (boolean형) true → 실행문 반복 , false → 반복문 종료

*조건식 자체가 true 인 경우 - 반복문이 무한루프, 탈출문 필요

제어변수: 반복 횟수를 제어하는 변수 (while 밖에서 선언, 반복을 멈추고 싶을 때 조건 결과가 false가 되도록, 반복문 안에서 조작)

// 1부터 10까지 합

int a = 1; //제어변수
int sum = 0;

while(a <= 0) { //조건식
    sum += a; //sum = sum + a;
    a++; //제어변수
}

System.out.println(sum);
// 55
// 1~10까지 임의의 자연수, 소수인지 판별

int num = (int)(Math.random() * 10) + 1;
System.out.println(num);

int i = 2;
while(num % i != 0) {    //수가 i로 나누어떨어지면 반복 종료
    i++;    //i는 증가해가면서 num을 나눈다
}

Systme.out.println(num == i ? "소수입니다." : "소수가 아닙니다."); //3항 연산자

//소수라면 i==num이 되어서야 반복문 종료, 소수가 아니라면 그 전에 반복문 종료

조건식 검사 → 실행문 반복 이므로 처음 조건이 false이면 단 한번도 실행되지 않음

2. do ~ while

do 이하 구문 한 번 실행 → 조건식 검사 이므로 결과에 무관하게 무조건 한 번은 실행

do { 실행문 } while(조건식);

일단 실행문 실행, 이후 조건식 검사하며 실행문 반복

// 1부터 10까지 합

int i = 1;
int sum = 0;

do { 
    sum += i;  //sum = sum + i;
    i++
} while(i <= 10);

System.out.println(sum);
//55  //sum=1, i=2 -> 조건확인, 반복 -> sum=1+...+10, i=11, 조건확인, 종료

3. for

for(초기화식; 조건식; 증감식)  { 실행문 }

제어 조건을 한번에 지정

조건식(boolean형) true→반복, false→종료

증감식에 따라 조건식이 false가 되어 반복문이 종료됨

반복 횟수를 알고 있을 때 유용

실행문이 한 줄이면 블록{ } 생략 가능

// 1부터 10까지 합

int sum = 0; 
for(int i = 1; i <= 10; i++) {  //i는 1부터 10까지 1씩 증가
    sum += i;  //sum = sum + i;
}

System.out.println(sum);
//55
// 1~10까지 임의의 자연수, 소수인지 판별

int num = (int)(Math.random() * 10) + 1;
System.out.println(num);

int count = 0;
for(int i = 1; i <= num; i++) {
    if(num % i == 0) {
        count++;
    }
}

System.out.println(count == 2? "소수입니다." : "소수가 아닙니다.");
//1~200 정수 중 짝수만 출력
for(int i = 1; i <= 200; i+=2) {
    System.out.println(i + " ");
}
//A~Z 문자를 가로로 출력 (A=65, Z=90)
for(char c = 'A'; c <= 'Z'; c++) {
    System.out.print(c + " ");
}

4. 향상된 for 루프 (Enhanced for loop)

for(배열의 값을 저장할 변수 : 배열이름)  { 실행문 }

배열의 원소가 처음부터 끝까지 차례대로 변수에 저장되며 실행문 반복 - 배열의 끝까지 수행 후 반복문 종료

배열/컬렉션의 모든 원소들에 대한 반복 작업을 쉽게 처리

int[] arr = {1, 2, 3, 4, 5};
for(int a : arr) {
    System.out.println(a);
}
// 1
// 2
// 3
// 4
// 5

//그냥 for문으로 작성하면 다음과 같음
for(int i = 0; i < arr.length; i++) {
    System.out.println(arr[i]);
}
String[] arr = {"월", "화", "수", "목", "금"};
for(String str : arr) {
    System.out.println(str + "요일");
}
// 월요일
// 화요일
// 수요일
// 목요일
// 금요일
// 배열에 저장된 원소들의 합계, 평균 구하기

int[] arr = {10, 20, 30, 40, 54};
int sum = 0;
for(int a : arr) {
    sum += a;  //sum = sum + a;
}

System.out.println(sum); //합계 154

double avg = (double)sum / arr.length; //double형으로 연산하기 위함
System.out.println(avg); //평균 30.8

* 중첩 for문

for(int i = 1; i <= 9; i++) {
    for(int j = 1; j <=9; j++) {
        System.out.println(i + "-" + j);
    }
}
// 1-1
// 1-2
// 1-3
// 1-4 
// 1-5
// 1-6
// 1-7
// 1-8
// 1-9
// 2-1
// ...
// 9-9

//이를 응용하여 구구단 출력하기
for(int i = 2; i <= 9; i++) {
    System.out.println("구구단" + i + "단");
    for(int j = 1; j <= 9; j++) {
        System.out.println(i + "x" + j + "=" + i*j);
    }
}

// 구구단2단
// 2x1=2
// 2x2=4
// ...
// 9x9=81
for(int i = 1; i <= 9; i++) {
    for(int j = 1; j <= i; j++) {
        System.out.println(i + "-" + j);
    }
}

// 1-1
// 2-1
// 2-2
// 3-1
// 3-2
// 3-3
// 4-1
// ...
// 9-9

> 탈출문 

프로그램의 실행 순서를 지정된 곳으로 이동시키는 문장

반복문/블록구조에서 빠져나오기 위해 사용

키워드 - break, continue, return (goto는 자바의 키워드에 포함은 되어 있지만 사용X)

1. break

반복문 내 어떤 곳이든 위치 가능

실행 도중 break 만나면 곧바로 반복문 종료

*무한 반복문 ex. while(true) - 반복 횟수를 정확히 모를 때 사용, 특정 조건에서 종료하도록 함

int i = 0;
while(true) {
    System.out.println(i);
    if(i == 15) break;  // 이 줄이 없으면 무한 반복, 끝나지 않음
    i++;
}

// 0
// 1
// 2
// ...
// 15
// 정답을 입력할 때까지 답을 묻기

Scanner scan = new Scanner(System.in);
while(true) {
    System.out.println("4 + 3 = ?");
    System.out.print(">");
    int answer = scan.nextInt();
    if(answer == 7) {
        System.out.println("정답");
        break;
    } else { 
        System.out.println("오답");
    }
    
// 4 + 3 = ?
// >(8입력)
// 오답
// 4 + 3 =?
// >(7입력)
// 정답  //끝

2. continue

반복문 내 어떤 곳이든 위치 가능

continue를 만나면 이후 실행문은 건너뛰고, 반복문의 맨 처음(증감식/조건식)으로 이동

// for문에서의 예시
for(int i = 1; i <= 5; i++) {
    if(i == 3) continue;  //특정 조건에서 continue (i=3이면 아래 출력문 실행 않고 반복문 처음 증감식으로 이동)
    System.out.println(i);
}
// 1
// 2
// 4
// 5
// while문에서의 예시
int i = 1; 
while(i <= 5) {
    if(i == 3) {
        i++;
        continue;  //i=3이면 1증가시켜 i=4, 아래 출력문 실행 않고 반복문 처음(조건식)으로 이동 
    }
    System.out.println(i);
    i++;
}
// 1
// 2
// 4
// 5

//만약 아래와 같이 코드를 작성하면, 무한 반복문이 됨
int i = 1;
while(i <= 5) {
    System.out.println(i);  //1, 2, 3 출력 후 
    if(i == 3) continue;  //여기 조건식에 걸려 반복문 처음으로 이동하지만 i는 증가하지 않고 계속 3이므로 무한 반복
    i++;
}
// 1
// 2
// 3
// 3
// 3
// 3
// ...
// continue를 사용함으로써 프로그램을 더 효율적으로 작동시킬 수 있음
// 다음은 정수를 입력받아 그 수까지의 소수의 개수를 출력하는 코드이다

//continue 사용 전 코드
Scanner scan = new Scanner(System.in);
System.out.print("정수입력>");
int num = scan.nextInt();
int sum = 0;  //소수의 개수 변수
for(int i = 1; i <= num; i++) {
	int count = 0;  //약수의 개수 변수
	for(int j = 1; j <= i; j++) {
		if(i % j == 0) count++;
	}
	if(count == 2) sum++;
}
System.out.println(sum);

//continue 사용한 코드
Scanner scan = new Scanner(System.in);
System.out.print("정수입력>");
int num = scan.nextInt();
int sum = 0;  //소수의 개수 변수
ex:for(int i = 1; i <= num; i++) {  //반복문의 이름을 정해준다 "이름:반복문" 
	int count = 0;  //약수의 개수 변수
	for(int j = 1; j <= i; j++) {
		if(i % j == 0) count++;
        if(count >= 3) continue ex; //count가 3이상이면 더이상 소수가 아니므로 중단
	}
	if(count == 2) sum++;
}
System.out.println(sum);

//프로그램의 작동 시간이 단축됨

*원하는 반복문 탈출하기

탈출문은 기본적으로 해당 탈출문이 속한 반복문만 빠져나온다 (중첩 반복문의 경우, 내부 반복문에서 탈출문을 사용했다면 내부 반복문만 탈출)

따라서 원하는 반복문에서 탈출하기 위해서는 반복문에 이름을 붙이고(이름: 반복문) 해당 반복문을 탈출하도록 입력한다(break 반복문이름;)

//구구단 1단부터 9단까지 출력

int i = 1;
Loop1: while(true) {  //반복문 이름 설정
    int j = 1;
    while(j < 10) {
        if(i == 10) break Loop1;  //해당 조건에 바깥 반복문까지 빠져나옴
        System.out.println(i + "*" + j + "=" + i*j);
        j++;
    }
    i++;
}

3. return

*flag

프로그램이 작동되는 상태를 표시하기 위해 사용하는 변수

언제 어떻게 쓸 지는 코드를 작성하는 사람이 결정한다

예)flag를 boolean형 변수로 선언, false 저장

특정 조건이 만족할 때 flag에 ture를 저장, 조건식에 flag를 넣어 결과를 true로 만들고 원하는 동작을 실행

ex. break 대신 사용하기 

Scanner scan = new Scanner(System.in);
System.out.print("금액을 투입하세요>");
int money = scan.nextInt();
while(true) {  //무한반복문
	System.out.println("\n남은금액: " + money + "원");
	System.out.println("[1]밀키스:400원, [2]코카콜라:500원, [3]잔돈받기");
	System.out.print(">");
	int menu = scan.nextInt();
	boolean flag = false;  //flag 선언 후 false 저장
	switch (menu) {
	case 1:
    	if(money >= 400) {
	    	System.out.println("밀키스를 받았습니다");
		    money -= 400;
    	} else {
     		System.out.println("금액이 부족합니다");
    	}
    	break;
	case 2:
    	if(money >= 500) {
     		System.out.println("코카콜라를 받았습니다");
			money -= 500;
		} else {
			System.out.println("금액이 부족합니다");
		}
		break;
	case 3:
		System.out.println("남은금액 " + money + "원을 반환합니다");
		flag = true;  //case3에서 flag에 true 저장
		break;
    }                    
	if(flag) break; //case3일때(flag=ture이므로) 반복문 while 종료    			
}