[Java] 조건문, 반복문

1. 조건문

조건문허용되는 타입
if문Boolean, boolean
switch문byte, Byte, short, Short, char, Character, int, Integer, String, enum

다만, switch문의 괄호 안에는 long 타입을 사용할 수 없습니다.


가. if문

//1번
if(a > b) {
    if(a > c) {
        System.out.println(a);
    }else {
        System.out.println(c);
    }
}else {
    if(b > c) {
        System.out.println(b);
    }else {
        System.out.println(c);
    }
}
Code language: JavaScript (javascript)
//2번
if(a > b) {
    if(a > c) {
        System.out.println(a);
    }else {
        System.out.println(c);
    }
}else if(b > c) {
    System.out.println(b);
}else {
    System.out.println(c);
}
Code language: JavaScript (javascript)

2번을 사용해라.

판단 기준(a)이 달라지면 새로운 if문을 생성하라.


나. short circuit

short circuit : 짧은 단위의 논리연산

int a = 3, b = 5, c = 4;
boolean flag = true;
flag = flag && (++a > 6);
System.out.println(flag + ", a : " + a);
// false, a : 4
Code language: JavaScript (javascript)
int a = 3, b = 5, c = 4;
boolean flag = false;
flag = flag && (++a > 6);
System.out.println(flag + ", a : " + a);
// false, a : 3
Code language: JavaScript (javascript)

자바는 짧은 단위의 논리 연산을 지원한다.


다. switch-case문

월별로 마지막 날을 출력하는 프로그램을 switch-case문으로 만들어 보았다.

int month = 1;
switch(month) {
case 1 :
case 3 :
case 5 :
case 7 :
case 8 :
case 10 :
case 12 :
    System.out.println(31);
    break;
case 4 :
case 6 :
case 9 :
case 11 :
    System.out.println(30);
    break;
case 2 :
    System.out.println(28);
    break;
default :
    System.out.println("i dont know");
}
Code language: JavaScript (javascript)

너무 길고 비효율적이다.

int month = 1;
switch(month) {
case 4 :
case 6 :
case 9 :
case 11 :
    System.out.println(30);
    break;
case 2 :
    System.out.println(28);
    break;
default :
    System.out.println(31);
}
Code language: JavaScript (javascript)

유사 작업은 모아서 처리하고 압도적으로 많이 사용되는 경우를 default에서 처리하자.

잘 사용하면 굉장히 효율적이다.


2. 반복문

반복문의 4가지 요소 : 초기식, 조건식, 증감식, 실행문

import java.util.Random;

public class Lang_07 {
    public static void main(String[] args) {
        byFor();
        byWhile();
    }

    private static void byFor() {
        int sum = 0;
        int cnt = 100;
        double avg = 0;
        Random rand = new Random();

                for(int i = 0; i < cnt; i++){
                    sum += rand.nextInt(6) + 1; //0~5 + 1
                }

                avg = 1.0*sum/cnt;
                System.out.printf("sum: %d, avg: %.1f%n", sum, avg);
    }

    public static void byWhile() {
        int sum = 0;
        int cnt = 100;
        double avg = 0;
        Random rand = new Random();

                int i =0;
                while(i< cnt){
                    sum += rand.nextInt(6) + 1; // 0~5 +1
                    i++;
                }
                avg = 1.0*sum/cnt;
                System.out.printf("sum: %d, avg: %.1f%n", sum, avg);
    }

}

/*
sum: 335, avg: 3.4
sum: 327, avg: 3.3
*/
Code language: JavaScript (javascript)
  • %.1f : float 소수점 1자리까지 반올림.
public class Atest {

    public static void main(String[] args) {
        float f = 3.3338f;
        System.out.printf("f : %.3f %n", f);
        f = 3.3335f;
        System.out.printf("f : %.3f %n", f);
    }
}
/*
f : 3.334
f : 3.333
*/
Code language: JavaScript (javascript)
  • f = 3.3335f; : 3.3354로 반올림되어야 하지만 실수의 표현 한계(3.3334....)로 실제론 3.333으로 반올림됨.

그냥 믿지 말자.


가. rabel break, rabel continue

중첩된 반복문을 break, continue하는 방법.

label:for(int i = 1; i <= 9; i++) {
    for(int j = 1; j <= 9; j++) {
        if(i==3) {
            break label;
        }
        if(j==4){
            contiune label;
        }
        System.out.println(i + "*" + j + " = " + i*j);
    }
    System.out.println("---------------------");    
}
Code language: JavaScript (javascript)

label 자리는 label가 아닌 아무런 단어가 와도 된다.


나. 개선된 for문

int arr[] = {4,5,6,7,8,9};

int s = 0;
for(int data : arr){
    s++;
    if(s == 2) {
        data = 999;
    }
    System.out.println(data);
}

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

/*
4
999
6
7
8
9
4
5
6
7
8
9
*/
Code language: JavaScript (javascript)

for(int data : arr){dataarr의 값을 복사한 복사본이다.

값을 수정한다고 해서 원본이 변하진 않는다.

실제로 arr[1]999로 수정되지 않는다.

단, 경우에 따라서 수정되는 경우가 있다.

복사해 온 값이 주소값이면 원본은 수정된다.

잘 구분해서 사용하자.

Java는 아니지만 참고할 수 있는 경우다.


댓글 남기기