본문 바로가기

학원/복기

0403 - For문 추가, 이중for문, While문, do while문, break, continue, Scanner Class

For문 추가 

 

-초기식과 증감식은 ' , ' 기호를 사용하여 나열 작성 가능

-조건식은 &&, ||로 연결 

for(int i = 1, j = 5; i <= 3; i++, j--) {      //실제 반복은 i만 반복하는 것임 

    System.out.println("i =" + i + ", j = " + j);
}

//i =1, j = 5
//i =2, j = 4
//i =3, j = 3

 

-초기식, 조건식, 증감식은 생략 가능 -> 조건식이 생략된 경우 무조건 참으로 처리

 

int i = 1; //for 구문에 상관없이 계속 존재 

for(; i <=4 ; i++) { // 초기식 생략 (;는 생략 불가. 2개 필수) 
    System.out.print(i+"\t");
} //i 변수에 [5]가 저장된 경우 반복문 종료


// i = 5; (i가 소멸되지 않았기 때문에 i에 5가 저장되어 있음)

for(;i >= 1 ; i --) { // 초기식 생략
    System.out.print(i+"\t");

}

// 출력: 1   2  3  4  5  4  3  2  1

 

- 조건식이 생략된 경우 무조건 참으로 처리 -> 무한루프

for(;;) { //초기식, 조건식, 증감식 생략
    System.out.println("무한 반복되어 실행되는 명령");

}
//데드코드 -> 무한루프 다음에 오는 코드. 실행 불가.
System.out.println("==============================================================");

 

 

이중 for문 

바깥쪽의 for문은 다음 반복으로 넘어가기 위해서는 안쪽에 있는 수행할 문장들을 모두 마쳐야 한다.

 

예제1) A나라 >> 섬으로 가는 이동방법 3가지, 섬 >> B나라로 가는 방법 4가지일 경우, 이동방법의 갯수 구하기

int cnt = 0; // 이동방법의 갯수를 저장하기 위한 변수

for(int i = 1; i <=3 ; i++) { //A나라 >> 섬 - 반복문
    for(int j = 1 ;j <=4 ; j++) { //섬 >> B나라 - 반복문
        cnt++;
    }
}

System.out.println("이동방법의 갯수 = " + cnt);
//이동방법의 갯수 = 12

 

예제2) 

★★★★★★★ 
★★★★★★★
★★★★★★★
★★★★★★★ (4행 7열) 출력 

for(int i = 1 ; i <=4 ; i++) { //행(Row)을 처리하기 위한 반복문 
    for(int j = 1; j <=7 ; j++) { //열(Column)을 처리하기 위한 반복문 
        System.out.print("★");
    }
    System.out.println();

예제3)

2*1=2       3*1=3  ...       8*1=8  9*1 = 9
2*2=4      3*2=6  ...       8*2=16 9*2 = 18
 ...
2*8=16     3*8=24 ...       8*8=64 9*8 = 72
2*9=18     3*9=27 ...       8*9=72 9*9 = 81   출력 

for(int i = 1; i <=9 ; i++) {
    for(int j = 2; j <= 9; j++) {
        System.out.print(j + "*" + i + "=" + (i*j) + "\t");
    }
    System.out.println();

 

예제4)

 

★         
★★     
★★★       
★★★★      
★★★★★   

 

//★         i=1 별=1
//★★      i=2 별=2
//★★★       i=3 별=3
//★★★★      i=4 별=4
//★★★★★     i=5 별=5

for(int i = 1 ; i <=5 ; i++) { //행
    for(int j = 1; j <= i ; j++) { //열
        System.out.print("★");
    }
    System.out.println();
}

 

예제5-1)

 

★★★★★    
★★★★     
★★★     
★★       
★        

 

//★★★★★     i=1 별=5
//★★★★      i=2 별=4
//★★★       i=3 별=3
//★★        i=4 별=2
//★         i=5 별=1

for(int i = 1; i <=5 ; i++) {
    for(int j = 1; j <= (6-i) ; j++) {
        System.out.print("★");
    }
    System.out.println();
}

 

예제5-2)

 

★★★★★     
★★★★     
★★★       
★★     
★        

//★★★★★     i=5 별=5
//★★★★      i=4 별=4
//★★★       i=3 별=3
//★★        i=2 별=2
//★         i=1 별=1

for(int i = 5; i >= 1 ; i--) {
    for(int j = 1; j <= i ; j++) {
        System.out.print("★");
    }
    System.out.println();
}

 

예제6-1)

 

☆☆☆☆★       
☆☆☆★★        
☆☆★★★        
☆★★★★         
★★★★★        

 

//☆☆☆☆★         i=1  흰별 = 4  검은별=1
//☆☆☆★★        i=2  흰별 = 3  검은별=2
//☆☆★★★         i=3  흰별 = 2  검은별=3
//☆★★★★        i=4  흰별 = 1  검은별=4
//★★★★★        i=5  흰별 = 0  검은별=5

for(int i = 1 ; i <=5 ; i++) {
    for(int j = 1; j <= (5-i) ; j++) {
        System.out.print("☆");
    }
    for(int j = 1; j <= i ; j++) {
        System.out.print("★");
    }
    System.out.println();
}

 

예제6-2)

 

☆☆☆☆★       
☆☆☆★★        
☆☆★★★        
☆★★★★         
★★★★★        

//1 2 3 4 5   >> j
//☆☆☆☆★   i=1 
//☆☆☆★★   i=2  
//☆☆★★★   i=3  
//☆★★★★   i=4  
//★★★★★   i=5  


for(int i = 1 ; i <= 5 ; i++) {
    for(int j = 1; j <= 5 ; j++) {
        if(i + j < 6) {
            System.out.print("☆");
        } else {
            System.out.print("★");}
    }
    System.out.println();
}

 

 

 

While문 

 : 조건에 의해 명령을 반복 실행 
=> 반복의 횟수가 명확하지 않은 경우 사용하는 반복문 

 

 

형식) while(조건식) { 명령; 명령; ... }


- 조건식의 결과가 참인 경우 명령을 반복 실행하고 거짓인 경우 반복문 종료
- 조건식 생략 불가능 
- 블럭 내부에 작성된 명령을 0번 이상 실행 

 

do while문 (변형된 while문)

 

형식) do{ 명령; 명령; ... } while(조건식);

 

- 블럭 내부에 작성된 명령을 1번 이상 실행

 

 

예제1) "Java Programming"를 화면에 5번 출력하는 프로그램을 작성

int i = 1;
while(i <= 5) {
    System.out.println("Java Programming");
    i++;
}

 

예제2) 1~100 범위의 정수들의 합계를 계산하여 출력하는 프로그램 작성

do while문 활용한 풀이

int j = 1, tot = 0;
do {
    tot += j;
    j++;
} while (j <= 100);
System.out.println("1~100범위의 정수들의 합계 = " + tot);
//1~100범위의 정수들의 합계 = 5050

 

예제3) A4 용지를 반으로 계속 접어 펼쳤을 경우 사각형 모양의 갯수가 500개 이상이 만들어 지려면

            몇 번 접어야 되는지를 계산하여 출력하는 프로그램 작성

int cnt = 0, gae = 1;// cnt : 접는 횟수, gae : 사각형 모양의 갯수

//사각형 모양의 갯수가 500개 미만인 경우 반복 처리하고 500개 이상인 경우 반복문 종료
while (gae < 500) { //A4 용지를 반으로 계속 접기 위한 행위를 제공하는 반복문
    cnt++; //접는 횟수는 1씩 증가
    gae *= 2; //사각형 모양의 갯수는 2배씩 증가
}

System.out.println(cnt + "번 접으면 " + gae + "개의 사각형이 만들어집니다.");
//9번 접으면 512개의 사각형이 만들어집니다.

 

 

 예제 4) 1~X 범위의 정수들의 합계가 300 이상이 만들어지려면 X가 얼마인지 계산하여 출력하는 프로그램 작성

              - 1+2+3+...+ X >= 300

int x = 0, sum = 0; // x: 1씩 증가되는 정수값 저장, sum : 누적 결과(합계) 저장
while(sum < 300) {
	x++;
	sum += x;
}

System.out.println("1~X" + x + "범위의 정수들의 합계 = " + sum);
//1~X24범위의 정수들의 합계 = 300

 

break

: switch 구문 또는 반복문을 강제로 종료하기 위해 사용하는 제어문  

 

예제1)

 

//반복문은 조건식의 결과가 거짓인 경우 반복문 종료
for(int i = 1; i <= 5; i ++) {
    if(i == 3) break; //if 구문의 조건이 참인 경우 break 구문을 이용하여 반복문 종료
    System.out.print(i + "\t");
}
System.out.println();

//1    2

 

예제2)

 

for(int i = 1; i <= 5; i++) {
    for(int j = 1; j <= 5; j++) {
        if(j == 3) break; //for(int j = 1; j <= 5; j++) 반복문만 종료
        System.out.println("i = " + i + ", j = " + j);
    }
}
/*
i = 1, j = 1
i = 1, j = 2
i = 2, j = 1
i = 2, j = 2
i = 3, j = 1
i = 3, j = 2
i = 4, j = 1
i = 4, j = 2
i = 5, j = 1
i = 5, j = 2
*/

 

 

반복문 선언시 반복문을 구분하기 위한 식별자(라벨명) 선언 가능
형식) 라벨명 : 반복문

 

예제)

loop:
for(int i = 1; i <= 5; i++) {
    for(int j = 1; j <= 5; j++) {
        //break 라벨명 : 라벨명으로 지정된 반복문을 종료
        if(j == 3) break loop; //for(int i = 1; i <= 5; i++) 반복문 종료 (전체 for문 종료)
        System.out.println("i = " + i + ", j = " + j);
    }
}

// i = 1, j = 1
// i = 1, j = 2

 

continue

: 반복문에서 명령을 처음부터 다시 실행하기 위해 사용하는 제어문

 -> 반복문에서 continue 명령 하단에 작성된 명령을 실행하지 않고 처음부터 다시 실행할 경우 사용

 

 

예제1)

for(int i = 1; i <= 5; i++) {
    if( i == 3) continue; //i가 3일 때, 출력 명령 건너 뛰고 실행하지 않음
    System.out.print(i + "\t");
}
//1     2    4     5

 

예제2)

for(int i = 1; i <= 5; i++) {
    for(int j = 1; j <= 5; j++) {
        if(j == 3) continue; //for(int j = 1; j <= 5; j++) 반복문 재실행
        //j = 3 인 경우 출력되지 않고 건너 뛴다
        System.out.println("i = " + i + ", j = " + j);
    }
}

/*
i = 1, j = 1
i = 1, j = 2
i = 1, j = 4
i = 1, j = 5
i = 2, j = 1
i = 2, j = 2
i = 2, j = 4
i = 2, j = 5
i = 3, j = 1
i = 3, j = 2
i = 3, j = 4
i = 3, j = 5
i = 4, j = 1
i = 4, j = 2
i = 4, j = 4
i = 4, j = 5
i = 5, j = 1
i = 5, j = 2
i = 5, j = 4
i = 5, j = 5
*/

 

예제3)

 

loop:
for(int i = 1; i <= 5; i++) {
    for(int j= 1;j <= 5; j++) {
        if(j == 3) continue loop; //for(int i=1;i<=5;i++) 반복문 재실행
        System.out.println("i = " + i + ", j = " + j);
    }

/*
i = 1, j = 1
i = 1, j = 2
i = 2, j = 1
i = 2, j = 2
i = 3, j = 1
i = 3, j = 2
i = 4, j = 1
i = 4, j = 2
i = 5, j = 1
i = 5, j = 2
*/

 

 

Scanner Class

import : 다른 패키지의 클래스를 불러오기 위해 사용하는 키워드


import java.util.Scanner; 

-> Import 통해 Scanner가 프로그램에 참조될 수 있도록 만들어준다

 

-System.out : 프로그램의 값을 출력스트림을 사용하여 화면에 전달하는 기능을 제공하는 객체 
-System.in : 키보드로부터 입력된 값을 입력스트림을 사용하여 프로그램에 전달하는 기능을 제공하는 객체

 

 

-Scanner 클래스 : 입력스트림(키보드 -System.in, 파일 등)을 전달받아 원하는 자료형으로
                               값을 입력받기 위한 기능(메소드)을 제공하는 클래스

-> Scanner 객체를 생성하여 참조변수에 저장

->  참조변수를 사용하여 참조변수에 저장된 객체의 메소드를 호출하여 필요한 기능 구현

 

-Scanner.nextLine() : 입력값을 문자열로 변환하여 반환하는 메소드

-> 키보드로 입력된 값을 문자열로 반환받아 변수에 저장
-> 키보드 입력값이 없는 경우 프로그램의 흐름(스레드)이 일시 중지
-> 키보드로 값을 입력한 후 엔터(Enter)를 입력하면 프로그램의 흐름 재실행

 

-Scanner.nextInt() : 입력값을 정수값으로 변환하여 반환하는 메소드
-> 키보드로 입력된 값을 정수값으로 반환받아 변수에 저장
-> 키보드로 입력된 값이 정수값이 아닌 경우 예외(Exception) 발생  - 프로그램 강제 종료

 

 

예제) 사용자로부터 키보드로 이름과 나이를 입력받아 화면에 출력하는 프로그램 작성

package basic;

import java.util.Scanner; //Import 통해 Scanner가 프로그램에 참조될 수 있도록 만들어준다

public class ScannerApp {
    public static void main(String[] args) {
        
        Scanner scanner = new Scanner(System.in); //Scanner 클래스
        
        System.out.print("이름 입력 >> "); 
        String name = scanner.nextLine(); //scanner.nextLine()

        System.out.print("나이 입력 >> ");
        int age = scanner.nextInt(); //scanner.nextInt()

        System.out.println("[결과]" + name + "님의 나이는 " + age + "살입니다.");

        //Scanner.cloes(); : Scanner 객체가 사용한 입력스트림을 제거하는 메소드
        scanner.close();
    }
}

 

예제2) 키보드로 정수를 입력받아 학점을 계산하여 출력하는 프로그램 작성 
        => 100 ~ 90 : A, 89 ~ 80 : B, 79 ~ 70 : C, 69 ~ 60 : D, 59 ~ 0 : F 
        => 키보드로 입력된 점수가 0 ~ 100 범위의 정수값이 아닌 경우 에러 메세지 출력 후 재입력 되도록 작성

 

예제2-1) While문 사용

package basic;

import java.util.Scanner;

public class InputCheckApp {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);


        //반복문의 조건식이 무조건 참이 되도록 비정상적인 값을 초기값으로 저장
        int score = -1; //블럭 밖의 변수는 소멸되기 때문에 미리 변수를 선언 	

        //비정상적인 입력값인 경우 반복문 실행하고 정상적인 값이 입력된 경우 반복문 종료 
        while(score < 0 || score > 100) { //(반복의 횟수가 정해져 있지 않기 때문에 while문 사용)
            System.out.print("점수 입력[0~100] >> ");
            score = scanner.nextInt();
            if(score < 0 || score > 100) {
                System.out.println("[에러]점수는 0~100 범위의 정수값만 입력 가능합니다.");
            }
        }

        String grade = "";
        switch(score/10) {
            case 10:
            case 9: grade = "A"; break;
            case 8: grade = "B"; break;
            case 7: grade = "C"; break;
            case 6: grade = "D"; break;
            default: grade = "F";
        }

        System.out.println("[결과]" + score + "점 = " + grade + "학점");

        scanner.close();
    }
}

 

예제2-2) Do while문 사용 - 초기값 줄 필요 X

public class InputCheckApp {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int score; //초기값 X

        do {
            System.out.print("점수 입력[0~100] >> ");
            score = scanner.nextInt();
            if(score < 0 || score > 100) {
                System.out.println("[에러]점수는 0~100 범위의 정수값만 입력 가능합니다.");
            }
        } while (score < 0 || score > 100);

        String grade = "";
        switch(score/10) {
            case 10:
            case 9: grade = "A"; break;
            case 8: grade = "B"; break;
            case 7: grade = "C"; break;
            case 6: grade = "D"; break;
            default: grade = "F";
        }

        System.out.println("[결과]" + score + "점 = " + grade + "학점");

        scanner.close();
    }
}

 

예제2-3)

 

조건식 대신 [true]를 사용 - 무한루프 이용

ackage basic;

import java.util.Scanner;

public class InputCheckApp {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int score;

        while(true) { //조건식 대신 [true]를 사용하면 무조건 참 - 무한루프  
            System.out.print("점수 입력[0~100] >> ");
            score = scanner.nextInt();
            //입력값이 정상적인 값인 반복문 종료 
            if(score >= 0 && score <= 100) break;

            //비정상적인 값이 입력된 경우 에러 메시지 출력 후 반복문 재실행 
            System.out.println("[에러]점수는 0~100 범위의 정수값만 입력 가능합니다.");
        }

        String grade = "";
        switch(score/10) {
            case 10:
            case 9: grade = "A"; break;
            case 8: grade = "B"; break;
            case 7: grade = "C"; break;
            case 6: grade = "D"; break;
            default: grade = "F";
        }

        System.out.println("[결과]" + score + "점 = " + grade + "학점");

        scanner.close();
    }
}