[JAVA] 조건문과 반복문

용용학생·2024년 4월 7일

자바

목록 보기
7/32

조건문

  • 조건에 따라 프로그램의 흐름을 바꾸는 제어문
  • 조건문은 조건식문장을 포함하는 블럭{ }으로 구성
  • if 문과 switch 문이 존재

if 문

	if(조건식) {
    	// 조건식이 참(true)일 때 수행될 문장들
    }
  • 조건식의 결과는 반드시 true 또는 false 이어야 한다.
    • if(1) { ... } // 자바에서 1은 true가 아님. if(true)가 맞는 표현
  • 조건식은 일반적으로 비교연산자와 논리연산자로 구성
    • if(90 <= x && x <= 100)
    • if(ch == 'y' || ch == 'Y')
  • 등가비교 연산자 == 대신 대입 연산자 =를 사용하지 않도록 주의하자!!
    • if(x = 0) { ... } // x = 0 이 아닌 x == 0 이 되어야 함
	int x = 5;
    if(x > 3) {
    	System.out.println("x는 3보다 큽니다.");
    }
    
    if(x > 4) System.out.println("x는 4보다도 큽니다.");
    
실행 결과 :
x는 3보다 큽니다.
x는 4보다도 큽니다.

위의 식처럼 조건식이 만족하면 블럭 안의 문장이 실행된다.
만약 블럭 안의 문장이 하나라면 블럭을 생략할 수 있다.

if - else 문

if 의 조건식이 거짓일 때 수행될 문장도 추가하고 싶을 때 사용한다

	if(조건식) {
    	// 조건식이 참(true)일 때 수행될 문장들
    } else {
    	// 조건식이 거짓일 때 수행될 문장들
    }

한 쪽이 참이면 한 쪽은 거짓인 상반된 관계에 대해서 제어를 하고 싶을 때 사용한다.

	if(input == 0) {
    	System.out.println("0입니다.");
    }
    if(input != 0) {
    	System.out.println("0이 아닙니다.");
    }
    
    
    if(input == 0) {
    	System.out.println("0입니다.");
    } else {
        System.out.println("0이 아닙니다.");
    }

두 개의 코드는 같은 결과를 만들지만 if-else 문이 더 효율적이고 간단하다.

if - else if 문

if - else 문은 두 가지 경우 중 하나가 수행되는 구조이다.
셋 이상의 경우의 수를 다룰 때는 if - else if 문을 사용한다.

	if(조건식1) {
    	// 조건식1의 연산결과가 참일 때 수행될 문장들
	} else if(조건식2) {
    	// 조건식2의 연산결과가 참일 때 수행될 문장들
    } else if(조건식3) {
    	// 조건식3의 연산결과가 참일 때 수행될 문장들
    } else {
    	// 위의 어느 조건식도 만족하지 않을 때 수행될 문장들
    }
  • 여러 개의 else if 문을 사용할 수 있다.
  • 첫 번째 조건식부터 차례대로 수행하며,
    결과가 참인 조건식을 만나면 해당 블럭{ } 만 수행 후 if - else if문 전체를 벗어난다.
  • 참이 조건식이 없다면 else 문의 문장들 수행하며, else 문은 생략할 수 있다.
    생략 시 어떤 블럭도 수행되지 않을 수 있다.
	if(score >= 90) {
    	grade = 'A';
    } else if(score >= 80) {
        grade = 'B';
    } else if(score >= 70) {
        grade = 'C';
    } else {
    	grade = 'D';
    }
    
    // 이 조건문을 별개의 if 문으로 떼어낸다면
    
    if(score >= 90) {
    	grade = 'A';
    }
    if(80 <= score && score < 90) {
    	grade = 'B';
    }
    if(70 <= score && score < 80) {
    	grade = 'C';
    }
    if (score < 70) {
    	grade = 'D';
    }

if - else if 문을 여러 개의 if문으로 바꿀 때, 조건식이 변하지 않는다면 전혀 다른 코드가 된다!!

switch 문

if 문에서 경우의 수가 많아질수록 코드도 복잡해지고 처리 시간도 많이 걸린다.

switch 문을 사용하면 하나의 조건식으로 많은 경우의 수를 처리할 수 있고,
표현도 간결하여 알아보기 쉽다.

	switch(조건식) {
    	case1 :
        	// 조건식의 결과가 값1과 같을 경우 수행될 문장들
            break;
        case2 :
        	// 조건식의 결과가 값2과 같을 경우 수행될 문장들
            break;
        default :
        	// 조건식의 결과와 일치하는 case문이 없을 때 수행될 문장들
    }

수행되는 코드의 순서

  1. 조건식을 계산
  2. 조건식의 결과와 일치하는 case문으로 이동
  3. 이후의 문장들을 수행
  4. break문이나 switch문의 끝을 만나면 switch 문 전체를 빠져나감

defaultif문의 else 블럭과 같은 역할을 한다고 보면 이해가 쉽다.

	int month = 3;
    
    switch(month) {
    	case 3 :
        case 4 :
        case 5 :
        	System.out.println("현재 계절은 봄입니다.");
            break;
        case 6 :
        case 7 :
        case 8 :
        	System.out.println("현재 계절은 여름입니다.");
            break;
        case 9 :
        case 10 :
        case 11 :
        	System.out.println("현재 계절은 가을입니다.");
            break;
        case 12 :
        case 1 :
        case 2 :
        	System.out.println("현재 계절은 겨울입니다.");
            break;
    }

위의 코드와 같이 조건식에 맞는 case문을 찾아서 해당 문장들을 수행한다.
만약 case 문의 break; 가 없었다면 모든 문장이 다 실행될 것이다.

switch 문의 제약조건
1. switch문의 조건식 결과는 정수 또는 문자열 이어야 한다.
2. case문의 값은 정수 상수 혹은 문자열 상수 만 가능하며, 중복되지 않아야 한다.

반복문

  • 문장을 반복 수행해야할 때 사용하는 제어문
  • 주어진 조건을 만족하는 동안 주어진 문장들을 반복적으로 수행

for 문

for 문은 반복 횟수를 알고 있을 때 적합한 구문이다.

구조와 수행순서

	for(초기화; 조건식; 증감식) {
    	// 조건식이 참일 때 수행될 문장들
    }
  1. 제일 먼저 초기화 수행
  2. 그 이후부터는 조건식이 참인 동안 조건식 -> 수행될 문장 -> 증감식 순서로 반복
  3. 그러다가 조건식이 거짓이 되면, for문 전체를 빠져나감

초기화

  • 반복문에 사용될 변수를 초기화하는 부분
  • 만약 둘 이상의 변수를 초기화하기 위해서는 콤마 ,로 구분하며, 타입은 같아야 함
    for(int i=1; i<10; i++) { ... }
    for(int i=1, j=0; i<10; i++) { ... }

조건식

  • 조건식의 값이 참이라면 반복을 계속하고, 거짓이라면 for 문을 벗어남
  • 조건식을 잘못 작성한다면 블럭{ } 내의 문장이 수행되지 않을 수 있음
    for(int i=1; i<10; i++) { ... }

증감식

  • 반복문을 제어하는 변수의 값을 증감시키는 식
  • 매 반복마다 변수의 값을 변화시키다가 결국 조건식이 거짓이 되어 for문을 종료시키게 함
  • 증감연산자를 주로 쓰지만 다양한 연산자들로도 증감식을 작성할 수 있음
    for(int i=1; i<10; i++) { ... }
    for(int i=10; i>1; i--) { ... }
    for(int i=1; i<10; i+=2) { ... }
    for(int i=1; i<10; i*=3) { ... }

이 세 가지 요소는 필요하지 않으면 생략할 수 있으며, 심지어 모두 생략 가능하다.

for( ; ; ) { ... }

조건식이 생략된 경우, 참으로 간주되어 무한 반복문이 된다.

public class Main {
	public static void main(String[] args) {
    	int sum = 0;
        for(int i=1; i <= 10; i++) {
        	sum += i;
            System.out.printf("1부터 %2d 까지의 합 : %2d%n", i, sum);
        }
    }
}

중첩된 for 문

  • 반복문 내에 다른 반복문이 있는 구조
for(int i=1; i<10; i++) {
	for(int j=1; j<10; j++) {
    	System.out.print(i + "*" + j + "=" + i*j);
        System.out.print("\t");
    }
    System.out.println();
}

i의 값이 1일 때 내부 반복문에서 j의 값이 1부터 10까지 반복된다.
그 후 외부 반복문의 증감식이 실행되어 i가 2가 되고
내부 반복문이 다시 수행되는 방식으로 진행된다.

while 문

while문은 for문에 비해 구조가 간단하다.
조건식과 블럭{ }만으로 이루어져 있고, 조건식이 참인 동안 블럭이 반복된다.

while(조건식) {
	// 조건식의 연산결과가 참인 동안 반복될 문장들
}
  1. 조건식이 참이면 블럭{ } 안으로 들어가고, 거짓이면 while문을 벗어남
  2. 블럭{ }의 문장을 수행하고 다시 조건식으로 돌아감

for문과의 비교

for(int i=1; i<=10; i++) {
	System.out.println(i);
}

// 이 for 문을 while 문으로 변경 시

int i=1;
while(i<=10) {
	System.out.println(i);
    i++;
}
  • 초기화나 증감식이 필요하지 않다면, for문보다 while 문이 더 적합할 수 있음
  • while 문의 조건식은 생략 불가
    • 항상 참이 되게 만드려면 while(true) { ... } 의 형태로 넣어야 함

do - while 문

  • while문의 변형으로 조건식과 블럭{ }의 순서를 바꾸어놓은 것
  • 블럭을 먼저 수행한 후 조건식을 평가
  • 그렇기에 while문은 블럭을 한 번도 수행하지 않을 수 있지만,
    do - while 문은 블럭을 최소 1회 수행되는 것이 보장
do {
	// 조건식의 연산결과가 참일 때 수행될 문장들
} while(조건식);

break 문

  • switch 문에서 사용한 break 를 반복문에서도 사용할 수 있다.
  • break 문은 자신이 ㅍ함된 가장 가까운 반복문을 벗어난다.
  • 주로 if 문과 함께 사용되어 특정 조건을 만족하면 반복문을 종료시킨다.
public class Main {
	public static void main(String[] args) {
    	int sum = 0;
        int i = 0;
        
        while(true) {
        	if(sum > 100) {
            	break;
            }
            ++i;
            sum += i;
        }
        
        System.out.println("i = " + i + "\nsum = " + sum);
    }
}

이 코드 같은 무한 반복문에서는 반복문을 탈출한 조건을 만들어놓아야 한다.
이 때, if 같은 조건문과 함께 break 가 항상 같이 사용된다.

continue 문

  • 반복문 내에서만 사용할 수 있다.
  • 진행 도중 continue 를 만나면 바로 다음 반복으로 넘어간다.
    • for문을 만나면 증감식으로 이동한다.
    • while문을 만나면 조건식으로 이동한다.
  • break와 달리 반복문 전체를 벗어나는 게 아닌 다음 반복을 계속 수행한다.
for(int i=0; i<=10; i++) {
	if(i%3 == 0) {
    	continue;
    }
    System.out.print(i + "\t");
}

실행 결과 :
1	2	4	5	7	8	10

3의 배수를 만나면 if 의 조건식이 참이 되어 continue를 실행시킨다.
그 결과 출력문은 수행되지 않고 바로 다음 증감식으로 이동하여 i의 값을 증가시킨다.

실습 1

백준 2438 : 별 찍기 - 1

실습 2

백준 2439 : 별 찍기 - 2

실습 1의 답

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();

        for(int i=1; i<=N; i++) {
            System.out.println("*".repeat(i));
        }
    }
}

실습 2의 답

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();

        for(int i=N-1; i>=0; i--) {
            System.out.print(" ".repeat(i));
            System.out.println("*".repeat(N-i));
        }
    }
}
profile
자바 스프링 공부하는 정리 블로그!

0개의 댓글