Coded by Juny

제어문 본문

Study/Java

제어문

Juny_Choi 2023. 11. 22. 18:16

이번 시간에는 코딩을 배우고 실습하며 많이 쓰이게될 제어문에 대해 알아보자. 제어문이란 우리가 컴퓨터에게 명령을 내릴 때 조건을 설정해주는 것과 비슷하다. 예를 들어 어떠한 값과 값을 비교하고 그 값이 같은 경우엔 A, 다른 경우엔 B를 출력하고자 할 때 이러한 조건을 설중해준다거나, A라는 변수에 특정 숫자를 여러 번 더하고 싶을 때 사용하는 것이 제어문이다.
 
이러한 제어문에는 크게 조건문과 반복문이 있다. 차근 차근 배워보자.
 

 

 

조건문

if문

조건문은 위의 예시에서 값을 비교하고 그에 따른 결과를 다르게 하고 싶을 때 조건을 설정해줄 때 사용한다. Java에서는 이러한 조건문을 if문을 활용한다. 코드에서 사용하자면 다음과 같다.

if(조건식) { // (1)
	// 조건식이 참일 때 (1)의 { } 안의 코드를 실행
}
else if (조건식 2){ // (2)
	// 조건식 1이 참이 아니면서 조건식 2가 참일 때 (2)의 { } 안의 코드를 실행
}
else { // (3)
	// 위의 모든 조건식에 맞지 않을 때 (3)의 { } 안의 코드를 실행
}

 
기본적인 if문의 구조는 다음과 같다. 필요에 의해 else if문은 더 사용될 수 있다. 구조는 이 쯤 파악하고 예시하기 쉬운 예를 들어보겠다. a 와 b에 특정 수를 넣어주고 해당 수가 같은지, a가 큰지, b가 큰지 판별할 수 있는 코드를 작성해보자.
 

public class Main {
    public static void main(String[] args) {
        int a = 3;
        int b = 3;
        if (a > b) { // 만약 a가 b보다 크다면,
            System.out.println("a가 b보다 크다."); // 해당 문구를 출력
        }
        
        // 그러나 해당 조건식은 참이 아니므로 밑의 else if문의 조건식을 확인
        
        else if (b > a) { // 만약 b가 a보다 크다면,
            System.out.println("b가 a보다 크다."); // 해당 문구를 출력
        }
        
        // 이번 조건식 또한 참이 아니므로 결국 모든 조건식이 거짓이므로 else의 코드를 실행
        
        else {
            System.out.println("두 수는 같다."); // 위의 모든 조건식이 거짓이므로 해당 문구를 출력
        }
    }
}

// 결과 : 두 수는 같다.

위 코드를 참고해보자, 해당 조건식은 두 수 중 a가 큰지 b가 큰지 두 수가 같은지만 설정하였으므로 else if문을 한번만 적었지만 주사위의 눈이 나올 경우의 수 등이라면 else if문은 여러 개 사용할 수 도 있다.
 
 

switch문

조건식에는 앞서 배운 If문이 아닌 Switch문이라는 것도 있는데 if문과 비슷하지만 if문의 조건식은 참과 거짓으로 코드의 실행 유무가 결정된다면 Switch문은 변수가 어떤 값을 갖는지 직접 지정하고 해당 값이 맞는지 아닌지에 따라 코드의 실행 유무가 결정된다.
 
주사위 번호를 이용해 입력데이터가 어떤 값인지 확인하는 예시코드를 살펴보자.

import java.util.Scanner;

public class Main {
    static Scanner scanner = new Scanner(System.in);
    public static void main(String[] args) {
        String input = scanner.nextLine(); //주사위 번호 입력

        switch (input) {
            case "1":
                System.out.println("1번");
                break; // break를 사용하게 되면 위 문구를 출력하게 되고 switch문을 종료하게 됨
            case "2":
                System.out.println("2번");
                break;
            case "3":
                System.out.println("3번");
                break;
            case "4":
                System.out.println("4번");
                break;
            case "5":
                System.out.println("5번");
                break;
            case "6":
                System.out.println("6번");
                break;
            default: //switch문의 괄호 안 값과 같은 값이 없으면, 여기서 실행문 실행 (else문과 유사)
                System.out.println("없는 숫자! " + input);
                break;
        }
    }
}

 
주석을 보면 쉽게 이해가 될 것이다. switch( )의 괄호 안에 확인할 변수인 input을 넣고 그 아래 case 마다 그 변수의 값인지 확인할 값을 넣는다. input 데이터는 String 타입이므로 큰 따옴표를 이용해 String 타입의 값을 넣어준다.
 
그 후 그 값이 맞다면 실행할 코드인 print문을 적고 그 아래에 break문을 통해 switch문을 빠져나가주면 된다.
 
 
 

반복문

for문

for문은 조건식이 참인 동안 주어진 횟수만큼 실행문을 반복적으로 수행한다. 이러한 for문의 구조를 살펴보자.

public class Main{
	public static void main(String[] args) {
    	int sum = 0;
        
        for(int i = 0; i < 10; i ++){
        	sum += i;
        }
        System.out.println(sum);
    }
}

 
처음 보면 헷갈릴 수 도 있지만 차근차근 풀어보겠다.
우선 for문이 실행되고 결과값이 담길 변수인 sum 변수를 생성해주었다. 그 후 for문의 괄호 안을 살펴보자. for문에는 반복할 때 반복한 횟수를 기억하기 위해 변수를 하나 사용하게 되는데 보통 사용하는 변수는 i이다. i가 시작될 값인 0을 넣어주면 해당 for문은 i가 0부터 시작한다는 의미이다.
 
그 후 ;로 초기화 조건을 닫아주고 가운데에 i를 몇까지 증가시킬 것인지의 조건식을 정해준다. i < 10이란 말은 i가 10이 되기 전까지 해당 for문을 반복해서 실행한다는 의미이다. 즉, i는 해당 for문에서 0, 1, 2, 3, 4, 5, 6, 7, 8, 9까지인 총 10번 해당 for문을 실행하게 된다.
 
해당 조건식을 ;로 닫아준 후 한번 for문을 실행할 때 i를 얼마나 증감시킬지를 정해준다. 예시 코드를 살펴보면 ++로 되어있는데 해당 기호는 for문을 한번 실행할 때마다 1씩 증가시킨다는 의미이다. 이는 곧 1씩 감소시키려면 i --를 하면 된다. 하지만 해당 코드에서는 --를 사용하면 i가 10이 될 때 벗어나는 조건에 해당하지 않아 무한히 돌아가 결국 런타임 에러에 걸리게 된다. 또한 해당 증감식에서는 우리가 전 시간에 배웠던 전위 연산자와 후위 연산자를 적용할 수 있다. i++와 ++i의 결과 값이 다르니 직접 코드를 돌려보고 왜 다른지 이해해보자
 
아래 연산자 게시물에서 전위 연산자 후위 연산자를 참고하여 각 차이점에 대해 알아보자.

연산자

우리가 일상생활에서 숫자를 가지고 연산을 하듯 컴퓨터도 데이터를 이용해 연산이 가능하다 프로그래밍 언어에서 쓰이는 연산자는 가장 큰 분류로 나누자면 산술, 비교, 논리 연산자 등이 있

dydwns9436.tistory.com

 
 
 
그리고 for문에서 컬렉션 객체를 보다 쉽게 처리하기 위한 향상된 for문을 제공하는데 해당 for문은 일반 for문과 달리 각 종 조건식을 사용하지 않고 컬렉션 객체 항목의 수 만큼 반복하고 for문을 빠져나가게 된다. 아래 예시 코드를 살펴보자.

public class Main {
    public static void main(String[] args) {
        String[] test = {"a", "b", "c", "d"};
        int count = 0;
        for(String s : test){
            count++;
            if (s == "c"){
                System.out.print(count);
            }
        }
    }
}

 
문자 배열에 각각 a, b, c, d라는 요소를 넣어주고 향상된 for문을 이용해 test 문자배열에서 순서대로 담아올 요소를 담을 문자 타입인 s라는 변수를 설정해 주었다. 다시 말해, 해당 for문에서는 test라는 문자 배열에서 배열의 0번 째 index인 a부터 마지막 index인 d까지의 값을 각각 s에 담아준다는 의미이다. 첫 번째 돌릴 때 s에는 a가 들어가겠지만 두번 째 실행 때는 s에 b가 들어가게 된다.
 
for문을 몇 번 돌렸는지 확인하기 위해 count 변수를 초기화해주었고 해당 for문은 c라는 값을 찾기 위해 3번 돌리기 때문에 if문에 의해 콘솔의 출력값은 3이 나오게 된다.
 
 

while문

for문은 사용자가 정한 횟수만큼 반복한다면 while문은 조건을 지정해주고 해당 조건이 true일 경우 계속하여 반복하는 반복문이다. while문의 구조를 살펴보자.

public class Main {
    public static void main(String[] args) {
        int num = 0;

        while(num < 3){
            num++;
        }

        System.out.print(num);
    }
}

 
해당 while문을 살펴보면 처음에 사용할 변수 num을 초기화 해주고 while문에 조건을 num < 3이라고 설정해주었다. 해당 뜻은 while문의 코드는 ( )안의 조건이 참일 때 계속 반복한다는 의미이다. 그러나 while문 안의 조건식이 계속해서 반복되게되면 while문은 종료되지 않으므로 에러가 나게 된다. 
 
해당 while문에서 num은 한번 반복할 때마다 1씩 증가시키게 되고 결국 num이 3번 째에 3이 되고 다시 반복문이 실행될 때 ( )안의 조건식에 의해 3 < 3은 false가 되므로 while문은 종료되고 print문에 의해 마지막 num의 값이었던 3이 출력된다. 
 
반복문에서 마지막으로 간단히 살펴볼 do-while문에 대해 알아보자
 
 

do-while문

해당 반복문은 반복하기 전에 처음 한 번 무조건 실행할 블록을 정한 후 반복을 진행하게 된다. 기본 형식을 살펴보자.
 

do {
  (1)실행문 //처음 한 번은 무조건 실행
} while((2)조건식);

do-while문이 처음 실행될 때 (1) 실행문을 먼저 실행하고 (1) 실행문이 모두 실행되면 (2) 조건식을 평가한다. 그후 결과가 true이면 (1) 실행문 → (2) 조건식으로 반복 실행을 하고, false이면 do-while문을 종료한다. 예시코드와 출력문을 살펴보자.
 

import java.util.Scanner;

public class Main {
    public static void main(String args[]){
        int input = 0, randomNum = 0;

        randomNum = (int)(Math.random() * 10) + 1; // 1 ~ 10 임의의 수를 생성
        Scanner scanner = new Scanner(System.in);

        do{
            System.out.println("1과 10 사이의 정수를 입력하세요");
            input = scanner.nextInt();

            if(input > randomNum) {
                System.out.println("더 작은 정수를 입력하세요");
            } else if (input < randomNum) {
                System.out.println("더 큰 정수를 입력하세요");
            }
        } while(input != randomNum);
        System.out.println(randomNum +" 정답입니다!");
    }
}

해당 코드는 Math 클래스의 random( ) 메서드를 통해 랜덤의 숫자를 배정받고 randomNum의 변수에 해당 랜덤 숫자를 저장해준다. 그 후 do - while문을 통해 사용자의 입력데이터가 정답이 될 때까지 데이터 입력을 반복한다.
 
가장 처음 do문에서 사용자가 처음 입력할 값을 받기 위해 1과 10 사의 정수를 입력받을 문구를 출력하고 사용자의 데이터를 받는다. 그 후 조건문을 통해 해당 값과 랜덤 정수를 비교한 후 입력한 값이 랜덤 값보다 작다면 더 작은 정수를 입력하라는 문구를 출력하고 입력한 값이 크다면 더 큰 정수를 입력하라는 문구를 출력한다.
 
그 후 while문의 종료 조건이 거짓이므로 랜덤 정수와 입력 정수가 맞지 않을 경우를 조건으로 하여 정답이라는 문구를 출력하고 while문을 종료한다.
 
쉽게 말해 do while문은 while 조건식이 참일 동안 do{ } 블록을 계속해서 반복하는 형태의 반복문이다.
 
랜덤 숫자가 7이었을 때, 해당 숫자를 찾기위한 콘솔 창은 다음과 같다.

 

'Study > Java' 카테고리의 다른 글

클래스와 객체  (0) 2023.11.29
콘솔 입출력  (0) 2023.11.17
연산자  (0) 2023.11.16
문자열 타입  (1) 2023.11.12
Java의 변수와 타입  (0) 2023.11.10