본문 바로가기
공부/java

자바(java)의 반복문: for, while

by 샤샤샤샤 2023. 1. 23.

반복문에는 for문과 whil문이 존재한다. 둘 사이에 큰 차이는 없으며, 다만 반복 횟수를 정하기 위한 변수 선언을 반복문 안에서 하느냐, 밖에서 하느냐 정도만 다르다. 상황에 따라 편한걸 사용하면 된다.

 

for문

 

형식:

for( 변수 초기화; 조건문; 증감 ) {

     반복되는 수행문

}

 

변수 초기화 -> 조건문(true) -> 수행문 -> 증감 -> 조건문(true) -> 수행문-> 증감 -> .... -> 조건문 (false)  -> 빠져나옴.

 

이런 과정으로 이뤄진다.

조건에 따라서 무한 루프에 걸리기도 하니 주의하자.

 

무한 반복문을 원한다면

 for(;;) 과 같이 입력값이 없는 반복문을 만들면 된다.

 

 

public class ex38 {
    public static void main(String[] args) {
        //반복문  -  for문 while문 do-while문
        //  사용빈도  60%   35%      5%
        //반복문 : 실행문을 반복적으로 수행하게 해주는 명령문
        System.out.println("Happy!");
        System.out.println("Happy!");
        System.out.println("Happy!");
        System.out.println("Happy!");
        System.out.println("Happy!");

        for( int i=0; i<5; i++ ){
            System.out.println("Happy!");
        }

        //for문 형식
        // for( 초기화1; 조건2; 증감4 ) {
        //   반복되는 수행문3
        // }
        // 실행되는 순서 : 1 -> 2 -> 3 -> 4 ->
        //               2 -> 3 -> 4 반시계방향으로 반복
        // 언제까지? 조건문이 False일때까지
        // 조건에 따라서 한번도 수행안되거나 무한루프 걸리기도 함.
        // 무한루프에 걸리면, 프로그램을 정지시키거나 IDE을 다시 실행!
        for( int i=0; i<5; i++ ){
            System.out.println("i값은 " + i);
        }
        //step 1: 변수선언과 초기화
        //     2: 조건비교 - True이면 수행, False이면 for문 나감.
        //     3: 실행문 수행
        //     4: 증감문 수행
        //     5: 조건비교
        //     그다음부터는 step 3,4,5를 계속 반복한다.
    }
}

아... 티스토리에서 코드 언어 설정이 가능하다는걸 이제야 알았다....

이제와서 수정하기는 너무 시간이 오래 걸리니 그냥 넘어가자ㅎㅎ

 

public class ex39 {
    public static void main(String[] args) {
        //연습문제 20 - for문 연습
        //1. 반복변수 i값을 5부터 10까지 출력하시오.
        for(int i=5; i<11; i++ ){
            System.out.println( i );
        }
        //2. i값을 1부터 100까지 출력하되
        //   3씩 증가하여 출력하시오. 예)1 4 7 10 13...
        for(int i=1; i<101; i=i+3 ){
            System.out.println( i );
        }
        //3. i값을 -20에서 10까지 증가하며 출력하시오.
        //   예) -20 -19 -18 ... 9 10
        for( int i=-20; i<11; i++ ){
            System.out.println( i );
        }
        //4. 1부터 100까지 5의 배수만 출력하시오.
        //   for문 안에서 if문 사용
        for( int i=1; i<101; i++ ){
            if( i%5 == 0 ) {
                System.out.println( i );
            }
        }
        //5. i값이 10에서 -10까지 감소하여 출력하시오.
        for(int i=10; i>-11; i--) {
            System.out.println(i);
        }
        //6. 1부터 10까지의 합을 출력하시오.
        //   int sum = 0; for문 앞에 사용
        int sum = 0;
        for(int i=1; i<11; i++){
            //sum = sum + 값
            sum += i;
            System.out.println( "i:"+i);
            System.out.println( "sum:"+sum);
            // 1 = 0 + 1;
            // 3 = 1 + 2;
            // 6 = 3 + 3;
        }
        System.out.println(sum);
        //7. 1부터 100까지 끝자리가 3으로 끝나는 수의
        //   갯수(count)를 출력하시오.
        int count = 0;
        for(int i=1; i<101; i++){
            if( i%10 == 3 ){
                System.out.println(i);
                count++;
            }
        }
        System.out.println(count);
        //8. 7번 문제에서
        //  십의 자릿수도 3이면 카운트에 추가하시오.
        count = 0; //카운트 초기화
        for(int i=1; i<101; i++){
            if( i%10 == 3 || i/10 == 3 ){
                count++;
            }
        }
        System.out.println(count);
    }
}
public class ex40 {
    public static void main(String[] args) {
        //연습문제 21 - for문 연습
        //영희가 1부터 100까지 번호가 쓰인 징검다리 돌을
        //지나고 있다.
        //뒷자리가 2나 7로 된 돌은 밣지 않고 건너려고 한다.
        //영희가 밣은 벽돌의 갯수와 밣지 않은 벽돌의 갯수를
        //출력하시오.
        int skipCount = 0;
        for(int i=1; i<101; i++){
            if(i%10==2 || i%10==7){
                skipCount++;
            }
        }
        System.out.println("영희가 밣은 벽돌의 갯수:"+(100-skipCount));
        System.out.println("밣지 않은 벽돌의 갯수:"+skipCount);

    }
}
public class ex41 {
    public static void main(String[] args) {
        //중첩 반복문 - for문 안에 for문 들어간 경우
        for(int i=1; i<6; i++){
            System.out.println( "i:" + i );
            for(int j=1; j<6; j++){
                System.out.println( "j:" + j);
            }
        }
        //2중 반복문을 이용하여, 구구단 2단~9단까지 출력해보자.
        // 2*1 = 2   ... 9*1 = 9
        // 2*2 = 4   ... 9*2 = 18
        // ...
        // 2*9 = 18  ... 9*9 = 81
        // i루프는 2~9까지, j루프는 1~9까지 움직인다.
        for(int i=2; i<=9; i++){
            for(int j=1; j<=9; j++){
                System.out.println( i + "*" + j + "=" + i*j );
            }
        }

    }
}

while 문

for 문과 더불어 반복문이다.

while문은 for문과 그 형식이 약간 다르다.

 

형식:

변수 초기화

while ( 조건 ) {

    수행문

    증감문

}

 

while문은 for문과 그 형식에서만 다를뿐, 나머지는 큰 차이가 없다.

가독성과 코드를 사용자 편의를 고려해 상황에 맞춰 사용하면 된다.

public class ex42 {
    public static void main(String[] args) {
        // 반복문 - while문

        //for문 패턴
        //for( 초기화; 조건; 증감 ) {
        //  수행문
        //}
        for( int i=0; i<5; i++ ){
            System.out.println(i);
        }
        //while문 패턴
        //초기화
        //while( 조건 ) {
        //  수행문
        //  마지막에 증감문
        //}
        int i=0;
        while( i<5 ){
            System.out.println(i);
            i++;
        }
        //연습문제 22 - while문 연습
        //1. j값이 10부터 20까지 출력되도록 하시오.
        int j = 10;
        while( j <= 20 ){
            System.out.println(j);
            j++;
        }
        //2. j값이 10부터 -10까지 출력되도록 하시오. 감소
        j = 10;
        while( j >= -10 ){
            System.out.println(j);
            j--;
        }
        //3. j값이 1부터 100까지 3의 배수만 출력되도록 하시오.
        j = 1;
        while( j <= 100 ){
            if(j%3==0){
                System.out.println(j);
            }
            j++;
        }
        //4. 100을 1부터 100까지 나누어 약수의 갯수를 구하시오.
        j = 1;
        int count = 0;
        while( j <= 100 ){
            if( 100%j == 0 ){
                System.out.println("100의 약수:"+j);
                count++;
            }
            j++;
        }
        System.out.println("100의 약수갯수는"+count);
    }
}
import java.util.Random;

public class ex43 {
    public static void main(String[] args) {
        //연습문제 23 - while문 연습
        //   어떤 터널이 낮아서 최대로 들어갈 수 있는
        //   차량의 높이는 5미터 이하이다.
        //   1~10(미터단위)까지 차량이 임의로 10대 들어올때,
        //   (1~10까지 랜덤수 발생함)
        //   차량이 들어갈 수 있으면, 통과!
        //   못들어가면, 후퇴! 를 출력하시오.
        Random rand = new Random();
        int carCount = 0;
        while( carCount <= 10 ) {
            int carHeight = rand.nextInt(10) + 1;
            System.out.println(carHeight);
            if( carHeight > 5 ) {
                System.out.println("후퇴!");
            }else{
                System.out.println("통과!");
            }
            carCount++;
        }
        
        //연습문제 24 - 2중 for문을 이용하시오.
        // 1부터 100사이의 소수를 찾아서 출력하시오.
        // 소수는 약수가 1 또는 자기 자신인 수를 의미함.
        // 예) 2의 약수 : 1, 2
        //     3의 약수 : 1, 3
        //     4의 약수 : 1, 4, 2  소수아님

        //어떤 수의 소수를 구하려면, 1부터 자기자신까지 나눠서
        //나머지가 0인 수의 갯수가 2이면 소수이다.

        //1부터 100까지의 약수 구하기
        for(int n=1; n<=100; n++){
            int div_count = 0;//약수 카운트
            for( int j = 1; j <= n; j++ ){
                if( n % j == 0){
                    //나누어 떨어지면 약수이다
                    div_count++;
                }
            }
            if( div_count == 2 ){ //약수의 갯수가 2개이면, 소수이다!
                System.out.println(n+"은 소수입니다.");
            }
        }

    }
}

이 문제는 확실히 고생했다.

논리 조건과 알고리즘은 금방 만들었지만, 출력문의 위치를 잘못 잡아서 한참을 머리를 싸매고 고생했다.

if문과 for문을 본격적으로 사용하기 시작하면 영역이 무수히 많이 생긴다.

어느 지역(local)에서 어떤 변수를 선언해야 하는지, 어떤 코드가 끝나고 어떤 코드가 실행되게 순서를 짜야하는지, 헷갈리지 않게 주의깊게 봐야만 한다.

 

국비로 학원에 다닌지 일주일이 지났다.

하루에 8시간을 학원에 앉아서 공부만 한다.

아는 내용이 나오면 알아서 졸리고, 몇시간이 지나면 엉덩이가 아프다. 수업 내내 의자에 앉아 컴퓨터 화면만 들여보고 있다보니 거북목과 허리 건강도 걱정이 된다. 무엇보다 6시간쯤 되면 내 집중력이 급격하게 떨어진다. 정상적인 상태에선 5분안에 짤 수 있는 간단한 코드도 이상하게 머리가 안돌아가서 20분씩 붙잡게 된다.

 

파이썬으로 기본적으로 언어를 다룰줄 알고, 컴퓨터 아키텍쳐에 대해 얕게나마 공부해서 cpu와 메모리가 어떤식으로 돌아가고 어떤 역할을 하는지 아는 나조차도 이렇다. 수업 내용에 어려운 것이 없고, 연습 문제도 완벽하게 다 풀어내고, 집에 와서 2시간씩 복습하는데도 가끔씩 헷갈리거나 막힐 때가 존재한다. 아무것도 모르는 사람이 국비 수업을 듣는다는 것은 어느정도의 희생과 노력이 필요할지 가늠이 안될 정도다. 하지만 나는 적어도 남들보다 앞에서 시작한 만큼, 이 6개월 과정이 끝날때도 뒤쳐지지 않도록 노력할것이다.

'공부 > java' 카테고리의 다른 글

자바(java)의 열거형 표현  (0) 2023.01.23
자바(java)의 배열  (0) 2023.01.23
자바(java)의 난수(랜덤수) 출력  (0) 2023.01.23
자바(java)의 조건문(1)  (1) 2023.01.23
자바(java)의 연산(1)  (0) 2023.01.23