자바(JAVA) 제어문
자료형을 근간으로 하여 그 자료형들의 흐름을 원활하고 효율적으로 만들어 주는 것이 제어문입니다.
if, switch, for, while 등의 자바의 제어문에 대해서 알아보겠습니다.
1. 조건문
조건문은 조건식과 문장을 포함하는 블럭{}으로 구성되어 있으며, 조건식의 연산결과에 따라서 실행되는 문장이 달라집니다.
1.1 if문
if문의 구조는 다음과 같습니다.
if (조건식) {
// 조건식의 연산결과가 true일 때 수행될 문장
}
if문의 조건식에는 결과값이 true / false 인 수식만 사용이 가능합니다.
if문에 else문을 추가한 if-else문의 구조는 다음과 같습니다.
if (조건식) {
// 조건식의 연산결과가 true일 때 수행될 문장
} else {
// 조건식의 연산결과가 false일 때 수행될 문장
}
또 다른 if문으로 if문에 else if문을 추가한 if-else if 문이 있는데 구조는 다음과 같습니다.
if (조건식1) {
// 조건식1의 연산결과가 true일 때 수행될 문장
} else if (조건식2) {
// 조건식2의 연산결과가 false일 때 수행될 문장
// ...
} else {
// 보통 마지막은 else 문으로 끝나며 생략이 가능
// 위의 어떠한 조건식도 만족하지 않을 경우 수행될 문장
}
if문에서 조건 판단을 하는 경우엔 boolean 자료형 보다는 비교 연산자를 사용하는 경우가 많습니다.
비교연산자 |
설명 |
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 모두 true일 경우 true를 반환
- x || y : x와 y 둘중에 하나가 true일 경우 true를 반환
!x : x가 false일 경우 true를 반환
또한 다음과 같이 contains 메소드를 조건문에 활용하여 사용할 수 있습니다.
ArrayList<String> pocket = new ArrayList<String>();
pocket.add("paper");
pocket.add("handphone");
pocket.add("money");
if (pocket.contains("money")) {
System.out.println("Money in pocket");
} else {
System.out.println("No money in poeket");
}
위의 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Money in poekct
List 자료형의 경우 담고 있는 값을 확인할 때 반복문을 사용하여 하나씩 확인하는 방법도 있지만, 위와 같이 contains 메소드를 사용하여 비교적 간단하게 확인할 수 있습니다.
1.2 switch/case문
조건문에 경우의 수가 많을 경우 if문보다 switch/case문을 사용하는 것이 더 연산 속도가 빠르고 간결합니다.
기본 구조는 다음과 같습니다.
switch(입력변수) {
case 입력값1: ...
break;
case 입력값2: ...
break;
...
default: ...
break;
}
다음의 예제 코드를 통해 확인해보겠습니다.
int month = 8;
String monthString;
switch (month) {
case 1: monthString = "January";
break;
case 2: monthString = "February";
break;
case 3: monthString = "March";
break;
case 4: monthString = "April";
break;
case 5: monthString = "May";
break;
case 6: monthString = "June";
break;
case 7: monthString = "July";
break;
case 8: monthString = "August";
break;
case 9: monthString = "September";
break;
case 10: monthString = "October";
break;
case 11: monthString = "November";
break;
case 12: monthString = "December";
break;
default: monthString = "Invalid month";
break;
}
System.out.println(monthString);
int형 변수 month의 값에 조건에 맞는 switch/case문이 실행되고 이에 따라 출력 결과가 다르게 나타나는 것을 확인할 수 있습니다.
위와 같이 입력값이 정형화되어 있는 경우는 if문보다는 switch/case문을 쓰는것이 가독성에서 좀 더 유리합니다.
※ 모든 switch/case문은 if-else문으로 변경이 가능하지만, if-else 구조로 작성된 모든 코드를 switch 문으로 변경할 수는 없습니다. (switch/case문은 if-else문보다 제약조건이 많기 때문)
또한, 굳이 switch/case문 없이도 if-else문으로 충분히 코드를 작성할 수 있기 때문에 switch/case문을 지원하지 않는 언어들도 있습니다. ex) 파이썬
Java SE 7 버전 부터는 switch/case문에 String 타입의 사용이 가능해졌습니다.
Java7 이전에는 switch/case문에서 String 타입 표현식을 사용할 수 없었기 때문에, 다중 if-else 문장으로 처리할 수 밖에 없었습니다. 따라서, 매번 String 클래스의 equals() 메서드로 문자열을 비교해야하는 번거로움이 있었습니다.
다음의 예제 코드를 통해 switch/case문에서의 String 타입의 사용을 확인할 수 있습니다.
public void withString(String str) {
switch(str) {
case "bob": case "sam":
//do something ...
break;
case "carl": case "joy":
//do something ...
break;
case "anna": case "haron":
//do something ...
break;
default:
//do something ...
}
}
2. 반복문
반복문은 반복적인 작업을 수행할 때 사용되며 for, while, do-while문이 있습니다.
2.1 for문
for문의 기본 구조는 다음과 같습니다.
for (초기화; 조건식; 증감식) {
// 조건식의 연산결과가 true일 때 수행될 문장
for문의 조건문은 세미콜론(;)으로 구분됩니다. 조건식의 결과가 true 일때까지 반복되며 false일 경우 for문을 빠져나가게 됩니다.
다음 예제 코드를 통해 확인해보겠습니다.
String[] numbers = {"one", "two", "three"};
for(int i=0; i<numbers.length; i++) {
System.out.println(numbers[i]);
}
실행하면 다음과 같은 결과가 출력됩니다.
one
two
three
2.1.1 for문의 continue
continue를 사용한 for문을 확인해보겠습니다.
int[] marks = {90, 25, 67, 45, 80};
for(int i=0; i<marks.length; i++) {
if (marks[i] < 60) {
continue;
}
System.out.println((i+1)+"번 학생 축하합니다. 합격입니다.");
}
실행결과는 다음과 같습니다.
1번 학생 축하합니다. 합격입니다.
3번 학생 축하합니다. 합격입니다.
5번 학생 축하합니다. 합격입니다.
for문의 문장을 수행하는 도중에 continue문을 만나면 for문의 처음으로 돌아가게되는 것을 확인할 수 있습니다.
2.2 for each문 (향상된 for문)
for each문은 키워드가 따로 정해져 있는 것은 아니고 for문을 그대로 사용합니다. 하지만 조건식에서 차이를 보입니다.
for each문의 구조는 다음과 같습니다.
for (type variable: iterate) {
// 조건식의 연산결과가 true일 때 수행될 문장
}
조건식의 variable에는 타입과 변수를 지정합니다. iterate는 반복문에 사용될 객체를 지정하고 한개씩 순차적으로 variable에 대입되어 for문을 수행하게 됩니다. iterate부분에는 배열 및 List등의 타입을 사용할 수 있습니다.
※ for each문은 roop의 step을 처리할 수 없기 때문에 1step씩 순차적으로 반복할 때만 사용이 가능합니다.
다음 예제 코드를 통해 확인해보겠습니다.
String[] numbers = {"one", "two", "three"};
for(String number: numbers) {
System.out.println(number);
}
for문에서의 예제 코드를 for each문으로 바꾼 코드입니다. 좀 더 직관적이고 간결하게 바뀐 것을 확인할 수 있습니다.
2.3 while문
for문과는 다르게 조건식과 수행할 문장만으로 구성되어 있습니다. 하지만 카운터로 사용할 변수와 증감식을 사용해서 for문과 같게 구성할 수 있습니다. 그렇기 때문에 for문과 while문은 서로 바꿔서 사용할 수 있습니다.
while문의 기본 구조는 다음과 같습니다.
while (조건식) {
// 조건식의 연산결과가 true일 때 수행될 문장
}
조건이 true일 경우 while문 안의 문장들을 계속해서 수행하게 됩니다.
다음의 예제 코드를 확인해보겠습니다.
int treeHit = 0;
while (treeHit < 10) {
treeHit++;
System.out.println("나무를 " + treeHit + "번 찍었습니다.");
if (treeHit == 10) {
System.out.println("나무 넘어갑니다.");
}
}
실행 결과는 다음과 같습니다.
나무를 1번 찍었습니다.
나무를 2번 찍었습니다.
나무를 3번 찍었습니다.
나무를 4번 찍었습니다.
나무를 5번 찍었습니다.
나무를 6번 찍었습니다.
나무를 7번 찍었습니다.
나무를 8번 찍었습니다.
나무를 9번 찍었습니다.
나무를 10번 찍었습니다.
나무 넘어갑니다.
위의 예제에서는 treeHit의 값이 10 보다 작을 때까지 반복이되고 이 때 while문안의 문장이 출력됩니다. treeHit의 값이 10이 되었을 경우엔 if문안의 문장을 출력하는 것을 확인할 수 있습니다.
2.3.1 while문의 break
break는 while문을 강제로 멈추게 해주는 코드입니다.
다음의 예제 코드를 확인해 보겠습니다.
int coffee = 10;
int money = 300;
while (money > 0) {
System.out.println("돈을 받았으니 커피를 줍니다.");
coffee--;
System.out.println("남은 커피의 양은 " + coffee + "입니다.");
if (coffee == 0) {
System.out.println("커피가 다 떨어졌습니다. 판매를 중지합니다.");
break;
}
}
실행 결과는 다음과 같습니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 9입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 8입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 7입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 6입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 5입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 4입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 3입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 2입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 1입니다.
돈을 받았으니 커피를 줍니다.
남은 커피의 양은 0입니다.
커피가 다 떨어졌습니다. 판매를 중지합니다.
money의 값이 0보다 크기 때문에 조건식이 true가 되어 while문이 실행되게 됩니다. coffee의 값을 계속 감소시키고 coffee의 값이 0이 됐을 때 if문이 수행되고 그 안의 break문이 실행되어 반복문이 종료되게 됩니다.
2.3.2 while문의 continue
continue는 break와는 다르게 while문을 빠져나가지 않고 while문의 처음으로 돌아가게 해줍니다.
다음의 예제 코드를 확인해 보겠습니다.
int a = 0;
while (a < 10) {
a++;
if (a % 2 == 0) {
continue;
}
System.out.println(a);
}
실행 결과는 다음과 같습니다.
1
3
5
7
9
변수 a가 짝수일 경우 if문 안의 continue문이 실행되어 while문의 처음으로 되돌아가게 되고 홀수가 출력되게 됩니다.
2.4 do-while문
while문과 기본적인 구조는 같으나 문장을 먼저 수행한 후에 조건을 판단하는 것이 while문과의 차이점입니다.
do-while문의 기본 구조는 다음과 같습니다.
do {
// 조건식의 연산결과가 true일 때 수행될 문장
} while (조건식);
다음 예제 코드를 확인해보겠습니다.
int i = 0;
do {
System.out.println("Number : " + i);
i++;
} while (i < 0);
실행결과는 다음과 같습니다.
Number : 0
while문일 경우에는 조건식의 결과가 false 이므로 실행되지 않지만, do-while문은 반드시 한 번 이상 수행되기 때문에 조건식의 판단전까지 실행된 것을 확인할 수 있습니다.
※ while문은 조건에 따라 한 번도 수행되지 않을 수 있지만 do-while문은 반드시 한 번 이상 수행된다는 차이점이 있습니다.
2.5 무한 루프
무한 루프는 반복문이 무한하게 실행되는 코드입니다. while문과 for문에서 모두 사용이 가능합니다.
while 무한 루프문의 구조는 다음과 같습니다.
while (조건식) {
// 조건식의 연산결과가 true일 때 수행될 문장
}
for 무한 루프문의 구조는 다음과 같습니다.
for ( ; ; ) {
// 조건식의 연산결과가 true일 때 수행될 문장
이상으로 자바의 제어문에 대해서 알아봤습니다.
※ 참고 문헌
남궁성, 『Java의 정석 2nd Edition』, 도우출판(2010)
- wikidocs, 자바 제어문, https://wikidocs.net/189
- blogspot, java 7 switch case, http://mussebio.blogspot.kr/2012/05/java7-switch.html
- tistory blog, java do while, http://arabiannight.tistory.com/entry/자바Java-DoWhile-문-사용법