본문 바로가기

코딩 공부/Java

[Java] 08_기본문법활용

기본문법활용

문법간의 중첩 구조

조건문, 반복문을 구성하는 블록 {}안에 다른 문법 표현이 포함될 수 있다.

자주 사용되는 패턴으론느 if-if, if-for, for-if, for-for가 있다.

if-if 구조

특정 조건이 참으로 판단되어 블록안에 진입했을 때, 상세조건을 판별하는 구조.

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

IfNesting.java

    public class IfNesting {
        public static void main(String[] args) {
            int point = 78;

            if (point > 70 && point <= 80) {
                if (point > 77) {
                    System.out.println("C+ 입니다.");
                } else if (point < 74) {
                    System.out.println("C- 입니다.");
                } else {
                    System.out.println("C0 입니다.");
                }
            }
        }
    }
출력결과
C+ 입니다.

if-for 구조

특정 조건이 참으로 판단되어 블록안에 진입했을때, 반복을 수행하는 구조.

    public class IfFor {
        public static void main(String[] args) {
            int k = 10;

            if (k > 1 && k < 10) {
                for (int i = 1; i<10; i++){
                    System.out.printf("%d x %d = %d\n", k , i, k*i);
                }
            } else {
                System.out.println("2~9 사이의  수식만 출력합니다.");
            }
        }
    }
출력결과
2~9 사이의  수식만 출력합니다.

for-if 구조

반복문 안에서 매 반복 수행시마다 조건을 판별한다. 주로 반복문에 사용되는 조건값에 대한 조건 판별을 위해 사용된다.

ForIf.java

    public class ForIf {
        public static void main(String[] args) {
            int max = 10;
            int oddSum = 0;
            int evenSum = 0;

            for(int i =1; i<= max; i++) {
                if (i % 2 == 0) {
                    System.out.printf("%d는 짝수\n", i);
                    evenSum += 1;
                } else {
                    System.out.printf("%d는 홀수\n", i);
                    oddSum += 1;
                }
            }
            System.out.printf("1~%d까지 홀수들의 합: %d\n", max, oddSum);
            System.out.printf("1~%d까지 짝수들의 합: %d]n", max, evenSum);
        }
    }
출력결과
1는 홀수
2는 짝수
3는 홀수
4는 짝수
5는 홀수
6는 짝수
7는 홀수
8는 짝수
9는 홀수
10는 짝수
1~10까지 홀수들의 합: 5

CommonMultiple.java

어떤 수 i가 x로 나누어도 나머지가 0이고 y로 나누어도 나머지가 0일 때 이 수를 x와 y의 공배수라고 한다.

2부터 9사이의 두 개의 정수 x, y를 입력받아 1부터 100까지의 범위 안에서 x와 y의 공배수를 모두 출력하고 공배수의 총합인 sum값을 구해 출력하시오.

    import java.util.Scanner;

    public class CommonMultiple {
        public static void main(String[] args) {

            Scanner read = new Scanner(System.in);

            System.out.print("2~9사이의 x를 입력하세요:");
            int x = read.nextInt();
            System.out.print("2~9사시의 y를 입력하세요:");
            int y = read.nextInt();

            int i =1;
            int sum = 0;
            for(i=1; i<=100; i++){
                if(i%x == 0){
                    if(i % y == 0){
                    sum += i;
                    System.out.println(i);
                    }            
                }
            }
            System.out.printf("공배수의 총 합: %d\n", sum);
        }
    }
출력결과
2~9사이의 x를 입력하세요3
2~9사시의 y를 입력하세요5
15
30
45
60
75
90
공배수의 총 합: 315

ForFor.java

    public class ForFor {
        public static void main(String[] args) {
            for(int i=0; i<3; i++){
                System.out.println("i에 대한 반복 수행 시작 >>i=" + i);
                for(int j=0; j<5; j++){
                    System.out.printf("\t-=%d, j=%d\n", i, j);
                }
                System.out.println("i에 대한 반복 수행 종료 >>i=" + i);
            }
        }
    }
출력결과
실습 참조

LastNone.java

public class LastNone {
public static void main(String[] args) {
for (int i=0; i<10; i++) {
// 조건값이 마지막이 아닌 경우만 실행하도록 if문을 구성
// [공식1] 조건식이 "변수 < 최대값" 인 경우 -> 변수 + 1 < 최대값
// [공식2] 조건식이 "변수 <= 최대값" 인 경우 -> 변수 < 최대값
if (i + 1 < 10) {
System.out.println("i=" + i);
}
}
}
}

출력결과
i=0
i=1
i=2
i=3
i=4
i=5
i=6
i=7
i=8

Gugudan.java

2단부터 9단까지의 모든 구구단 수식을 출력하세요.

마지막 9단을 제외한 모든단은 종료시마다 구분선 (---------------)을 출력하도록 구현하세요

public class Gugudan {
    public static void main(String[] args) {

        for(int i=1; i<10; i++){            // 1단 부터 9단까지 지정을 해주는 변수값
            for(int j = 1; j<10; j++) {        // 한 단에서 1~9까지 곱해주는 변수값
                System.out.printf("%d X %d = %d\n", i, j, i*j);    // 구구단을 출력해준다.
            }
        if(i+1<10){                                //각 단마다 나눠주고 9단일때만 출력X
            System.out.println("--------------------------");
            }
        }
    }
}
출력결과
실습참조

IncreaseCondition.java

1부터 5까지의 범위를 갖는 반복문 안에 자식 반복문을 추가하고 자식 반복문이 부모 반복문의 반복회차 만큼 실행되도록 하기

    public class IncreaseCondition{
        public static void main(String[] args) {
            for(int i=0; i<5; i++){
                for(int j=0; j<j+1; j++){
                    System.out.printf("i=%d, j=%d\n", i, j);
                }

                if (i + 1 < 5){
                    System.out.println("--------------");
                }
            }
        }
    }
출력결과
실습참조

StarAsc.java

아래의 출력결과가 표시되도록 구현하세요.

변수는 반복문에 사용되는 i, j 외에 사용할 수 없으며 출력문은 System.out.print()만을 사용해야 합니다.

    public class StarAsc {
    public static void main(String[] args) {
        int i;
        int j;

        for(i=0; i<7; i++){                // i를 7번 반복시킨다
            for(j=0; j<i+1; j++){        // j를 i 값만큼 반복시켜 별을 찍는다
                System.out.print("*");
                }

            // if(i < 7){                    // j의 반복을 끝내고 나와서 i가 7보다 작다면 한칸내린
                System.out.print("\n");        // 주석처리한부분도 한가지의 방법
            //}
        }
    }
}
출력결과

*
**






#05. 변수의 유효성 범위

변수는 자신이 최초로 선언된 블록 {}보다 바깥 블록에서는 인식되지 못하고 자신이 선언된 블록보다 안쪽 블록에서는 식별 가능하다.

ValueRange1.java

    public class ValueRange1{
        public static void main(String[] args) {
            if (true) {
                int num = 100;

                for (int i =0; i<5; i++) {
                    //선언된 위치보다 하위 블록에서는 식별 가능
                    num++;
                }
            }

            // 선언된 위치보다 바깥 블록이므로 에러
            System.out.println(num);
            // num은 if를 벗어난 곳에서는 식별되지 않는다
        }
    }
출력결과
ValueRange1.java:13: error: cannot find symbol
        System.out.println(num);
// num을 인식하지 못한다.

ValueRange2.java

    public class ValueRange2 {
        public static void main(String[] args) {
            if (true) {
                int num = 100;

                for (int i =0; i<5; i++) {
                    //선언된 위치보다 하위 블록에서는 식별 가능
                    num++;
                }
            }

            // 선언된 위치보다 바깥 블록이므로 에러
            System.out.println(i);
            // i는 if를 벗어난 곳에서는 식별되지 않는다
        }
    }

출력결과

ValueRange2.java:13: error: cannot find symbol
        System.out.println(i);
// for문을 벗어난 i를 인식하지 못한다.

3) 서로 다른 블록간의 변수 중복 선언

선언된 위치를 기준을 ㅗ바깥 블록에서는 그 변수를 인식하지 못하기 때문에 서로 다른 블록간에는 중복 선언이 가능하다.

ValueRange3.java

    public class ValueRange3{
        public static void main(String[] args) {
            int target = 100;

            if(target == 100) {
                // 아래에서 선언된 num은 if 블록 밖에서는 인식되지 않는다.
                int num = target + 100;
                System.out.println(num); 
            } else {
                // 아래에서 선어된 num은 else 블록 밖에서는 인식되지 않는다.
                int num = target - 100;
                System.out.println(num);
            }
        }
    }
출력결과
200

1) 무한루프

반복문의 조건식 설정상의 오류로 반복문이 종료되지 않고 영원히 실행되는 상태.

반복문이 실행되는 동안은 순간적으로 CPU의 점유율이 100%까지 올라가기 때문에 다른 프로그램들이 컴퓨터의 하드웨어 자원을 사용하지 못하게 되어 젠체적으로 컴퓨터의 성능 저하가 발생한다.

그러므로 무한루프에 바지지 않도록 주의해야 한다.

InfiniteLoop1.java

    public class InfiniteLoop1 {
        public static void main(String[] args) {
            int num = 1;
            while(true) {
                System.out.println("Hello World >> " + num);
                num++;
            }
        }
    }
출력결과

Sublime에서는 Tools > Cancel Build 메뉴를 사용하여 실행중인 자바프로그램을 종료해야 한다.
단순히 Esc만 누를 경우 자바프로그램이 종료되지 않은 상태로 출력창만 닫힌다.

계속 1씩 무한루프로 더해진다

InfiniteLoop2.java

1씩 증가해서 언젠가는 10을 초과해야 하는 i캆이 1씩 감소하여 점점 10보다 더 작아지기 때문에 무한루프에 빠지게 된다.

public class InfiniteLoop2 {
        public static void main(String[] args) {
            for (int i = 0; i<10; i--)
                System.out.println("i= " + i);
            }
        }
출력결과
...생략...
i=-102396
i=-102397
i=-102398
...생략...

3) break

반복문(while, for)안에서 반복문을 강제로 중단시키는 기능을 한다.

반복을 몇 번 수행해야 할지 가늠할 수 없을때 의도적을 무한루프를 수행시키기도 하는데 이 경우 특정조건이 충족되면 반복을 중단하도록 설정할 수 있다.

Break.java

두 배씩 증가하는 값이 500보다 커지기 위해서는 총 몇 번 곱해야 하는지 카운트하기

    public class Break{
        public static void main(String[] args) {
            int times = 1;    // 2배씩 커지는 값을 저장할 변수
            int count = 0;    // 반복 횟수를 저장할 변수
            while(true) {
                count++;    // 반복을 수행한 횟수를 1증가 시킨다.
                times *= 2;    // 2배 증가
                System.out.println(times);

                if(times > 500) {
                    break;
                }
            }
            System.out.println("총 " + count + "회 수행했습니다.");
        }
    }
출력결과
2
4
8
16
32
64
128
256
512
총 9회 수행했습니다.

3) continue

반복문 안에서 현재 회차를 중단하고 다음 회차로 넘어가게 한다.

  • while문 : 조건식으로 강제 이동한다.
  • for문 : 증감식으로 강제 이동ㅎ나다.

Continue1.java

홀수만 출력하는 프로그램

    public class Continue1{
        public static void main(String[] args) {
            int num = 0;

            while( num < 10){
                num++;
                if (num % 2 ==0) {
                    continue;    //짝수인 경우 조건식으로 강제 이동
                }
                System.out.println(num);
            }
        }
    }
출력결과
1
3
5
7
9

사실 아래와 같이 코딩하는 것이 더 간결하기 때문에 잘 사용되지 않는다.

    public class Continue1{
        public static void main(String[] args) {
            int num = 0;

            while( num < 10){
                num++;
                if (num % 2 !=0) {
                        System.out.println(num);
                }//홀수면 출력
            }

        }
    }

Continue2.java

0부터 10미만의 수 중에서 홀수의 합을 구하는 과정을 출력하는 프로그램

    public class Continue2{
        public static void main(String[] args) {


        int sum = 0;

            for(int i=0; i<10; i++){
                if ( i % 2 == 0){
                    continue;    // for문의 중감식인 `i++`로 이동한다.
                }
                sum += i;
                System.out.println(sum);
            }
        }
    }
출력결과
1
4
9
16
25

사실 아래와 같이 코딩하는 것이 더 간결하기 때문에 잘 사용되지 않는다.

    public class Continue2{
        public static void main(String[] args) {


        int sum = 0;

            for(int i=0; i<10; i++){
                if ( i % 2 != 0){
                    sum += i;
                System.out.println(sum);
                }
            }
        }
    }

4) 반복의 변화량 조절

거의 대부분의 경우 조건값이 1씩 증가하거나 1씩 감소하도록 설정하지만 필요하다면 변화량을 조절하여 2씩 증가하거나 10씩 증가하는 등 다양하게 설정할 수 있다.

Step1.java

    public class Step1{
        public static void main(String[] args) {
            int sum = 0;        // 총 합을 저장할 변수
            int i = ;            // 초기식

            while ( i < 100) {    // 조건식
                sum += i;
                System.out.printf("i=%d, sum=%d\n", i, sum);

                i += 10;        // 증감식 (10씩 증가)
            }
        }
    }
출력결과
i=0, sum=0
i=10, sum=10
i=20, sum=30
i=30, sum=60
i=40, sum=100
i=50, sum=150
i=60, sum=210
i=70, sum=280
i=80, sum=360
i=90, sum=450

Step2.java

0부터 10미만 수 중에서 짝수만 골라서 합산하는 프로그램

짝수만 판단하기 위해 증감식이 2씩 증가한다.

    public class Step2{
        public static void main(String[] args) {
            int sum = 0;            // 총 합을 저장할 변수

            for (int i = 0; i<10; i+=2){
                sum += i;
                System.out.printf("i=%d, sum=%d\n", i, sum);
            }
        }
    }
출력결과

i=0, sum=0
i=2, sum=2
i=4, sum=6
i=6, sum=12
i=8, sum=20

'코딩 공부 > Java' 카테고리의 다른 글

[Java] 10_배열  (0) 2020.05.08
[Java] 09_형변환  (0) 2020.05.08
[Java] 07_반복문  (0) 2020.05.08
[Java] 06_조건문  (0) 2020.05.08
[Java] 05_기본입출력  (0) 2020.05.08