[JAVA 기초부터 훑어보기]06. 조건과 반복

2023. 1. 16. 23:59JAVA(자바)

▣ 제어문의 종류

제어문의 종류


▣ 3가지의 제어 구조(순차 구조, 선택 구조, 반복 구조)

3가지의 제어 구조

 

 

1. 조건문

ㄱ. if문

(1) 정의

- if-else에서 조건식의 값이 참일 때 실행되는 블록을 then절(then clause)이라고 하고 조건식의 값이 참이 아닐 때 실행되는 블록을 else절(else clause)라고 한다. 

- 조건에 따라 2개 이상의 문장이 실행되어 한다면 중괄호 {, }를 이용하여 문장을 그룹핑한다.(이것을 복합문 또는 블록이라고 한다)

 

(2) 조건 연산자

- 간단한 if-else문은 조건 연산자를 사용하여 표현할 수 있다 

System.out.println(grade>=60 ? "합격" : "불합격");

 

(3) 중첩 if문

- if문도 하나의 문장이다 따라서 if-else 문의 문장 1이나 문장 2 자리에 다른 if 문이 들어가는 경우도 있다 이것을 중첩 if문이라고 한다

if(grade >= 80)
	if(grade >= 90)
    	System.out.println("당신의 학점은 A입니다");
    else
    	System.out.println("당신의 학점은 B입니다");

 

(4) 연속적인 if문

다중으로 분기되는 결정을 내려야 하는 경우, if 문 다음에 else if 문을 계속적으로 사용하는 것

if(grade >= 90)
	System.out.println("당신의 학점은 A입니다");
else if(grade >= 80)
	System.out.println("당신의 학점은 B입니다");
else if(grade >= 70)
	System.out.println("당신의 학점은 C입니다");
else if(grade >=60)
	System.out.println("당신의 학점은 D입니다");
else
	System.out.println("당신의 학점은 F입니다");

 

ㄴ. switch문

(1) 정의

- 여러 개의 가능한 실행 경로 중에서 하나를 선택하는 데 사용됨

- switch 문은 switch 안에 들어있는 수식을 계산하여서 case 절과 비교한다

- 일치하는 case 절이 있으면 case 절의 문장들이 실행되다가 break 문에 도달하면 종료된다

- 만약 case 절에서 일치하는 정수값을 찾지 못하면 최종적으로 default 절이 실행된다 

- switch 문은 정수형에 대해서만 작동된다 

 

(2) 주의할 점

- break 문이 없으면 선택된 case 절 안의 문장들을 실행한 다음, 계속해서 다음 case 절의 문장들을 실행하게 된다

- default 문은 어떤 case 문과도 일치되지 않는 경우에 선택되어 실행된다. 

- default 문은 없을 수도 있다.

- 가급적 default 문을 포함시키는 것이 좋다.

 

(3) switch 문에 문자열 사용

// 월 이름을 받아서 월 번호를 반환하는 프로그램을 작성
//JDK 7부터는 switch 문의 제어식으로 String 객체를 사용할 수 있다
// 실행결과 = 2

public class StringSwitch{
	public static void main(String args[]){
    	String month = "february";
        
        int monthNumber;
        switch(month){
        	case "january":
            	monthNumber = 1;
                break;
            case "february":
            	monthNumber = 2;
                break;
            case "march";
            	monthNumber = 3;
                break;
            default:
            	monthNumber = 0;
                break;
            }
            System.out.println(monthNumber);
    }
}
// 1년의 각 달의 일수를 출력하는 프로그램
// 특정 달이 입력되면 그 달의 일수를 출력
// 대부분의 달이 31일 또는 30일인 점을 고려

import java.util.*;

public class DaysInMonth{
	public static void main(String args[]){
    	int month;
        int year = 2009;
        int days = 0;
        
        System.out.println("일수를 알고 싶은 달을 입력하시오: ");
        Scanner scan = new Scanner(System.in);
        month = scan.nextInt();
        
        switch(month){
        case1:	case3:	case5: case7:
        case8:	case10: case12:
            days = 31;
            break;
        case4:	case6:	case9:	case11:
        	days = 30;
            break;
        case2:
        	if(((year % 4 == 0) && (year % 100 ! = 0)) || (year % 400 == 0)) //윤년
           		days = 29;
            else //평년
            	days = 28;
            break;
        default:
        	System.out.println("월이 잘못 입력되었습니다");
            break;
        }
        System.out.println("월의 날수는 " + days);
    }
}
//실행결과
일수를 알고 싶은 달을 입력하시오: 6
월의 날수는 30

 

2. 반복문

ㄱ. while문

(1) 정의 

- 조건이 만족되면 반복을 계속하는 구조

- 반복 횟수를 알 수 없고, 조건에 따라서 반복하는 경우에 사용

 

(2) 문법

while(조건식){
        반복문장
}
// i가 5보다 작을 때까지 반복한다

public class LoopExample1{
	public static void main(String args[]){
    	int i = 0;
        while(i<5){
        	System.out.println("정수: " + i);
            i++;
        }
    }
}
//실행결과
정수: 0
정수: 1
정수: 2
정수: 3
정수: 4
//구구단 출력하기

package while_loop;
import java.util.*;

public class Gugudan {

	public static void main(String[] args) {
		int n;
		int i = 1;
		System.out.println("구구단에서 출력하고 싶은 단을 입력하시오: ");
		Scanner scan = new Scanner(System.in);
		n = scan.nextInt();
		while(i<=9) {
			System.out.println(n + "*" + i + "=" + n*i);
			i++;
		}

	}

}

 

ㄴ. for문

(1) 정의

- for문은 일정한 횟수만큼 반복할 때 유용하게 사용됨

 

(2) 문법

for ( ; ; ) {      //무한루프
        ...    
        //반복되는 문장
}

 

(3) 예제

// 1부터 10까지의 정수를 더하여 합을 구하는 프로그램

package for_loop;

import java.util.Iterator;

public class Sum {
	public static void main(String[] args) {
		int sum = 0;
		for(int i = 0; i<=10; i++) {
			sum += i;
			System.out.println(sum);
		}
		
	}

}

 

//for문으로 팩토리얼 계산하기
package for_loop;

import java.util.Scanner;

public class Factorial {
	public static void main(String[] args) {
		long fact = 1;
		int n;
		
		System.out.println("정수를 입력하시오: ");
		Scanner scan = new Scanner(System.in);
		n = scan.nextInt();
		
		for(int i =1; i<=n; i++) {
			fact = fact * i;
		}
		// for 반복문은 반복할 코드가 한 줄이라면 다음과 같이 중괄호는 생략가능!
		System.out.printf("%d!은 %d입니다\n", n, fact);
	}

}

※ for문에서 괄호를 생략할 수 있을까?

- 반복할 문장이 한 줄이라면 괄호를 생략할 수 있다!

for로 반복할 코드가 두 줄 이상이라면 반드시 중괄호로 묶어야 한다.

 

(4) 중첩 반복문

- 반복문 안에 다른 반복문이 실행될 수 있는데 그것을 중첩 반복문이라고 한다

- 외부에 위치하는 반복문을 외부 반복문이라고 하고 내부의 반복문을 내부 반복문이라고 한다

 

 


print, println, printf의 차이점

 

system.out.print

  • 형식(int, float, double 등)에 구애받지 않는 문자를 그대로 출력하고 싶을 때 사용한다.
  • 엔터 입력시 버퍼(buffer)에 \n(개행문자)는 포함 안됨.(엔터 누르는 순간 엔터는 입력 안됨)
    • 그래서 줄바꿈 필요 없을 때 println말고 print 사용하면 된다.

system.out.println

  • print와 동일하게 형식(int, float, double 등)에 구애받지 않는 문자를 그대로 출력하고 싶을 때 사용한다.
  • 차이점은 엔터 입력시 버퍼(buffer)에  \n(개행문자)가 같이 들어간다. (엔터 누르는 순간 엔터도 입력된걸로 간주)

system.out.printf

print 와 println과 다르게

  • 형식을 신경써야할 때 사용(int, long, float, double 등)
  • 엔터 입력시 버퍼(buffer)에 \n(개행문자)는 포함 안됨.

5. break와 continue

(1) 정의

- 반복문에서 제어의 흐름을 변경할 수 있는 방법

 

(2) 기능

▣ break

- 반복 루프를 종료시킨다

- 레이블이 있을 수도 있고 없을 수도 있다

- 가장 안쪽의 반복 루프를 종료하는 데 사용된다

//사용자가 입력한 점수의 평균을 내는 프로그램
//사용자가 음수를 입력하면 break에 의해 반복 루프를 종료

package break_and_continue;

import java.util.Scanner;

public class Average {

	public static void main(String[] args) {
		int total = 0;
		int count = 0;
		Scanner scan = new Scanner(System.in);
		while(true) {
			System.out.println("점수를 입력하세요: ");
			int grade = scan.nextInt();
			if(grade < 0)
				break;
			
			total += grade;
			count++;
		}
		System.out.println("평균은" + total / count);   //break한 후 작동되는 문장

	}

}

※ 만약 루프 전체를 종료하고 싶다면?

- 주의할 점은 레이블이 붙여진 문장을 종료시키는 것이지 제어의 흐름이 레이블로 이동하는 것이 아니다

- 제어의 흐름은 레이블이 붙여진 문장의 다음 문장으로 이동된다

- 제어의 흐름은 로 이동하는 것이 아니라 번 반복문을 종료시킨 후 위치에 옮겨진다

outer_loop:    //
while(true){
   while(true) {
      grade = scan.nextInt();
      if( grade < 0)
          break outer_loop;
    }
...
}
//

 

▣ continue

- 현재의 반복을 종료하고 다음 반복을 다시 시작하게 한다

- 레이블이 없으면 가장 안쪽 루프 몸체의 끝으로 점프하여서 루프를 제어하는 조건식을 다시 계산하게 된다

//문자열을 대상으로 반복하며 문자 'n'이 나타나는 횟수를 카운팅한다
//만약 현재의 문자가 n이 아니면 continue 문에 의하여 루프의 나머지 부분을 생략하고 다음 문자를 처리한다 
//만약 문자가 n이면 카운트를 증가한다
package break_and_continue;

import java.util.Scanner;

public class ContinueTest {

	public static void main(String[] args) {
		String a = "I have no time to see news";
		int count = 0;
		
		for(int i = 0; i<a.length(); i++) {
			if(a.charAt(i) == 'n') {
				count++;
			}
		}
		System.out.println("n의 갯수는" + count);

	}

}