본문 바로가기
카테고리 없음

제어문

by HongK 2021. 2. 10.

목표

자바가 제공하는 제어문 학습하기


선택문(switch)

선택문은 자바가 제공하는 조건문 중 하나다. 조건문은 조건식과 문장을 포함하는 블럭 {} 으로 구성되어 있으며, 조건식의 연산결과에 따라 실행할 문장을 달리하여, 프로그램의 실행흐름을 변경할 수 있다. 
조건문은 if문과 switch문이 있으며, 조건의 수가 많을 때는 switch문이 효율적이지만 switch문은 제약사항이 많아 사용율은 if문이 높다.

 

if문 

if문의 조건식은 반드시 true/false의 결과를 반환해야하므로, 일반적으로 비교연산자와 논리연산자로 구성된다. 

if (조건식) {
	조건이 true일 때 수행할 문장
}


만일, 블럭내의 문장이 하나뿐 일 때는 { } 의 생략도 가능하다.

if (date == 25) 
	System.out.println("월급날입니다.");


if문이 처리해야하는 조건의 경우의 수가 2개 이상일 때는 else if 와 else 를 사용한다. else는 앞의 조건을 만족하지 않아야 하기 때문에 자동으로 '앞의 조건식을 만족하지 않을 때' 라는 조건이 추가된 것과 같다.

if (rank < 10) {
	System.out.println("A 입니다.");
} else if (rank < 20) {   // if ( rank >= 10 && rank < 20)
	System.out.println("B 입니다.");
} else if (rank < 30) {
	System.out.println("C 입니다.");
} else if (rank < 40) {
	System.out.println("D 입니다.");
} else {
	System.out.println("F 입니다.");
}

 

switch문

if문은 조건식의 결과가 참과 거짓, 두 가지 밖에 없기 때문에 경우의 수가 많아질수록 else-if의 수가 많아지고 복잡해진다. switch문은 if문과 달리 하나의 조건식으로 많은 경우의 수를 처리할 수 있고, 표현식도 간결하다.

switch (조건식) {
	case 값1: 
    	// 조건식의 결과가 값1과 같을 경우 수행되는 문장
        break;
	case 값2: 
    	// 조건식의 결과가 값2과 같을 경우 수행되는 문장
        break;
	default: 
    	// 조건식의 결과와 일치하는 case가 없을 때 수행되는 문장
        break; // 마지막 break;는 생략가능 
}


switch문은 break;문을 만날 때만 switch 문을 빠져나간다. 따라서 마지막 break;는 생략이 가능하다. 또 이 점을 이용하여 여러 case가 동일한 동작을 수행해야하는 경우에는 고의적으로 break;를 생략하기도 한다.

switch (grade) {
    case 'A':
    case 'B':
    	System.out.println("합격입니다.");
        break;
    case 'C':
    	System.out.println("불합격입니다.");
        break;
    default: 
    	System.out.println("낙제입니다.");
}

case문의 값은 정수 또는 문자열이어야 한다. 실수나 변수는 case문의 값이 될 수 없다. 문자 상수도 유니코드로 정수값을 가지므로 가능하다. switch문도 if문 처럼 중첩으로 사용이 가능하다.

 

 

반복문

for문

반복의 횟수를 알고 있을 때 적합하다. 초기화, 조건식, 증감식, 블럭 {} 으로 이루어져 있다.

 (초기화: 1부터)(조건식: 5까지)(증감식: 1씩 증가) 
for(int i = 1; i <= 5; i++) {
    System.out.println("실행블럭");
}


초기화

for(int i = 1, j = 0; ...; ...) {}

반복문에 사용될 변수를 초기화하는 부분이며, 처음에 한번만 수행된다. 둘 이상의 변수가 필요할 때는 콤마 ','를 구분자로 변수를 초기화하면 된다. (이 때, 타입은 같아야한다)

 

조건식

for(...; i < 100; ...) {}

조건식의 값이 참(true)이면 반복을 계속하고, 거짓(false)이면 반복을 중단하고 for문을 벗어난다. 

 

증감식

for(...; ...; i++, j*=3, k-=2) {}

반복문을 제어하는 변수의 값을 증가 또는 감소시키는 식이다. 매 반복마다 변수의 값이 증감식에 의해서 점진적으로 변하다가 결국 조건식이 거짓이 되어 for문을 벗어나게 된다. 증감식도 콤마 ','를 구분자로 두 문장 이상을 지정할 수 있다.

 

위의 3가지 식은 모두 생략이 가능하며, 조건식이 생략되면 무한 반복문으로 실행된다.

 


향상된 for문(enhanced for statement)

for(타입 변수명 : 배열 또는 컬렉션) {
}

List<String> names = List.of("길동", "둘리", "또치");
for (String name : names) {
    System.out.println("호이! " + name);
}

배열과 컬렉션에 저장된 요소에 접근할 때, 기존보다 편리한 방법으로 처리할 수 있는 문법이다. 이미 저장된 요소들을 읽어오는 용도로만 사용이 가능하다.

 

while 문

조건식과 블럭 {} 만으로 이루어져 있다. 조건식이 참(true)인 동안 블럭 내의 문장을 반복한다.

while (조건식) {
    System.out.println("실행블럭");
}

while문은 먼저 조건식을 평가해서 조건식이 거짓이면 문장 전체를 벗어나고, 참이면 블럭 내의 문장을 수행한 뒤, 다시 조건식으로 돌아간다. 조건식이 거짓이 될 때까지 이 과정이 반복된다. for문과 다르게 while문의 조건식은 생략이 불가능하며, for문에서 조건문을 생략한 것과 같이 무한 반복문을 만들고자 하면 조건식을 true 또는 1 을 넣는다. 

 

do-while 문

while문의 변형으로 기본적인 구조는 while문과 같으나, 블럭을 먼저 수행한 뒤 조건식을 평가하도록 순서를 바꿔놓은 것이다.

do {
    System.out.println("수행블럭");
} while (조건식);

while문은 조건식의 결과에 따라 블럭이 한 번도 수행되지 않을 수 있지만, do-while문은 최소 한 번은 수행되는 것을 보장한다.

 

break 문

break 문은 자신이 포함된 가장 가까운 반복문을 벗어난다. 반복문의 실행블럭에서 break 하위의 구문들은 수행되지 않는다.

int i = 0, sum = 0;

while(true) {
    if(sum > 10) {
    	break;
    }
    ++i;
    sum+=i;
}

for문에서 조건식이 거짓이 되기 전에 특정 케이스에서 반복문을 벗어나고 싶을 때 사용할 수 있다. 조건식이 생략된 for문, 또는 조건식이 true인 while문 등 무한 반복문에서는 break 문이 항상 같이 사용되어야 한다.

 

Continue 구문

break 문은 switch문에서도 사용되었지만 continue문은 반복문 내에서만 사용할 수 있다. continue문을 만나면 반복문의 끝으로 이동하여 다음 반복으로 넘어간다. for문의 경우 증감식으로 이동하며, while문과 do-while문의 경우 조건식으로 이동한다.

for (int i = 1; i <= 100; i++) {
    System.out.print(i);
    if (i % 3 > 0) {
        continue;
    }
    System.out.println("(짝!)");
}

 

이름 붙은 반복문

break 문은 근접한 단 하나의 반복문만 벗어날 수 있기 때문에, 여러 개의 반복문이 중첩된 경우에는 break문으로 중첩 반복문을 완전히 벗어날 수 없다. 중첩 반복문에 이름을 붙이고 break문과 continue문에 이름을 지정해 줌으로써, 하나 이상의 반복문을 벗어나거나 반복문을 건너 뛸 수 있다.

 

ex) 2단부터 입력받은 숫자보다 작은 구구단만 출력하며, 입력받은 숫자와 동일한 값을 만나면 종료한다.

public void findGugudan(int number) {
    Loop1 : for(int i = 2; i <= 9; i++) {
        for(int j = 1; j <= 9; j++) {
            int result = i * j;
            if (result > number) {
                continue Loop1;
            }            
            System.out.println(i + "*" + j + "=" + result);
            if (result == number) {
                break Loop1;
            }
        }
    }
}

 

 

※ 참고

Java의 정석

 

Java의 정석

최근 7년동안 자바 분야의 베스트 셀러 1위를 지켜온 '자바의 정석'의 최신판. 저자가 카페에서 12년간 직접 독자들에게 답변을 해오면서 초보자가 어려워하는 부분을 잘 파악하

m.yes24.com