자바(JAVA)

자바 - 제어문, 조건문, 반복문, 분기문

BlueNoa 2023. 9. 5. 02:12
728x90
반응형

<목차>

 

 


• 제어문(Control Statement)이란?

제어문은 프로그램의 흐름을 제어하고 조건에 따라 코드를 실행하거나 반복하는 데 사용한다.

제어문은 어떤 프로그래밍 언어에서든 가장 중요하다고 보면 된다. 뼈대가 되는 구조 중 하나이며, 다양한 유형들이 존재하기 때문이다.

 

이전 게시물에서 예시에서도 간간히 사용된 적이 있다.

 

종류

- 조건문(Conditional Statements)

- 반복문(Loop Statements)

- 분기문(Branching Statement)

 


• 조건문(Control Statement)

조건문은 프로그램의 실행 흐름을 제어하는 데 주로 사용된다. 조건을 비교해서 평가 후 그 결과에 따라 특정 코드 블록을 실행하거나 스킵하도록 한다. 주요 조건문들은 'if', 'else if', 'else', 'switch'이다.

 

1. if 문

'if' 문은 가장 기본적인 조건문으로 주어진 조건이 참(True)이면 해당 코드 블록을 실행한다.

 

2. if - else 문

조건이 참일 때와 거짓일 때 각가 다른 코드 블록을 실행한다.

 

3. if - else if - else 문

여러 조건을 순차적으로 평가 후 조건에 충족되는 코드 블록을 실행한다.

 

※ if 문에 들어갈 조건에는 '비교 연산자', 'and', 'or', 'not' 등이 있다.

 

[비교 연산자]

x < y x가 y보다 작다
x > y x가 y보다 크다
x == y x와 y가 같다
x != y x와 y는 같지 않다
x >= y x는 y보다 크거나 같다
x <= y x는 y보다 작거나 같다

[논리 연산(위에서부터 and, or, not)]

x && y x와 y 모두 참이어야 참이다
x || y x 또는 y 둘 중 적어도 하나가 참이면 참
!x x가 거짓이면 참

이외에도 contains를 이용해서 리스트 자료형에 특정 자료가 있는지 조사하여 참/거짓을 반환할 수 있다.

// if 문
if (조건) {
	// 조건이 참일 경우 실행
}

// if-else 문
if (조건) {
	// 조건이 참일 때 실행되는 코드
} else {
	// 조건이 거짓일 때 실행되는 코드
}

// if-else if-else 문
if (조건1) {
	// 조건1이 참일 때 실행 됨
else if (조건2) {
	// 조건2가 참일 때 실행 됨
else {
	// 모든 조건이 거짓일 때 실행되는 코드
}

 

4. switch 문

다양한 값에 따라 다른 코드 블록을 실행할 때 사용된다. 특정 변수나 표현식의 값을 평가하고 그 값에 따라 'case' 문 블록을 실행한다.

 

※ switch 문을 if 문으로 대체 가능하지만 if문을 switch 문으로 대체할 수는 없다.

switch (변수 또는 표현식) {
	case 값1 or 조건1:
    	// 해당 경우에 대한 코드
        break;
    case 값2:
    	// 해당 경우에 대한 코드
        break;
    .
    .
    .
    default:
    	// 모든 case에 맞지 않을 때 실행되는 코드
}
반응형

• 반복문(Loop Statement)

반복문은 특정 조건을 만족하는 동안 코드를 블록을 반복적으로 실행하는 데 사용한다.

반복문은 프로그래밍에서 매우 중요한 구성 요소 중 하나로, 동일한 코드를 여러 번 수행해야 하는 경우 유용하게 사용된다. 주요 반복문은 'for', 'while', 'do-while'이다.

 

1. for 반복문

for 문은 (초기값; 조건문; 증가치)의 세 부분으로 구성된다. 초기값은 처음 실행될 때 한 번만 실행되고, 조건문은 매 반복 시마다 비교한다. 조건문의 결과가 참(True)인 경우 반복문이 계속 실행된다. 증가치는 각 반복이 끝날 때마다 실행된다.

 

<예시>

public class sample {
    public static void main (String[] args) {
        for (int i = 0; i <= 12; i++) {
            System.out.println(i); // i가 12가 될때까지 출력된다.
        }
    }
}
// 증가치가 'i++' 후행이므로 마지막 12를 출력한 뒤 i는 13이 된다.

 

<예시 - for문과 if문을 사용한 예시>

public class sample {
    public static void main (String[] args) {
        for (int i = 1; i<= 20; i++) {
            if (i%2 == 0) {
                System.out.println(i+"는 짝수입니다.");
            }
            else {
                System.out.println(i+"는 홀수입니다.");
            }
        }
    }
}

 

<예시 - for-continue>

반복문을 실행하고 있는 도중 continue를 만나면 반복문의 처음(조건문)으로 돌아간다.

 

200보다 작은 값들을 출력하는 예시다.

조건문에서 numbers[i]의 값이 200보다 크면 contiue로 다시 조건문으로 비교하러 간다.

public class sample {
    public static void main (String[] args) {
        int[] numbers = {25, 13, 7, 30, 49, 70, 125, 512, 55};
        for (int i = 0; i < numbers.length; i++) {
            if (numbers[i] >= 200) {
                continue;
            }
            System.out.println(numbers[i]);
        }
    }
}

<결과>

25
13
7
30
49
70
125
55

 

<예시 - 이중 for문>

for문을 여러 개 사용하는 방법도 있다. 대표적인 예시가 구구단이다.

public class sample {
    public static void main (String[] args) {
        for (int i = 0; i <= 9; i++) {
            for (int j = 0; j <= 9; j++) {
                System.out.print(i+"*"+j +" = " + i*j+" ");
            }
            System.out.println("");
        }
    }
}

 

2. while 문

while 반복문은 조건이 '참'인 동안에만 계속 코드를 실행한다. 무한 실행(무한 루프)이 될 수 있기 때문에 초기 조건 검사를 꼭 해야 하며, 조건이 거짓이면 코드는 실행되지 않을 수 있다.

 

<예시 - "7번 죽으면 Game Over">

public class sample {
    public static void main (String[] args) {
        int life = 7;
        while (life >= 1) {
            System.out.println("캐릭터가 사망했습니다");
            life--;
            if (life == 0) {
                System.out.println("게임 패배");
            }
        }
    }
}

<결과>

캐릭터가 사망했습니다
캐릭터가 사망했습니다
캐릭터가 사망했습니다
캐릭터가 사망했습니다
캐릭터가 사망했습니다
캐릭터가 사망했습니다
캐릭터가 사망했습니다
게임 패배

 

<예시 - 무한 루프>

임의의 값을 받아 특정 값인 경우 프로그램이 멈추도록 작성했다.

만약 스캐너를 통해서 값을 받아오는 대기 시간 없이 계속해서 프로그램이 실행되면 걷잡을 수 없는 렉이 발생할 수 있다.

프로그래밍을 작성하는 프로그램에 따라 작동 중인 코드를 정지시키는 버튼이 있거나 단축키 컨트롤 c를 누르면 멈추는 기능이 있을 수 있다. 무한 루프에 빠지지 않게 주의해야 한다.

import java.util.Scanner;
public class sample {
    public static void main (String[] args) {
        Scanner sc = new Scanner(System.in);


        System.out.println("'" + "0"+ "'" + "을 누르면 종료됩니다.");
        
        while (true) { // 무한 루프
            System.out.println("아무 정수를 입력하세요.");
            int number = sc.nextInt();

            if (number == 0) {
                System.out.println("프로그램 종료");
                break; // 0이 입력되면 while문을 종료한다.
            }
        }
        sc.close();
    }
}

중간에 사용된 'break'는 while문을 강제로 중지시켜야 하는 경우 사용되는 키워드다. 

 

<예시 - while-continue : 짝수만 출력>

for문에서도 다뤘던 continue와 사용 방법이 정말 똑같다. 기존의 while문은 참이 아닌 경우 반복문을 종료하였지만 해당 키워드를 사용하면 다시 조건문으로 되돌아가서 반복문을 실행한다.

public class sample {
    public static void main (String[] args) {
        int i = 1;
        while (i <= 30) {
            if (i % 2 != 0) {
                i++;
                continue;
            }
            System.out.print(i + " ");
            i++;
        }
    }
}

 

3. do-while 문

'do-while'문은 'while'문과 비슷하지만, 조건문이 코드를 실행 후 확인하여 수행한다. 그렇기 때문에 코드 실행이 최소 한 번은 실행된다. 즉, 코드부터 실행한 후 조건문을 확인한다는 것이다.

 

<예시>

import java.util.Scanner;

public class sample {
    public static void main (String[] args) {
        Scanner sc = new Scanner(System.in);
        String str;

        do {
            System.out.println("임의의 숫자를 입력해주세요.");
            int number = sc.nextInt();
            System.out.println("입력하신 숫자는 " + number + "입니다.");
            System.out.println("계속 하시겠습니까? (y/n)");
            str = sc.next();
        } while (str.equalsIgnoreCase("y")); // y일 경우(참) 계속 진행
        System.out.println("종료");
        sc.close();
    }
}

 


• 분기문(Branching Statement)

분기문은 프로그램의 흐름을 변환해 줄 때 사용한다.

반복문에서 나왔던 'for-continue' 또는 'while-continue'에서 사용된 'continue' 또는 'break' 그리고 값을 반환할 때 사용하는 'return' 등이 분기문이다.

 

728x90

• 그 외(for each)

'for each' 반복문은 배열과 컬렉션 타입(리스트, 집합, 맵 등)의 요소를 순회하고 각 요소에 대한 작업을 수행하는 반복문이다. Java 5 버전부터 추가된 기능으로, 코드를 간결하게 작성할 수 있고, 요소에 쉽게 접근할 수 있는 반복문이다.

 

'for each' 루프를 사용하면 반복자(iterator)를 직접 관리하지 않고도 각 요소를 접근할 수 있다. 그렇기 때문에 코드를 보다 간결하게 작성하여 가독성을 높일 수 있다.

단, 그럼에도 불구하고 for each보다 반복자를 사용해야 하는 경우가 있다.

주의해야 되는 내용으로는 컬렉션의 내용을 수정할 경우 'for each' 문에서는 오류가 발생할 수 있지만, 반복자를 사용하면 안전하게 각 요소를 순회할 수 있다. 각 요소에 대한 수정, 삭제를 하지 않고 읽기 전용으로 사용하는 경우 'for each' 문이 더 가독성과 코드의 간결성을 두고 보면 좋다고 할 수 있다.

 

 

이전에 다룬 배열, 리스트, 집합, 맵 등 게시물에서 예시로 다룬 적이 있다.

[참고 - https://bluenoa.tistory.com/81#text5]

 

자바 - 리스트(List)

리스트란? ArrayList와 LinkedList 제네릭스(Generics) 제네릭스의 특징 리스트와 배열의 차이점 추가내용 • 리스트란? 리스트는 배열과 비슷하지만 좀 더 편의 기능이 많다고 볼 수 있다. 그 차이점은

bluenoa.tistory.com

[참고 - https://bluenoa.tistory.com/82#text3]

 

자바 - Map, 집합, 상수 집합

맵(Map)이란? Map 인터페이스의 주요 메서드 Map 자료형의 구현 가능한 종류 집합(Set)이란? 집합의 주요 메서드 집합의 종류 상수 집합(Constant Set) • 맵(Map)이란? 맵은 키-값(Key-Value)을 쌍으로 구성되

bluenoa.tistory.com

 

<예시 - for-each 문>

public class sample {
    public static void main (String[] args) {
        // 배열 순회
        int[] numbers = {1,2,4,6,8,10};
        for (int number : numbers) {
            System.out.println(number);
        }
        
        // 리스트 순회
        String[] str = {"겐지", "트레이서", "위도우", "한조", "솜브라"};
        List<String> names = new ArrayList<>(Arrays.asList(str));
        for (String name : names) {
            System.out.println(name);
        }
    }
}

<결과>

1
2
4
6
8
10
한조
겐지
트레이서
위도우
솜브라

 

 

 

728x90
반응형