[Java] 조건문, 반복문

2024. 1. 21. 17:24공부 중/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);
    }
}
//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);
}

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);
// true, a : 4
int a = 3, b = 5, c = 4;
boolean flag = false;
flag = flag && (++a > 6);
System.out.println(flag + ", a : " + a);
// false, a : 3

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

 


다. 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);
default :
    System.out.println("i dont know");
}

너무 길고 비효율적이다.

 

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

유사 작업은 모아서 처리하고 압도적으로 많이 사용되는 경우를 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
*/
  • %.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
*/
  • 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("---------------------");    
}

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
*/

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

 

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

 

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

 

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

 

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

 

잘 구분해서 사용하자.

 

 

[알고리즘] 창용 마을 무리의 개수

0. 문제 SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 1. 문제 이해 이건 인접리스트를 만들고 dfs로 connected component의 수를 세는 문제라

ramen4598.tistory.com

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

 


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

[Java] 다형성  (0) 2024.01.22
[Java] 상속  (0) 2024.01.21
[Java] 객체지향  (0) 2024.01.21
[Java] 배열  (0) 2024.01.21
[Java] 자료형과 연산자  (0) 2024.01.21