기본적으로 프로그램은 소스코드를 차례대로 1줄씩 처리한다. 이때 제어문은 '프로그램의 처리 순서
를 바꾸는 것'이다.
자바에는 5개의 제어문(선택제어문 2개, 반복제어문 3개)과 2개의 제어키워드가 있다.
if 문은 조건식
에 따라 실행문의 실행 여부
를 결정하는 선택 제어문이다. 기본적인 문법 구조는 크게 3가지 유형이 있다.
조건식 = true
일 때 중괄호 안을 실행package ifSingle;
public class ifSingle {
public static void main(String[] args) {
if(5 > 3)
System.out.println("출력"); // 참
int a = 3;
if(a == 3)
System.out.println("출력3"); // 참
boolean b = false;
if(b)
System.out.println("출력4"); // 거짓
}
}
조건식이 true
일 때 if 구문의 중괄호 실행조건식이 false
일 때 else 구문의 중괄호 실행package ifelse;
public class ifelse {
public static void main(String[] args)
{
if(5 > 3)
System.out.println("if문이 실행");
else
System.out.println("else문이 실행");
int a = 5, b = 0;
if(a > 5)
{
b = 10;
} else {
b = 20;
}
System.out.println(b);
//삼항 연산자로 변환
a = 5; b = 0;
b = (a > 5)? 10 : 20;
System.out.println(b);
}
}
조건식이 true
가 나오는 중괄호 블록을 만나면 해당 블록의 중괄호를 실행하고 if 문 탈출. int a = 85;
if(a >= 90) {
System.out.println("A학점");
}
else if(a >= 80) {
System.out.println("B학점");
}
else if(a >= 70) {
System.out.println("C학점");
}
else {
System.out.println("F학점");
}
switch문은 switch()
의 ()
의 들어갈 변숫값에 따라 특정 위치로 이동해 구문을 실행하는 선택 제어문이다.
점프할 수 있는 위치는 case 값 :
으로 설정한다. switch 문의 맨 아래에는 defalut :
구문도 있는데 일치하는 값이 없을때는 default 문이 실행된다.(생략 가능)
int a = 2;
switch(a) {
case 1:
System.out.println("A");
case 2:
System.out.println("B");
case 3:
System.out.println("C");
default:
System.out.println("D");
}
a 값이 2이므로 switch 문
이 case 2:
로 실행순서를 이동시킨 후 프로그램 실행 순서대로 1줄씩 실행.
그럼 switch 문도 if문 처럼 하나의 실행문만 실행하게 할 수 없을까?
제어키워드 중 하나인
break
를 사용한다. break문은 if 문을 제외한 가장 가까운 중괄호를 탈출!
switch(a) {
case 1:
System.out.println("A");
break;
case 2:
System.out.println("B");
break;
case 3:
System.out.println("C");
break;
default:
System.out.println("D");
}
if 문과 switch 문의 차이점은
if 문은 조건식에서 다양한 비교 연산자, 논리 연산자를 사용할 수 있고 switch 문은 정수, 문자, 문자열만 사용할 수 있다는 점이다.
성능에서의 차이점은, .if문은 순서대로 조건식을 검사하기에 첫번째 조건식의 실행문 출력과 나머지 조건식의 실행문 출력 사이에 속도 차이가 발생할 ㅅ수 있다. 반면 switch 문을 사용할 때는 동일하게 한 번만의 점프만을 수행한 후 실행되므로 모든 출력 속도가 동일하다는 장점이 있다. 그러나 수백만 개의 데이터를 처리하는 상황이 아니라면 어느 것을 사용해도 상관없다.
for문은 실행 구문을 반복적으로 수행하는 반복 제어문
반복 횟수가 정해져있을때 많이 사용
package forSyntax;
public class ForSyntax {
public static void main(String[] args)
{
//for 문 기본 구조
int a;
for(a = 0; a < 3; a++)
System.out.print(a+" ");
System.out.println();
for(int i = 0; i < 3; i++)
System.out.print(i+ " ");
System.out.println();
for(int i = 0; i < 100; i++)
System.out.print(i+ " ");
System.out.println();
for(int i= 0; i > 0; i--)
System.out.print(i + " ");
System.out.println();
for(int i = 0, j = 0 ; i < 10; i++, j++)
System.out.print(i+j+" ");
System.out.println();
System.out.println();
for(int i = 0; ; i++) {
if(i > 10) {
break;
}
System.out.print(i+" ");
}
System.out.print("무한 루프 탈출");
}
}
중괄호 안의 실행구문을 반복적으로 실행하는 반복 제어문으로 소괄호 안의 조건식이 true
이면 반복 실행.
{
int num = 0, sum = 0;
while(sum < 100) {
sum += num;
num ++;
}
System.out.println((num-1) + "까지의 합 = " + sum);
}
while문의 실행 순서는 먼저 조건식을 검사하고 조건식이 true일 때 중괄호 안의 실행 구문을 실행
이후 닫힌 중괄호를 만나면 다시 조건식을 검사하며, 이와 같은 과정을 조건식이 거짓이 될 때까지 반복
조건식이 거짓이 되면 while문을 탈출하는데 for문과 마찬가지로 종료되는 시점은 닫힌 중괄호가 아닌 조건식
이다.
while문과 for문은 초기식, 조건식, 증감식을 모두 포함하고 있어 언제든지 상호 변환 가능
int a = 0;
while(a < 10) {
System.out.print(a + " ");
a ++;
}
System.out.println();
//for문으로 변환
for(int i = 0; i < 10; i++)
System.out.print(i+ " ");
System.out.println();
//for문으로 변환
for(int i = 10; i > 0 ; i--)
System.out.print(i+ " ");
//while문으로 만든 무한 루프
/*
while(true)
System.out.println("무한루프");
*/
//무한루프탈출
int c = 0;
while(true) {
if(c > 10) {
break;
}
System.out.print(c + " ");
c++;
}
while문과 매우 비슷한 반복 제어문
조건식의 검사와 반복 실행의 순서에만 차이가 있음
초기식;
do {
실행 구문;
증감식;
} while(조건식);
do {...} while(조건식);
의 형태로 마지막이 중괄호로 끝나지 않으므로 제어문들 중에 유일하게 세미콜론(;)을 붙어야 함.참
이면 do 구문을 실행, 거짓
이면 제어문 탈출. int a;
//while
a = 0;
while( a < 0 ) {
System.out.print(a+ " ");
a++;
}
System.out.println();
//do-while
a = 0;
do {
System.out.print(a+ " ");
a++;
}while(a < 0);
초깃값이 a = 0 이므로 처음부터 조건식은 a < 0은 false.
이때 while문은 중괄호 안으로 진입할 수 없어 한 번도 실행되지 않으나 반면, do-while문일 때 일단 한 번은 실행한 후 조건식을 검사하므로 한번은 실행됨.
마치 do - while문은 while문보다 1회 더 실행된다고 착각할 수 있으나 절대 그렇지 않음.
int a;
//while
a = 0;
while( a < 10 ) {
System.out.print(a+ " ");
a++;
}
System.out.println();
//do-while
a = 0;
do {
System.out.print(a+ " ");
a++;
}while(a < 10);
변숫값을 하나씩 따져 보자. 1회 이상 반복될 때는 while문과 do-while문은 동일한 결과가 나타남.
정리: while문 0번, 1번, 2번, 3번 ... 반복
do-while문 1번, 1번, 2번, 3번... 반복
while문이 0번 반복될때만 차이가 있고 1 회 이상에선 동일. 절대로 do-while문이 한 번 더 실행되는 것이 아님!
5개의 제어문을 봤다. 각 제어문 내부에는 또 다른 제어문을 포함할 수 있는데 예를 들어 if문 내부에 if문, switch문 안에 for문, for문 내부에 for 문 등 제어문을 얼마든지 중복해 사용 가능.
int value1 = 5;
int value2 = 3;
if(value1 > 5) {
if(value2 < 2)
System.out.println("실행1");
else
System.out.println("실행2");
} else {
System.out.println("실행3");
}
System.out.println();
//switch-for 중복
int value3 = 2;
switch(value3) {
case 1:
for(int k = 0; k < 10; k++) {
System.out.print(k + " ");
}break;
case 2:
for(int k = 10; k > 0; k--) {
System.out.print(k+ " ");
}break;
}
System.out.println();
System.out.println();
//for-for-if 중복
for(int i =0; i<3; i++) { //3회 반복
for(int j =0; j<5; j++) { // 5회 반
System.out.println(i + " "+ j);
if( i == j ) {
System.out.println("i = j");
}
}
}
break 문은 if문을 제외한 가장 가까운 중괄호({})를 탈출
하는 제어 키워드
for(int i=0; i<10; i++) {
System.out.println(i); // i= 0일때 한번 출력
break;
}
for(int i=0; i<10; i++) {
for(int j=0; j<10; j++) {
if(j == 3)
break;
System.out.println(i + ", "+ j);
}
}
j값이 3이 되어 break를 만나면 탈출하는 반복문은 안쪽의 for문임.
그러나 탈출 이후에도 바깥쪽 for 문 내부에 있으므로 i 값에 따른 반복은 여전히 유효!
즉, i=0,1,2,...9 그리고 j=0,1,2 일 때 출력이 모두 이뤄짐.
out:
for(int i=0; i<10; i++) {
for(int j=0; j<10; j++) {
if(j == 3)
break out;
System.out.println(i + ", "+ j);
}
}
break out은 out 레이블이 달린 바깥쪽 for문을 탈출하라는 의미. 3회의 출력까지만 실행.
for(int i = 0; i< 10; i++) {
if(i == 5) {
continue;
}
System.out.println(i); //0,1.2,3,4,6,7,8,9
}
i=5 일때는 continue가 실행되어 출력 코드가 실행되지 않음.
따라서 i=5 일때를 제외하고 9번의 출력 실행.
📕 참고문헌) Do it! 자바 완전 정복!