본문 바로가기

JAVA

조건문과 반복문

1. 조건문

 

1-1. if / else 문

      if 문은 ()에 들어가는 조건식이 참인 경우 {} 블록의 코드를 실행하는 조건문이다.

int num = 7;

if(num > 1) { // 조건식 참
	System.out.println("num이 1보다 큰 경우 실행되는 코드");
}

      만약 if 문의 조건식이 참이 아닌 경우가 발생한다면? if 문 블록의 코드는 실행되지 않고 끝나버린다.

     이런 경우에는 다른 조건을 추가해서 데이터를 걸러야 하는데, 이를 다중 조건 else if 문을 통해 구현할 수 있다.

int num = 7;

if(num < 5) { // 조건식 거짓
	System.out.println("num이 5보다 작은 경우 실행되는 코드"); // {} 블록은 실행되지 않는다.
} else if (num > 5) { // 조건식 참
	System.out.println("num이 5보다 큰 경우 실행되는 코드"); // {} 블록이 실행된다.
} else {
	System.out.println("num이 if 문과 else if 문의 조건식에 포함되지 않을 때 실행되는 코드");
}

      대상이 되는 데이터는 참이 되는 조건식을 만나게 될 때까지 순차적으로 조건식을 돌게 된다.

      if 문과 else if 문의 조건식에도 포함되지 않는 경우가 생긴다면,

      else 문을 사용해서 그 이외의 조건에 해당하는 모든 경우를 받아 낼 수 있다.

      🖍 조건이 더 늘어난다면 else if 문을 더 늘릴 수 있다. 

 

      ✍️ 중첩 if 문

            if 문 내에 if 문을 한 번 더 작성하는 조건문으로, 두 가지 이상의 조건식을 충족하는 데이터를 추출할 수 있다.

int num = 7;

if(num > 5) {
	if(num < 10) {
    	System.out.println("num은 5와 10 사이의 숫자이다.");
    } else {
    	System.out.println("num은 10 보다 큰 숫자이다.");
    }
} else {
	System.out.println("num은 5보다 작은 숫자이다.");
}

 

1-2. switch / case 문

       if 문은 조건이 늘어날 수록 코드의 가독성이 떨어지고,

      참인 조건식을 만날 때까지 탐색해야 하므로 속도 측면에서도 늦어진다는 단점이 있다. 

      이러한 단점을 개선한 조건문이 바로 swich / case 문이다.

int score = 9;

switch(score) {
	case 10 :
    	System.out.println("수");
        break;
	case 9 :
    	System.out.println("수");
        break;
	case 8 :
    	System.out.println("우");
        break;
	case 7 :
    	System.out.println("미");
        break;
	case 6 :
    	System.out.println("양");
        break;
	case 5 :
    	System.out.println("가");
        break;
}

       switch 문의 경우 변수에 따라 해당되는 case가 실행되기 때문에 간결하다.

       다만 하나의 조건이 만족하면 더이상 실행되지 않는 if 문과 다르게,

       switch 문은 각 case에 break 키워드를 작성하지 않으면 실행된 case 문 이후의 모든 case 문이 실행되기 때문에 주의해야 한다.

 

       case 문을 작성할 때 원하는 출력값이 같은 경우에는, 예시 코드와 같이 case 를 중복 작성할 수 있다.

int score = 9;

switch(score) {
	case 10 : case 9 :
    	System.out.println("수");
        break;
		
        (생략)
}

       이외에도 if 문에서의 else 문에 해당하는 switch 문에서도 default 문을 통해 구현한다.

int score = 9;

switch(score) {
		
        (생략)
        
	default : // case 문의 모든 조건을 만족하지 않을 때 실행하는 코드
    	System.out.println("가");
        break;
}

       ✍️ switch 문의 제약 조건

              모든 switch 문은 if 문으로 변환이 가능하지만, 그 반대인 모든 if 문에서 switch 문으로는 몇 가지 제약으로 인하여 불가능하다.

              👉 switch 문의 조건식 결과는 정수 또는 문자열이어야 한다.

              👉 case 문의 값을 정수, 상수, 문자열만 가능하다.

              👉 case 문의 값은 서로 중복되어선 안 된다. 

int num, result;

final int NUM = 1;

switch(result) {
	case '1' :          // OK , 문자형 리터럴(유니코드)
	case NUM :          // OK , 정수형 상수
	case "YES" :        // OK , 문자열 리터럴
	case num :          // ERROR , 변수 사용 불가
	case 1.0 :          // ERROR , 실수 사용 불가
    case '1' :          // ERROR , 중복 불가 
}

 

 

       1-2-1. 개선된 switch 문 (Enhanced Switch Expressions)

                  가독성 측면의 이점을 극대화 하기 위하여 Java 14 부터는 보다 개선된 switch 문을 지원하고 있다.

// 기존의 switch 문

switch (day) {
	case MONDAY :
    case FRIDAY :
    case SUNDAY :
    	System.out.println(6);
        break;
    case TUESDAY :
    	System.out.println(7);
        break;
    case THURSDAY :
    case SATURDAY :
    	System.out.println(8);
        break;
    case WENDESDAY :
    	System.out.println(9);
        break;
}

                  앞서 설명했듯이 switch 문에서는 break 키워드의 역할이 굉장히 중요하다.

 

                  하지만 코드를 작성하다 보면 break 키워드를 실수로 작성하지 않을 때도 있을 것이고,

                  반복되는 작업이기 때문에 가독성 면에서도 좋지 않다.

// 개선된 switch 문 1
swtich (day) {
	case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY -> System.out.println(7);
    case THURSDAY, SATURDAY -> System.out.println(8);
    case WEDNESDAY -> System.out.println(9);
}

                  👉 다중 case 사용 시에 : 가 아닌 ,(쉼표)로 구분할 수 있다.

                  👉 화살표 -> 를 사용함으로써 break 문을 별도로 작성하지 않아도 됨 (결과문이 2줄 이상일 경우 {} 사용)  

// 개선된 switch 문 2
int letters = swtich (day) {
	case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY -> 7;
    case THURSDAY, SATURDAY -> 8;
    case WEDNESDAY -> 9;
};

 

                  👉 case 문의 결과 값을 바로 변수에 저장할 수 있다.

 

                  만약 변수에 저장하는 값뿐만 아니라 콘솔창에서도 값을 보고 싶다면 어떻게 해야 할까?

// 개선된 switch 문 2
int letters = swtich (day) {
	case MONDAY, FRIDAY, SUNDAY -> { // 에러 발생
    	System.out.println("6 글자 입니다.");
        6;
    };
    case TUESDAY -> 7;
    case THURSDAY, SATURDAY -> 8;
    case WEDNESDAY -> 9;
};

 

                  {} 중괄호를 사용하여 코드를 추가해 보아도 에러가 발생하게 된다.

                  이러한 경우 활용할 수 있는 것이 바로 'yield' 예약어이다. 

// 개선된 switch 문 3
int letters = swtich (day) {
	case MONDAY, FRIDAY, SUNDAY -> { 
    	System.out.println("6 글자 입니다.");
        yield 6;
    };
    case TUESDAY -> 7;
    case THURSDAY, SATURDAY -> 8;
    case WEDNESDAY -> 9;
};

                  yield 예약어는 {} 안에서만 사용할 수 있으며, var 처럼 사용이 가능하다.

 

 


2. 반복문

 

2-1. for 문

       for 문은 (초기화; 조건문; 증감식) 구조로, 초기화 된 값을 증감식에 따라 조건문을 충족할 때까지 반복하는 구문이다.

for (int i = 0; i < 10; i++) {

	1. int i = 0; => int 타입의 변수 i 는 0 에서 부터 시작하겠다.
    2. i < 10; => 변수 i 의 값이 10 보다 작을 때까지만 반복하겠다.
    3. i++ => 변수 i 가 반복문을 돌 때마다 1씩 증가하겠다.

}

       1, 2, 3에 작성한 내용이 없이 (;;) 형태로 for 문을 작성할 수도 있는데, 

       이는 조건을 입력하지 않았기 때문에 {}에서 반복문을 빠져나오는 구문을 작성하지 않으면 무한으로 반복하게 된다.

for (int i = 0; i < 10; i++) {
	for (int j = 0; j < 10; j++) {
    
    }	
}

       위와 같은 형태를 이중 for 문이라고 한다.

       바깥 for 문이 한 번 돌 때 안쪽 for 문은 조건식이 참이 될 때까지 반복한다.

       i 가 0 일 때, j는 0~9까지 반복

       i 가 1 일 때, j는 다시 0~9까지 반복하는 식으로 구현된다. 

 

      ✍️ for-each 문 (향상된 for 문)

           for-each 문은 기존의 for 문 코드를 보다 간편하게 사용할 수 있도록 제공되는 기능으로 가독성 측면에서 좋다.

           또한 for 문에서 많이 활용되는 배열, 리스트 등의 인덱스 관련 예외를 피할 수 있다는 점에서 장점을 가진다.

for (타입 변수명 : 배열명) {

}

           타입에는 for-each 문으로 반복할 대상이 되는 배열 등의 내부 요소 타입을 작성하면 된다. 

int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

for (int i : array) {
	System.out.print(i);    // 1 2 3 4 5 6 7 8 9 10
}

           이 코드는 array 변수에 데이터 길이만큼 반복되면서 i 변수에 저장된다. 

           그리고 i 에 저장된 값을 차례로 출력할 수 있게 된다.

           이처럼. for-each 문을 통해서는 배열, 리스트 등에 저장된 값을 차례로 출력하는 데에 굉장히 편리하다.

           하지만 기존의 저장된 값을 출력만 할 수 있고 수정은 불가하다는 단점이 있다. 

           또한 for 문과 달리 인덱스를 사용할 수 없기 때문에 이를 활용하는 코드도 작성하지 못한다.

 

           ✍️ 다차원 배열 원소 추출

String[][] arr = {{"1-1","1-2","1-3","1-4","1-5"},{"2-1","2-2","2-3","2-4","2-5"}};
 		
for(String[] arrs : arr) {
	for(String s : arrs) {
		System.out.println(s);
	}
}

                다차원의 배열은 이처럼 for-each 문을 중첩해서 추출할 수 있다. 

 

2-2. while 문

        while 문은 조건식이 참일 경우 반복하는 구문으로, 조건이 항상 참일 경우 무한 반복할 수 있다.

        for 문에서와 마찬가지로 무한 반복이 되는 경우에는 반드시 내부에 빠져 나올 수 있는 조건을 추가해 줘야 한다.

int num = 5;

while (num < 10) {
	// 조건식은 항상 참이기 때문에 무한 반복
    num += 1; // 무한 반복을 멈추기 위해 빠져 나올 수 있는 구문을 추가해야 한다.
}

            ✍️ do-while 문

                   while 문은 작성된 조건을 확인하고 true 일 경우에만 실행이 되는 반면,

                   do-while 문은 먼저 do 문에 작성된 구문이 실행이 되고 난 후에 조건을 확인한다는 차이점이 있다.

'JAVA' 카테고리의 다른 글

객체 지향 4대 특성 : 다형성, 캡슐화  (0) 2022.08.22
객체 지향 4대 특성 : 추상화, 상속  (0) 2022.08.21
클래스(Class) 와 객체(Object)  (0) 2022.08.20
연산자  (0) 2022.08.18
변수(Variable)  (0) 2022.08.16