Java - 4 (제어문)

hoegon kim·2022년 11월 30일
0

JAVA

목록 보기
4/26
post-thumbnail

19) 조건문


제어문(control flow statements)

자바 프로그램이 원하는 결과를 얻기 위해서는 프로그램의 순차적인 흐름을 제어해야만 할 경우가 생깁니다.

이때 사용하는 명령문을 제어문이라고 하며, 이러한 제어문에는 조건문, 반복문 등이 있습니다.

이러한 제어문에 속하는 명령문들은 중괄호({})로 둘러싸여 있으며, 이러한 중괄호 영역을 블록(block)이라고 합니다.


조건문(conditional statements)

조건문은 주어진 조건식의 결과에 따라 별도의 명령을 수행하도록 제어하는 명령문 입니다.

조건문중에서도 가장 기본이 되는 명령문은 바로 if문 입니다.

자바에서 사용하는 대표적인 조건문의 형태는 다음과 같습니다.

  1. if 문
  2. if/else 문
  3. if/else if/ else 문
  4. switch 문

if 문

if 문은 조건식의 결과가 참(true)이면 주어진 명령문을 실행하며, 거짓(false)이면 아무것도 실행하지 않습니다.

if문을 순서도로 표현하면 다음 그림과 같습니다.

자바에서 if문의 문법은 다음과 같습니다.

<문법>

if (조건식) {

    조건식의 결과가 참일 때 실행하고자 하는 명령문;

}

위의 코드에서 블록에 속한 명령문은 중괄호({})를 기준으로 오른쪽으로 들여쓰기가 되어 있는것을 볼수 있습니다.

이처럼 들여쓰기를 통해 코드의 가독성을 높이는 것을 인덴트(indent)라고 하며, 될 수 있으면 모든 코드를 인덴트하는 것이 좋습니다.

다음 예제는 if문을 사용하여, 해당 문자가 영문 소문자인지를 확인하는 예제입니다.

<예제>

if(ch >= 'a' && ch <= 'z'){

	System.out.printIn("해당 문자는 영문 소문자 입니다.")
}

※ 참고 : if 문에서 실행될 명령문이 한줄 뿐이라면 중괄호({})를 생략할 수 있습니다.


if/else 문

if 문과 함께 사용하는 else 문은 if문과는 반대로 주어진 조건식의 결과가 거짓(false)이면 주어진 명령문을 실행합니다.

if/else 문을 순서도로 표현하면 다음 그림과 같습니다.

자바에서 if/else 문의 문법은 다음과 같습니다.

<문법>

if (조건식) {

    조건식의 결과가 참일 때 실행하고자 하는 명령문;

} else {

    조건식의 결과가 거짓일 때 실행하고자 하는 명령문;

}

다음 예제는 if/else 문을 사용하여, 해당 문자가 영문 소문자 인지 아닌지를 확인하는 예제입니다.

if (ch >= 'a' && ch <= 'z') {

    System.out.println("해당 문자는 영문 소문자입니다.");

} else {

    System.out.println("해당 문자는 영문 소문자가 아닙니다.");

}

결과 : 해당 문자는 영문 소문자가 아닙니다.

※ 참고 : if/else문에서도 실행될 명령문이 한줄 뿐이라면 중괄호({})를 생략할 수 있습니다.


if/else if/ else 문

if / else if / else 문은 마치 새로운 구문처럼 보이지만, 사실은 두 개의 if / else 문이 연달아 나온 것뿐입니다.

이러한 if / else if / else 문은 조건식을 여러 개 명시할 수 있으므로 중첩된 if 문을 좀 더 간결하게 표현할 수 있습니다.

if / else if / else 문을 순서도로 표현하면 다음 그림과 같습니다.

<문법>

if (조건식1) {

    조건식1의 결과가 참일 때 실행하고자 하는 명령문;

} else if (조건식2) {

    조건식2의 결과가 참일 때 실행하고자 하는 명령문;

} else {

    조건식1의 결과도 거짓이고, 조건식2의 결과도 거짓일 때 실행하고자 하는 명령문;

}

이때 else if 문은 여러 번 나와도 상관없지만, if 문과 else 문은 단 한 번만 나올 수 있습니다.

다음 예제는 if / else if / else 문을 사용하여, 해당 문자가 영문 소문자나 영문 대문자인지, 아니면 영문자가 아닌지를 확인하는 예제입니다.

<예제>
if (ch >= 'a' && ch <= 'z') {

    System.out.println("해당 문자는 영문 소문자입니다.");

} else if (ch >= 'A' && ch <= 'Z') {

    System.out.println("해당 문자는 영문 대문자입니다.");

} else {

    System.out.println("해당 문자는 영문자가 아닙니다.");

}

결과 : 해당 문자는 영문 대문자 입니다.

※ 참고 : if/else if/ else 문에서도 실행될 명령문이 한 줄 뿐이라면 중괄호({})를 생략할 수 있습니다.


삼항 연산자에 의한 조건문

자바에서는 간단한 if/else 문은 삼항 연산자를 이용하여 간결하게 표현할 수 있습니다.

<문법>

조건식 ? 반환값1 : 반환값2

삼항 연산자에 대한 더 자세한 사항은 자바 기타 연산자 수업에서 확인할수 있습니다.

http://www.tcpschool.com/java/java_operator_etc


switch 문

switch 문은 if/else문과 마찬가지로 주어진 조건 값의 결과에 따라 프로그램이 다른 명령을 수행하도록 하는 조건문 입니다.

이러한 switch 문은 if/else 문보다 가독성이 더 좋으며, 컴파일러가 최적화를쉽게 할 수 있어 속도 또한 빠른편입니다.

하지만 switch 문의 조건 값으로 int형으로 승격할 수 있는(integer promotion)값만이 사용될수 있습니다.

즉, 자바에서 switch문의 조건 값으로 byte 형, short 형, char 형, int 형의 변수나 리터럴을 사용할 수 있습니다.

또한, 이러한 기본 타입에 해당하는 데이터를 객체로 포장해 주는 래퍼 클래스(Wrapper class)중에서 위에 해당하는 Byte,Short, Character, Integer 클래스의 객체도 사용할 수 있습니다.

그리고 enum 키워드를 사용한 열거체(enumeration type)와 String 클래스의 객체도 사용할 수 있습니다.

따라서 switch 문은 if/else 문보다는 사용할 수 있는 상황이 적습니다.

자바에서 switch문의 문법은 다음과 같습니다.

<문법>
switch (조건 값) {

    case 값1:

        조건 값이 값1일 때 실행하고자 하는 명령문;

        break;

    case 값2:

        조건 값이 값2일 때 실행하고자 하는 명령문;

        break;

    ...

    default:

        조건 값이 어떠한 case 절에도 해당하지 않을 때 실행하고자 하는 명령문;

        break;

}

default 절은 조건 값이 위에 나열한 어떠한 case절에도 해당하지 않을때만 실행됩니다.

이 절은 반드시 존재해야 하는 것은 아니며 필요할 때만 선언할 수 있습니다.

다음 예제는 switch문을 사용하여, 해당 문자가 영문자 모음인지를 확인하는 예제입니다.

switch (ch) {

    case 'a':

        System.out.println("해당 문자는 'A'입니다.");

        break;

    case 'e':

        System.out.println("해당 문자는 'E'입니다.");

        break;

    case 'i':

        System.out.println("해당 문자는 'I'입니다.");

        break;

    case 'o':

        System.out.println("해당 문자는 'O'입니다.");

        break;

    case 'u':

        System.out.println("해당 문자는 'U'입니다.");

        break;

    default:

        System.out.println("해당 문자는 모음이 아닙니다.");

        break;

}

결과 : 해당문자는 'I'입니다.

default 절은 위의 예제와 같이 맨 마지막에 위치하는 것이 일반적이지만, case절 사이에 위치해도 상관없습니다.

각 case 절 및 default절은 반드시 break키워드를 포함하고 있어야 합니다.

break키워드는 조건 값에 해당하는 case절이나 default절이 실행된 뒤에 전체 switch문을 빠져나가게 해줍니다.

만약에 break키워드가 없다면, 조건에 해당하는 switch문의 case절 이후의 모든 case절이 전부 실행될 것입니다.

다음 예제는 앞서 살펴본 예제에서 break 키워드를 모두 삭제한 예제입니다.


switch (ch) {

    case 'a':

        System.out.println("해당 문자는 'A'입니다.");

    case 'e':

        System.out.println("해당 문자는 'E'입니다.");

    case 'i':

        System.out.println("해당 문자는 'I'입니다.");

    case 'o':

        System.out.println("해당 문자는 'O'입니다.");

    case 'u':

        System.out.println("해당 문자는 'U'입니다.");

    default:

        System.out.println("해당 문자는 모음이 아닙니다.");

}

결과

해당 문자는 'I'입니다.

해당 문자는 'O'입니다.

해당 문자는 'U'입니다.

해당 문자는 모음이 아닙니다.

위의 예제처럼 break 키워드가 없으면, 조건 값에 해당하는 case절 뿐만 아니라 그 이후에 등장하는 모든 case절과 default절이 전부 실행됩니다.


다음 예제는 조건 값으로 여러 개의 char형 문자를 확인하는 예제입니다.

이렇게 switch문의 조건으로 여러개의 case절을 사용하여 여러 개의 조건 값을 한 번에 검사할 수 있습니다.

switch (ch) {

    case 'a':

    case 'e':

    case 'i':

    case 'o':

    case 'u':

        System.out.println("해당 문자는 소문자 모음입니다.");

        break;

    case 'A':

    case 'E':

    case 'I':

    case 'O':

    case 'U':

        System.out.println("해당 문자는 대문자 모음입니다.");

        break;

    default:

        System.out.println("해당 문자는 모음이 아닙니다.");

        break;

}

실행결과
해당문자는 대문자 모음입니다.


20) 반복문


반복문(iteration statmenets)

반복문이란 프로그램 내에서 똑같은 명령을 일정 횟수만큼 반복하여 수행하도록 제어하는 명령문입니다.

프로그램이 처리하는 대부분의 코드는 반복적인 형태가 많으므로, 가장 많이 사용되는 제어문 중 하나입니다.

자바에서 사용되는 대표적인 반복문의 형태는 다음과 같습니다.

  1. while 문
  2. do / while 문
  3. for 문
  4. Enhanced for 문

while 문

while 문은 특정 조건을 만족할 때 까지 계속해서 주어진 명령문을 반복 실행합니다.

자바에서 while문의 문법은 다음과 같습니다.

<문법>

while (조건식) {

    조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;

}

while 문은 우선 조건식이 참(true)인지를 판단하여, 참이면 내부의 명령문을 실행합니다.

내부의 명령문을 전부 실행하고 나면, 다시 조건식으로 돌아와 또 한번 참인지를 판단하게 됩니다.

이렇게 조건식의 검사를 통해 반복해서 실행되는 반복문을 루프(loop)라고 합니다.

다음 예제는 while 문을 5번 반복해서 실행하는 예제입니다.

<예제>

int i = 0;

 

while (i < 5) {

    System.out.println("while 문이 " + (i + 1) + "번째 반복 실행중입니다.");

    i++; // 이 부분을 삭제하면 무한 루프에 빠지게 됨.

}

System.out.println("while 문이 종료된 후 변수 i의 값은 " + i + "입니다.");

실행결과
while 문이 1번째 반복 실행중입니다.
while 문이 2번째 반복 실행중입니다.
while 문이 3번째 반복 실행중입니다.
while 문이 4번째 반복 실행중입니다.
while 문이 5번째 반복 실행중입니다.
while 문이 종료된 후 변수 i의 값은 5입니다.

while 문 내부에 조건식의 결과를 변경하는 명령문이 존재하지 않을때는 프로그램이 영원히 반복되게 됩니다. 이것을 무한루프(infinite loop)에 빠졌다고 하며, 무한루프에 빠진 프로그램은 영원히 종료되지 않습니다.

무한 루프는 특별히 의도한 경우가 아니라면 반드시 피해야 하는 상황입니다.

따라서 while문을 작성할 때는 조건식의 결과가 어느 순간 거짓(false)을 갖도록 조건식의 결과를 변경하는 명령문을 반드시 포함시켜야 합니다.

위의 예제에서 조건식의 결과를 변경하는 명령문인 i++를 제거하면, 변수 i의 값은 언제나 1이기 때문에 무한루프에 빠지게 됩니다.

※ 참고 : while문에서 실행될 명령문이 한줄 뿐이라면 중괄호({})를 생략할 수 있습니다.


do/while 문

while 문은 루프에 진입하기 전에 먼저 조건식부터 검사합니다.

하지만 do/while문은 먼저 루프를 한번 실행한 후에 조건식을 검사합니다.

즉, do/while문은 조건식의 결과와 상관없이 무조건 한번은 루프를 실행합니다.

<문법>
do{
	조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;
} while(조건식);

<예제>

int i = 1, j = 1;

 

while (i < 1) {

    System.out.println("while 문이 " + i + "번째 반복 실행중입니다.");

    i++; // 이 부분을 삭제하면 무한 루프에 빠지게 됨.

}

System.out.println("while 문이 종료된 후 변수 i의 값은 " + i + "입니다.");

do {

    System.out.println("do / while 문이 " + i + "번째 반복 실행중입니다.");

    j++; // 이 부분을 삭제하면 무한 루프에 빠지게 됨.

} while (j < 1);

System.out.println("do / while 문이 종료된 후 변수 j의 값은 " + j + "입니다.");

결과
while 문이 종료된 후 변수 i의 값은 1입니다.
do / while 문이 1번째 반복 실행중입니다.
do / while 문이 종료된 후 변수 j의 값은 2입니다.


for 문

for문은 while문과는 달리 자체적으로 초기식,조건식,증감식을 모두 포함하고 있는 반복문입니다.

따라서 while문보다는 좀 더 간결하게 반복문을 표현할 수 있습니다.

자바에서 for문의 문법은 다음과 같습니다.

<문법>
for (초기식; 조건식; 증감식) {

    조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문;

}

이때 for 문을 구성하는 초기식, 조건식, 증감식은 각각 생략할 수 있습니다.

for 문을 사용하면 앞선 예제의 while 문을 더욱 더 간결하게 표현할 수 있습니다.

<예제>

for (i = 0; i < 5; i++) {

    System.out.println("for 문이 " + (i + 1) + "번째 반복 실행중입니다.");

}

System.out.println("for 문이 종료된 후 변수 i의 값은 " + i + "입니다.");

결과
for 문이 1번째 반복 실행중입니다.
for 문이 2번째 반복 실행중입니다.
for 문이 3번째 반복 실행중입니다.
for 문이 4번째 반복 실행중입니다.
for 문이 5번째 반복 실행중입니다.
for 문이 종료된 후 변수 i의 값은 5입니다.

※ for문에서 실행될 명령문이 한줄 뿐이라면 중괄호({})를 생략할 수 있습니다.

자바에서는 다음 예제처럼 for문 안에서만 사용하는 변수를 초기식에서 직접 선언할 수 있습니다.

이렇게 for문에서 직접 선언된 변수는 for문이 종료되면 같이 소멸합니다.

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

    System.out.println("for 문이 " + (i + 1) + "번째 반복 실행중입니다.");

}

① // System.out.println(i);


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

    System.out.println("for 문이 " + (i + 1) + "번째 반복 실행중입니다.");

}

결과
for 문이 1번째 반복 실행중입니다.
for 문이 2번째 반복 실행중입니다.
for 문이 3번째 반복 실행중입니다.

결과
for 문이 1번째 반복 실행중입니다.
for 문이 2번째 반복 실행중입니다.
for 문이 3번째 반복 실행중입니다.

위의 예제에서 반복문을 종료시키기 위한 변수로 i라는 이름의 int형 변수를 한 프로그램에서 두번이나 선언하고 있습니다.

하지만 이렇게 두번이나 선언해도 컴파일 오류가 발생하지 않는 이유로 for문이 종료되면 for문의 초기식에서 사용된변수는 자동적으로 소멸하기 때문입니다.

따라서 ①번 라인에서 변수 i를 참조하려고 하면 선언되지 않은 변수를 참조하려는 것이므로, 오류가 발생합니다.

변수의 유효범위에 대한 더 자세한 사항은 자바 필드의 구분 수업에서 확인할 수 있습니다.

http://www.tcpschool.com/java/java_member_field

※ 참조 : 위의 예제에서 사용된 System.out.println(); 명령문은 출력 시 한 줄을 띄어주는 역할만을 합니다.


Enhanced for 문

JDK 1.5부터 Enhanced for 문이라는 반복문이 추가 되었습니다.

이 반복문은 컬렉선 프레임워크와 배열에서 유용하게 자주 사용됩니다.

Enhanced for문에 대한 더 자세한 사항은 자바 배열의 활용 수업에서 확인할 수 있습니다.

http://www.tcpschool.com/java/java_array_application

0개의 댓글