컴퓨터는 소스코드를 위에서 아래로 순서대로 실행하고 이를 ‘흐름’이라고 한다.
하지만 실제로 코드를 짜고 애플리케이션을 만들다 보면, 한 방향으로 코드가 진행될 경우 흐름이 복잡해져 유지보수도 어려워진다.
또 컴퓨터의 매력이 반복작업을 매우 빨리 처리하는 것인데, 그럼 같은 코드를 100번씩이나 중복해서 넣는 것도 비효율적이다.
그래서 이런 한 방향의 흐름을 원하는 곳으로, 또는 계속 순환시키도록 하는 문장을 ‘제어문’이라 한다.
조건식 + {}(블록)
으로 구성되고, 블록 안에는 조건식의 연산결과에 따라 실행될 문장들이 들어간다.조건문은 if, switch문 두 가지인데, 처리할 조건이 많을수록 switch문이 깔쌈하지만 대신 if문보다 제약이 많다.
if(조건식){
// true일 경우 실행.
}
(조건식)
은 비교연산자(<= >= ==)와 논리연산자(&& ||)의 조합으로 구성된다.{}
을 이용하면 많은 코드를 하나의 영역(scope)로 묶어준다.여기서 조건문의 블록 내 실행 코드가 한 줄이면, 블록을 생략하고 한 줄로 쓸 수 있다.
if(score > 60)
System.out.println("합격입니다."); // 개인적으로 비추.
다만, 중첩 if문에서 생략해서 쓸 경우 가장 가까운 if문의 블록이 된다.
if(조건식){
System.out.println("진실입니다."): // 조건식이 참일 때.
} else {
System.out.println("거짓입니다."); //조건식이 거짓일 때.
}
// 상반된 조건
if(input == 0){
System.out.println("0입니다.");
}
if(input != 0){
System.out.println("00이 아닙니다.");
}
// if-else로 변경
if(input == 0){
System.out.println("0입니다.");
}
else{
System.out.println("0이 아닙니다.");
}
그래서 하나의 조건문에 여러 조건을 넣을 경우 else if블록을 추가하면 된다.
if(조건 1){
// 실행 1
} else if(조건 2){
// 실행 2
} else if(조건 3){
// 실행 3
} else {
// 실행 4 : 1,2,3이 거짓일 때 실행
}
여기서 재밌는 건, 이전의 평가한 조건을 기반으로 평가가 된다는 것이다.
if (score >= 90) (
grade = 'A';
} else if (80 <= score && score < 90) { // 80 ≤ score 90
grade = 'B';
} else if (70 <= score score < 80) { // 70 ≤score 80
grade = 'C';
} else { // score < 70
grade = 'D';
}
// 이전 조건을 참조
if (score >= 90) (
grade = 'A';
} else if (80 <= score) { // 80 ≤ score 90
grade = 'B';
} else if (70 <= score ) {// 70 ≤score 80
grade = 'C';
} else { // score < 70
grade = 'D';
}
위 코드에서 보듯이, if문은 첫 번째부터 순서대로 조건을 검사한다. 따라서 이미 기존에 검사했던 결과를 참조함으로써 중복 조건을 최대한 배제한다.
○ 요약
if(조건 1){
// 조건 1 : true일 때만 if문 비교
if(조건 2){
// 조건 1, 2 모두 true
} else {
// 조건 1 : true, 조건 2 : false
}
} else {
// 조건 1 : false
}
else-if
만 많아진다.① 조건식 연산 → ② 결과와 일치하는 case문으로 이동 → ③ 문장 수행 → ④ break문 or switch문의 끝을 만나면 종료
switch (조건식) {
case 값1 :
// 수행문 1
// 수행문 2
break; // switch문 이탈
case 값2 :
// 수행문 3
// 수행문 4
break; // switch문 이탈
default : // else문의 역할
}
여기서 주의할 점은 break문의 위치이다. 만약 break문을 작성해주지 않는다면, 최상단 case문에서 시작할 경우 switch문의 끝에 닿을 때까지 포함된 모든 수행문을 실행할 것이다.
switch (조건식1)(
case '1': case '3':
switch (조건식2){
case 'a':
// 수행문 a
break;
case 'b':
// 수행문 b
}
break; // case 1,3의 break
case '2': case '4':
switch (조건식3){
case 'c':
// 수행문 c
break;
case 'd':
// 수행문 d
}
}
○ 요약
사람은 반복하는 작업을 지루해하지만, 컴퓨터는 반복 작업을 하기 위해 존재한다. 그래서 컴퓨터에게 반복작업을 시키기 위해 ‘반복문’을 배워보자.
for(초기화; 조건식; 증감식){
// 수행문;
}
for(int i = 1; i<=10; i++){
System.out.println(“공부하기 싫다.”);
}
해당 for문을 실행하면 선언된 변수 i에 1이 저장된 후, 조건식이 평가된다. 결과가 true이면 수행문을 실행하고, 증감식이 실행되면 1→2로 변수 i에 저장된 값이 올라간다.
① 초기화
,
으로 구분한다. for (int i=1;i<= 10;i++) { ... }
for (int i=1,j=0;i<=10;i++) { ... }
② 조건식
③ 증감식
,
를 이용해서 여러 변수를 증감할 수 있다.○ 요약
// 구구단 예제
for(int x = 1; x < 10; x++;){
for(int y = 1; y < 10; y++){
System.out.printf(“%d * %d = %d%n”, x,y,x*y);
}
}
for (타입 변수명 : 배열 또는 컬렉션){
// 수행문
}
int[] arr = […];
for (int a : arr){
// 수행문
}
배열이나 컬렉션 안에 저장된 값들을 그 값에 맞는 타입의 변수에 연결해서 다루는 것이다. 따라서 꺼내는 값의 타입과 변수의 타입이 일치해야 된다.
while(조건식){
// 수행문
}
for문과 while의 차이는 뭘까?
// for
for(int i=1;i<=10;i++) {
System.out.println(i);
}
// while
int i = 1;
while(i<=10){
System.out.println(i);
i++;
}
if(i%5==0){
for(;;)
}
while(i%5==0){
}
while문의 조건식은 생략이 안된다.
while(true){
// 수행문
}
다만 무한 반복문의 경우, 끝내지만 않으면 계속 돌아가기 때문에 특정 조건을 이용해서 멈추는 break문을 만들어줘야 한다.
do {
// 조건식의 연산결과가 참일 때 수행.
} while (조건식); // 여기에 ;이 붙음
while은 조건식이 거짓이면, 수행되지 않는다.
반대로 do-while은 do절의 수행문이 먼저 실행되고 조건식이 평가되므로 최소한 한번은 수행된다.
○ 요약
int x = 0;
while(true){
x++:
if (x>2000){ // x의 값이 2000을 넘기면 실행
break; // while문을 벗어난다.
}
}
for (int i=0; i<=10; i++){
if (i%3==0){
continue; // 3의 배수일 때마다 반복을 넘긴다.
}
System.out.println(i); // 1, 2, 4, 5, 7, 8, 10
} ← 여기로 이동
Loop1 : for(int i=2; i<=9; i++) {
for (int j=1;j<=9;j++) {
if(j==5){
break Loop1;
// break; : j 반복문만 끝냄.
}
System.out.println(i+"*"+j+"="+ i*j);
}
} // Loop1의 끝
만약 반복문의 이름을 붙이지 않았다면, break는 j가 5일 때마다 멈춰서, 구구단 2단부터 9단까지 4까지만 출력이 될 것이다.
하지만 이름을 붙였기 때문에2*1, 2*2, 2*3, 2*4
만 출력된다.
○ 요약
도움이 되셨다면 '좋아요' 부탁드립니다 :)