자바 프로그램이 원하는 결과를 얻기 위해서는 프로그램의 순차적인 흐름을 제어해야만 할 경우가 생깁니다. 이때 사용하는 명령문을 제어문이라고 하며 이러한 제어문에는 조건문, 반복문 등이 있습니다. 조건문은 다른 어떤 문법적인 요소보다 중요하므로 조건문이 무엇인지 정도는 확실하게 이해하고 지나가기 바랍니다.
비교는 그 결과가 true, false 중 하나입니다. 조건문은 어떤 조건에 따라 조건이 이렇다면 이런 행동을 하고, 조건이 저렇다면 저런 행동을 하도록 컴퓨터가 동작하는 방법을 조건에 따라 분기하는 역할을 합니다. 자바에서 사용하는 대표적인 조건문의 형태는 다음과 같습니다.
- if문
- if-else문
- if-else-if-else문
- switch문
if문
if문은 조건의 결과가 true면 주어진 명령문을 실행하며, false이면 아무것도 실행하지 않습니다.
조건식에는 true, 또는 false 값을 산출할 수 있는 연산 식이나, boolean 타입 변수가 올 수도 있습니다.
간단히 설명하자면 조건식의 결과에 따라 블록의 실행 여부가 결정되는 것입니다.
다음은 if문의 형식과 실행 흐름을 보여줍니다.
- 조건식이 true면 실행문A에서 실행문 B로 실행됩니다.
- 조건식이 flase면 곧바로 실행문B가 실행됩니다.
조건문의 구성은 위 예문의 if부분, 즉 지금부터 조건문이 시작한다는 사실을 알리는 문법적 요소인 if가 있고 그 뒤에 조건을 의미하는 괄호인 조건절이 등장합니다.
이 조건절에는 딱 두가지 값이 true와 false만 들어갈 수 있습니다.
if문에서 실행될 명령문이 한 줄뿐이라면 중괄호는 생략이 가능합니다.
하지만 괄호블록은 생략하지 않고 작성하는 것을 추천드립니다.
중괄호 블록을 작성하지 않으면 코드의 가독성이 좋지 않아 코드를 해석하기 어려워지고 버그 발생의 원인이 될 수 있기 때문입니다.
<if문 예제>
"안녕"을 입력하면 "너도 안녕", "잘 자"를 입력하면 "너도 잘 자", "잘 가"를 입력하면 "너도 잘 가"가 출력되도록 구현해보겠습니다.
java.util.Scanner sc = new java.util.Scanner(System.in);
System.out.println();
String string = sc.nextLine();
String s1 = "안녕";
String s2 = "잘자";
String s3 = "잘가";
if (string.equals("안녕")) {
System.err.println("너도 안녕");
}
if (string.equals("잘자")) {
System.err.println("너도 잘자");
}
if (string.equals("잘가")) {
System.err.println("너도 잘가");
}
}
}
|
cs |
<출력 결과>
if-else문
앞서 살펴본 if문은 조건이 만족하는 경우에만 실행하게 된다는 것을 확인 할 수 있었습니다.
그렇다면 조건이 만족하지 않을때에는 어떻게 처리할 수 있을까요?
그때 필요한것이 if-else문입니다.
if문은 가장 기본적인 도구이기 때문에 if문으로 모든 것을 해결할 수는 있으나 귀찮은 부분이 생길 수 있습니다.
그래서 참일때 무엇을 하고 거짓일 때 무엇을 한다는 것을 if문에서 한 번에 처리하려면 else 요소가 필요할 것입니다.
if-else문은 if문의 조건식이 true면 if문의 블록이 실행되고, 조건식이 false면 else블록이 실행됩니다.
조건식의 결과에 따라 이 2개의 블록중 어느 한 블록의 내용만 실행하고 전체 if문을 벗어나게 됩니다.
다음은 if-else문의 형식과 실행 흐름을 보여줍니다.
- 조건식이 true면 실행문A를 거쳐 실행문 C를 실행
- 조건식이 false면 실행문B를 거쳐 실행문 C를 실행
조건식 1은 참 또는 거짓으로 평가되는 표현식 부분입니다
실행문 A는 조건이 참으로 평가될 경우 실행되는 부분입니다.
중첩된 if문을 포함하여 어떤 구문이든 쓸 수 있습니다.
실행문 B는 조건이 거짓일 경우 다른 조항이 있을 때 실행되는 구문입니다.
<if else 예제>
점수가 90점 보다 크다면 A등급이 출력되고 90점보다 작다면 B등급이 출력되도록 구현해보겠습니다.
int score=87;
if(score>=90) {
System.out.println("점수가 90점보다 큽니다");
System.out.println("등급은 A입니다");
}else {
System.out.println("점수가 90점보다 작습니다");
System.out.println("등급은 B입니다");
}
}
}
|
cs |
<출력 결과>
if-else-if-else문
조건문이 여러개인 if문도 있습니다.
처음 if문의 조건식이 false일 경우 다른 조건식의 결과에 따라 실행 블록을 선택할 수 있는데, if 블록의 끝에 else if문을 붙이면 됩니다.
else if문의 수는 제한이 없으며, 여러 개의 조건식 중 true가 되는 블록만 실행하고 전체 if문을 벗어나게 됩니다.
else if블록의 마지막에는 else문을 추가할 수 있는데, 모든 조건식이 false일 경우 else블록을 실행하고 if문을 벗어나게 됩니다.
다음은 if-else-if-else문의 형식과 실행 흐름을 보여줍니다.
- 조건식 1이 true면 실행문A를 거쳐 실행문 D 실행
- 조건식 1이 false면 조건식 2로 이동
- 조건식 2가 true면 실행문B를 거쳐 실행문 D 실행
- 조건식 2가 false면 실행문C를 거쳐 실행문 D 실행
앞서 설명했던것과 같이 else if문은 여러 번 나와도 상관없지만 if문과 else문은 단 한 번만 나올 수 있습니다.
주의할 점은 위에서 만족한 조건이 있다면 아래에 있는 else if문과 else문은 바로 건너뛰게 된다는 것입니다.
하지만 if문을 여러개 썼다면 위의 조건을 만족해도 아래 조건을 모두 확인합니다.
<if-else-if-else문 예제>
사용자 입력을 받아 90점 이상은 "수", 80점 이상은 "우", 70점 이상은 "미", 나머지는 양으로 출력되도록 구현해보겠습니다.
Scanner sc = new Scanner(System.in);
System.out.println("점수를 입력하세요");
int input = sc.nextInt(); // 사용자 입력
if (input >= 90) { // 첫번째 조건
System.out.println("수");
} else if (input >= 80) { // 두번째 조건
System.out.println("우");
} else if (input >= 70) { // 세번째 조건
System.out.println("미");
} else { // 거짓일 경우
System.out.println("양");
}
}
}
|
cs |
<출력결과>
switch문
switch문은 if문과 마찬가지로 주어진 조건값의 결과에 따라 프로그램이 다른 명령을 수행하도록 하는 조건문입니다.
하지만 switch문은 if문처럼 조건식이 true일 경우에 블록 내부의 실행문을 실행하는 것이 아니라, 변수가 어떤 값을 갖느냐에 따라 실행문이 선택됩니다.
if문은 조건식의 결과가 true, false 두 가지밖에 없기 때문에 경우의 수가 많아질수록 if와 else를 반복적으로 추가해야 하므로 코드가 복잡해집니다.
하지만 switch문은 변수의 값에 따라서 실행문이 결정되기 때문에 같은 기능인 if문보다 코드가 간결합니다.
여기서 주의할 점은 switch문의 조건값으로는 int형으로 승격할 수 있는 값만 사용이 가능합니다.
그렇기 때문에 코드가 간결하더라도 switch문은 if문보다 사용 빈도가 적습니다.
다음은 switch문의 형식과 실행 흐름을 보여줍니다.
break는 조건값에 해당하는 case 절이나 default절이 실행된 뒤 전체 switch를 빠져나가게 해 줍니다.
만약에 break가 없다면 조건에 해당하는 switch문의 case절 이후의 모든 case절이 전부 실행될 것입니다.
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("해당 문자는 모음이 아닙니다.");
}
|
cs |
위의 예제처럼 break 키워드가 없다면 조건값에 해당하는 case절뿐만 아니라 그 이후에 등장하는 모든 case절과 default절이 전부 실행됩니다.
default 부분은 조건값이 나열된 어떠한 case절에도 해당하지 않을 때만 실행됩니다.
이 부분은 반드시 존재해야 하는 부분은 아니며 필요할 때만 선언할 수 있습니다.
<switch문 예제>
사용자가 입력하는 해당 월이 몇 월인지 출력되도록 구현해보겠습니다
java.util.Scanner sc = new java.util.Scanner(System.in);
System.out.println("일수가 궁금한 해당 월을 숫자로 입력하세요");
int i = sc.nextInt();
switch (i) {
case 4:
case 6:
case 9:
case 11:
System.out.println("해당 월은 30일 입니다");
break;
case 2:
System.out.println("해당 월은 29일 입니다");
break;
default:
System.out.println("해당 월은 31일 입니다");
}
}
}
|
cs |
<실행결과>