[Java의 정석] Chapter 04 조건문과 반복문 statement

치즈말랑이·2021년 12월 30일
0

자바의 정석

목록 보기
3/3

2021-12-29~2021-12-30

[연습문제]

[4-1]
8. 문자열은 ==이 아니고 equals 사용
[4-3] : 1+(1+2)+(1+2+3)+...(1+2+3+...+10)의 결과를 계산하시오.

        int summ =0;
        int totalsum = 0;
        for (int i = 1; i <= 10; i++) {
            summ += i;
            totalsum += summ;
        }
        System.out.println("4-3 문제 답 : "+totalsum);

[4-4] : 1+(-2)+3+(-4)+... 과 같은 식으로 계속 더해나갔을 때, 몇까지 더해야 총합이 100이상이 되는지 구하시오

//내풀이
        int sumi = 0;
        for (int i = 1; i<10000; i++) {
            if (sumi < 100) {
                if (i % 2 != 0) {
                    sumi += i;
                } else if (i % 2 == 0) {
                    sumi -= i;
                }
                if (sumi >= 100) {
                    System.out.println("4-4 답: " + i);
                    break;
                }
            }
            }
//해설풀이
        int ssum = 0; // 총합을 저장할 변수
        int sss = 1; // 값의 부호를 바꿔주는데 사용할 변수
        int nnum = 0;

        // 조건식의 값이 true이므로 무한반복문이 된다.
        for (int i = 1; true; i++, sss = -sss) { // 매 반복마다 s의 값은 1, -1, 1, -1...
            nnum = sss * i;
            ssum += nnum;

            if (ssum >= 100) { //총합이 100보다 같거나 크면 반복문을 빠져 나간다.
                System.out.println("4-4 해설풀이 " + i);
                break;
            }

        }
        
// for문을 더 간략히 하면 다음과 같이 할 수 있다.
for(int i=1; sum<100; i++, s=-s) {
	num = i*s;
    sum += num;
}

[4-7]
Math.random() 메서드는 0<= <1 이라는것을 기억하자.
[4-10] : int타입의 변수 num이 있을 때, 각 자리의 합을 더한 결과를 출력하는 코드를 완성하라. 만일 변수 num의 값이 12345라면 '1'+'2'+'3'+'4'+'5'의 결과인 15를 출력하라.

        int num =12345;
        int sum3 = 0;

        while (num > 0) {
            sum3 += num%10;
            num /= 10;
        }
        System.out.println("4-10답 : " + sum3);

[4-11] 피보나치 수열

        int num1 = 1;
        int num2 = 1;
        int num3 = 0; //세번째 값
        System.out.print(num1 + "," + num2);

        for (int i = 0; i < 8; i++) {
            num3 = num1+num2; // 세번째 값은 첫번째와 두번째 값을 더해서 얻는다.
            System.out.print("," + num3); // 세번째 수열 출력
            num1=num2;
            num2=num3;
        }

[4-15] : 회문수 구하는 프로그램

        int number = 12321;
        int tmpp = number;

        int result = 0; // 변수 number를 거꾸로 변환해서 담을 변수

        while (tmpp != 0) {
            result = tmpp%10 + result*10; // 기존 결과에 10을 곱해서 더한다.
            tmpp = tmpp/10;
        }

        if (number == result)
            System.out.println(number + "는 회문수 입니다.");
        else
            System.out.println(number + "는 회문수가 아닙니다.");

1.조건문 - if, switch

조건문은 조건식과 문장을 포함하는 블럭{}으로 구성되어 있다.
조건문은 if문과 switch문이 있고, 주로 if문이 많이 사용된다.

if문
if 조건식이 true이면 괄호{} 안의 문장들을 수행하라. 라는 의미이다.

if (조건식) {
//조건식이 true일 때 수행될 문장들을 적는다.
}

블럭 {}
여러 문장을 하나의 단위로 묶을 수 있는데, 이것을 블럭이라고 한다.
} 다음에 문장의 끝을 의미하는 ;을 붙이지 않는다.

if-else문
if문에서 false일 때 else블럭의 문장을 수행하라는 뜻이다.

if (조건식) {
// 조건식이 참(true) 일 때 수행될 문장들을 적는다.
} else {
// 조건식이 거짓(false) 일 때 수행될 문장들을 적는다.
}

if-else if문

if (조건식1) {
//조건식1의 연산결과가 참일 때 수행될 문장들을 적는다.
} else if (조건식2) {
//조건식2의 연산결과가 참일때 수행될 문장들을 적는다.
} else if (조건식3) { // 여러 개의 else if를 사용할 수 있다.
// 조건식3의 연산결과가 참일 때 수행될 문장들을 적는다.
} else { // 마지막에는 보통 else블럭으로 끝나며, else블럭은 생략가능하다.
// 위의 어느 조건식도 만족하지 않을 때 수행될 문장들을 적는다.
}

중첩 if문
if문의 블럭 내에 또 다른 if문을 포함시키는 것이 가능하다.

if (조건식1) {
// 조건식1의 연산결과가 true일 때 수행될 문장들을 적는다.
	if (조건식2) {
    // 조건식1과 조건식2가 모두 true일 때 수행될 문장들
    } else {
    // 조건식1이 true이고, 조건식2가 false일 때 수행되는 문장들
} else {
//조건식1이 false일 때 수행되는 문장들
}

switch문
if문은 조건식의 결과가 참과 거짓, 두가지밖에 없기 때문에 경우의 수가 많아질수록 else-if를 계속 추가해야하므로 조건식이 많아져서 복잡해지고, 여러 개의 조건식을 계산해야 하므로 처리시간도 많이 걸린다.
switch문은 단 하나의 조건식으로 많은 경우의 수를 처리할 수 있고, 표현도 간결하므로 알아보기 쉽다.

switch문은 조건식을 먼저 계산한 다음, 그 결과와 일치하는 case문으로 이동한다. 이동한 case문 아래에 있는 문장들을 수행하며, break문을 만나면 전체 switch문을 빠져나가게 된다.

switch문의 제약조건
1. switch문의 조건식 결과는 정수 또는 문자열이어야 한다.
2. case문의 값은 정수 상수만 가능하며, 중복되지 않아야 한다. (실수, 변수 리터럴 불가)
switch (조건식) {
	case1 :
    // 조건식의 결과가 값1과 같을 경우 수행될 문장들
		break; //switch문을 벗어난다.
	case2 :
    // 조건식의 결과가 값2와 같을 경우 수행될 문장들
	case3 :
    // case 값2: 에 break문이 없으므로 case 값2:를 수행하면 case값3:까지 수행된다.
		break;
	default:
    // 조건식의 결과와 일치하는 case문이 없을 때 수행될 문장들
case 3:
case 4:
case 5:
=
case 3: case 4: case 5:
//같은 표현이다.

문자열.charAt(index)

gender = regNo.charAt(7); // 입력받은 번호의 8번째 문자를 gender에 저장

switch문도 중첩이 가능하다. break문을 빼먹지 말아야 한다.

2.반복문 - for, while, do-while

반복문은 어떤 작업이 반복적으로 수행되도록 할 때 사용되며, 반복문의 종류로는 for문과 while문, 그리고 while문의 변형인 do-while문이 있다.
for문이나 while문에 속한 문장은 조건에 따라 한 번도 수행되지 않을 수 있지만 do-while문에 속한 문장은 무조건 최소한 한 번은 수행될 것이 보장된다.
for문은 주로 반복횟수를 알고 있을 때 사용한다.

for문

for(int i=1; i<=5; i++) {
	System.out.println("I can do it.");
}

변수 i에 1을 저장한 다음, 매 반복마다 i의 값을 1씩 증가시킨다. 그러다가 idml rkqtdl 5fmf sjadmaus whrjstlr i<=5가 거짓이 되어 반복을 마치게 된다.

for (초기화;조건식;증감식) {
// 조건식이 참일 때 수행될 문장들을 적는다.
}

초기화: 반복문에 사용될 변수를 초기화하는 부분이며 처음에 한번만 수행된다. 둘 이상의 변수가 필요할 때는 ,로 구분하면 된다. 두 변수의 타입은 같아야 한다.

for(int i=1, j=0; i<=10; i++) {...} 
//int타입의 변수 i와 j를 선언하고 초기화

조건식: 조건식의 값이 true이면 반복을 계속하고, false이면 반복을 중단하고 for문을 벗어난다. for의 뜻이 ~하는 동안 이므로 조건식이 참인 동안 반복을 계속한다고 생각하면 쉽다.

증감식: 반복문을 제어하는 변수의 값을 증가 또는 감소시키는 식이다.

for (int i=1, j=10; i<=10; i++, j--) {
	System.out.println("%d \t %d%n", i, j);
}

for (int i=1; i<=10; i++) {
	System.out.println("%d \t %d%n", i, 11-i);
}

중첩 for문
별찍기가 가장 좋은 예이다.

for (int i=0; i<num; i++) {
	for (int j=0; j<=i; j++) {
	System.out.print("*");
	}
    System.out.println();
}

향상된 for문
JDK1.5부터 새로운 for문 문법이 추가 되었다.

for (타입 변수명 : 배열 또는 컬렉션) {
//반복할 문장
}

위의 문장에서 타입은 배열 또는 컬렉션의 요소의 타입이어야 한다. 배열 또는 컬렉션에 저장된 값이 매 반복마다 하나씩 순서대로 읽혀서 변수에 저장된다. 그리고 반복문의 괄호{}내에서는 이 변수를 사용해서 코드를 작성한다.

int[] arr = {10, 20, 30, 40, 50};

for (int tmp : arr) {
	System.out.println(tmp);
}

for (int i=0; i < arr.length; i++) {
	System.out.println(arr[i]);
}

while문

while (조건식) {
// 조건식의 연산결과가 참(true)인 동안, 반복될 문장들을 적는다.
}

while문은 먼저 조건식을 평가해서 조건식이 거짓이면 문장 전체를 벗어나고, 참이면 블럭{} 내의 문장을 수행하고 다시 조건식으로 돌아간다. 조건식이 거짓이 될 때까지 이 과정이 계속 반복된다.

for문과 while문의 비교

// 초기화, 조건식, 증감식
for (int i=1; i<=10; i++) {
	System.out.println(i);
}
----------------------------------
int i=1; // 초기화
while(i<=10) { // 조건식
	System.out.println(i);
    i++; //증감식
}

while문의 조건식은 생략할 수 없다.
조건식이 ;; 이거나 true이면 항상 참이므로 반복문 블럭 {}내의 문장을 무한 반복한다.

while(i-- != 0) {
	System.out.println(i);
}
-------------------------------
while(i != 0) {
	i--;
	System.out.println(i);
}

--i의 경우 while문의 위에 오게 된다.
빈 문장을 넣을 경우 블럭안에 ; 하나를 써주면 된다.

do-while문
while문의 변형으로 기본적인 구조는 while문과 같으나 조건식과 블럭{}의 순서를 바꿔놓은 것이다. 그래서 while문과 반대로 블럭{}을 먼저 수행한 후에 조건식을 평가한다. while문은 조건식의 결과에 따라 블럭{}이 한번도 수행되지 않을 수 있지만 do-while문은 최소한 한번은 수행될 것을 보장한다.

do {
// 조건식의 연산결과가 참일 때 수행될 문장들을 적는다.
} while (조건식) ; // 끝에 ; 잊지 않도록 주의

break문
자신이 포함된 가장 가까운 반복문을 벗어난다.

continue문
반복문 내에서만 사용될 수 있으며 반복이 진행되는 도중에 continue문을 만나면 반복문의 끝으로 이동하여 다음 반복으로 넘어간다. for문의 경우 증감식으로 이동하며, while문과 do-while문의 경우 조건식으로 이동한다.
반복문 전체를 벗어나지 않고 다음 반복을 계속 수행한다는 점이 break문과 다르다.

이름붙은 반복문
break문은 근접한 단 하나의 반복문만 벗어날 수 있기 때문에, 여러개의 반복문이 중첩된 경우에는 break문으로 중첩 반복문을 완전히 벗어날 수 없다. 이때는 중첩 반복문 앞에 이름을 붙이고 break문과 continue문에 이름을 지정해 줌으로 써 하나이상의 반복문을 벗어나거나 반복을 건너뛸 수 있다.

        Loop1 :
        for (int i = 2; i <= 9; i++) {
            for (int j = 1; j <= 9; j++) {
                if (j == 5) {
                    break Loop1;
profile
공부일기

0개의 댓글