if 그리고 else
특정 조건이 만족될 때에만 실행하고픈 문장이 있다면 키워드 if를 사용.
두 개의 문장 중 조건에 따라 하나만 실행하고 싶다면 거기에 else를 더 추가.
if문과 if ~ else문
//if 문의 기본 구조
if(true or false){
조건 true 시 실행되는 영역
}
(true or false) true 또는 false를 반환하는 연산이 오게 된다.
// if ~ else 문의 기본구조
if(true or false){
조건 true 시 실행되는 영역
} else {
조건 false 시 실행되는 영역
}
( ) 소괄호에 true가 오면 if절,
( ) 소괄호에 false가 오면 else절
if ~ else if ~ else문
여러 문장 중에서 조건에 따라 하나의 문장만 실행. (문장의 중간에 얼마든지 else if를 추가 할 수 있다)
// if ~ else if ~ else문의 기본 구조
if(...){
System.out.println("...");
} else if(...){
System.out.println("...");
} else if(...){
System.out.println("...");
} else {
System.out.println("...");
}
맨 위의 if 문에서부터 조건을 검사하며 내려온다.
그러다가 조건이 true인 부분을 만나면 해당 부분에 속한 문장을 실행하고, 나머지는 건너뛰게 된다.
마지막 까지 조건이 true인 부분을 만나지 못하면 마지막에 위치한 else에 속한 문장을 실행하게 된다.
if ~ else if ~ else문은 if ~ else문을 중첩시킨 결과이다.
if ~ else 문의 else절에 다른 if ~ else문이 존재하는 구조이다.
( if ~ else문은 여러 줄에 걸쳐 있어도 하나의 문장이다.)
if ~ else문과 유사한 성격의 조건 연산자.
조건 연산자는 피연산자가 세 개인 연산자이다.
이러한 조건 연산자는 간단한 if ~ else문을 대체하는 용도로 주로 사용된다.
// 조건 연산자의 기본 구조 == 삼항 연산자
조건 ? 수1 : 수2
- 기호 ? 의 왼편이 true이면 기호 : 의 왼편에 있는 수가 반환된다.
- 기호 ? 의 왼편이 false이면 기호 : 의 오른편에 있는 수가 반환된다.
big = ( num1 > num2 ) ? num1 : num2;
num1 의 값이 num2보다 크면, 즉 조건이 true이면 num1이 반환된다.
num1이 반환된다는 것은 위의 문장이 다음과 같이 정리된을 의미한다.
(조건 연산자와 그 피연산자들은 모두 사라지고 num1만 남는다.)
big = num1;
switch와 break
조건에 따라 실행할 문장을 구분.
중간에 else if가 많이 들어가는 상황에 많이 사용.
switch문의 기본 구성
switch문은 switch, case 그리고 default로 이루어 진다
// switch문의 구성
switch(n){
case1 : // n이 1이면 여기서부터 실행
. . .
case2 : // n이 2이면 여기서부터 실행
. . .
case3 : // n이 3이면 여기서부터 실행
. . .
default: // 해당하는 case 없으면 여기서부터 실행
. . .
}
키워드 case와 default를 가리켜 '레이블(Label)'이라 한다.
"라벨" == "switch"
case와 default는 코드상에서 위치를 표시하기 위해 사용된다.
switch문 + break문 : switch문의 일반적인 사용 모델
"switch문 밖으로 빠져나가겠습니다."
switch문 안에서 break문을 적절히 사용하면 if ~ else if ~ else문을 일부 대체할 수 있는 형태.
// 영역별 실행을 위한 구성
switch(n){
case1 :
. . . // case1 영역
break;
case2 :
. . . // case2 영역
break;
case3 :
. . . // case3 영역
break;
default:
. . . // default 영역
}
- 레이블 별로 영역을 형성하여 해당 영역만 실행 할 수 있다.
- 예를 들어 switch문에 2가 전달되면 case2로 이동해서 실행을 이어간다.
그러다 break문을 만나면 switch문을 벗어나게 된다.
- 둘 이상의 레이블을 이어서 둘 수 있다.
switch(n){
case1 :
case2 :
case3 :
System.out.println("case 1, 2, 3");
break;
default :
System.out.println("default");
}
- switch문에 전달되는 정수가 1, 2, 3인 경우에 실행되는 영역이 같아지는데, 이러한 형태의 switch문 구성이 유용한 경우가 있다.
for, while 그리고 do~while
반복문 1 : while문
// while문의 구조
while(num < 5){ //반복 조건
System.out.println(" I like Java " + num); //반복 영역
num++;
}
- while문의 소괄호에는 반복의 조건을 명시.
- true 또는 false가 와야 하므로 이를 반환하는 연산이 오게 된다.
- true를 반환하는 동안에는 횟수에 상관없이 while문의 중괄호가 반복 실행된다.
먼저!! 조건 검사
그리고 결과가 true이면 중괄호 영역 실행
( 조건 검사가 먼저 진행되기 때문에 처음부터 false가 반환되면 while문의 중괄호는 한 번도 실행되지 않을 수 있다.
반면에 조건 검사가 계속해서 true만 반환하도록 구성된다면, while문을 벗어나지 못하는 문제가 발생할 수 있으니 이러한 부분을 주의 해야 한다.
while문의 중괄호도 반복 실행할 문장이 하나라면 생략 가능하다.)
반복문 2 : do ~ while문
먼저!! 조건 검사
그리고 조건 검사 후 결과가 true이면 반복 결정
- while문은 '선 검사' 방식이고 do~while문은 '후 검사' 방식
// do~while문의 구조
do{
System.out.println("I like Java" + num); // 반복 영역
num++;
} while(num < 5); // 반복 조건
"조건에 따른 반복이 필요하다. 그런데 반드시 한 번은 실행을 해야 한다."
반복문 3 : for문
" 반복의 횟수가 정해져 있는 상황 " 에서는 for문을 이용해서 더 간결하고 뜻도 더 잘 통한다.
// for문과 while문의 비교
int num = 0; // ①
while( num < 5 ){ // ②
System.out.println(". . . ");
num++; // ③
// ① ② ③
for(int num = 0; num < 5; num++){
System.out.println(". . . ");
}
1 -> 반복의 횟수를 세기 위한 변수
2 -> 반복의 조건
3 -> 반복의 조건을 무너뜨리기 위한 연산
// for문의 실행 흐름
// ① ② ④
for( int i = 0; i < 3; i++){
System.out.println(. . .); // ③
}
- 첫 번째 루프의 흐름 [ i = 0 ]
① -> ② -> ③ -> ④
- 두 번째 루프의 흐름 [ i = 1 ]
② -> ③ -> ④
- 두 번째 루프의 흐름 [ i = 2 ]
② -> ③ -> ④
- 두 번째 루프의 흐름 [ i = 3 ]
② i 는 3 이므로 탈출!
첫 번째 실행이(첫 번째 루프가) 완료되기까지의 과정을 정리
1. 변수의 선언 및 초기화
2. 반복 조건이 true인지 확인
3. 반복 영역을 실행(반복 조건이 true이면)
4. 변수의 값 증가
break & continue
break 반복문을 빠져나가는 용도로 사용된다.
if문과 함께 사용되어 특정 조건이 만족될 때, 이를 감싸는 반복문을 빠져나가도록 구성.
continue break문과 혼동하기 쉬워 주의가 필요.
continue 문은 실행하던 반복문의 나머지 부분을 생략하고 프로그램의 흐름을 조건 검사부분으로 이동 시킨다
// break문과 continue문의 비교
while(n < 100){
if(x == 20)
break; -----------↓
. . .
}
while문 탈출 ←----
조건 검사로 이동 ←---
while(n < 100){
if(x == 20)
continue; ---------↑
. . .
}
continue문
을 만나면, 반복문의 나머지 부분을 실행하지 않고 반복문의 맨위로 이동을 하여 조건 검사부터 실행을 이어 나간다.
(단, do~while문의 경우 조건 검사가 위치한 맨 아래로 이동한다.)
// 100이하의 자연수 중에서 5의 배수이자 7의 배수인 정수를 전부 출력하고,
// 그 수를 세어서 출력하는 프로그램이다.
// ContinueBasic.java
class ContinueBasic{
public static void main(String[] args){
int num = 0;
int count = 0;
while((num++) < 100){
if(((num % 5) != 0) || ((num % 7) != 0))
continue; // 5와 7의 배수가 아니라면 나머지 건너뛰고 위로 이동
count++; // 5와 7의 배수인 경우만 실행
System.out.println(num); // 5와 7의 배수인 경우만 실행
}
System.out.println("count: " + count);
}
}
무한 루프와 break
반복의 조건이 true로 명시되어서 해당 반복문을 빠져나가지 못하도록 구성된 반복문을 가리켜 '무한루프'라 한다.
while문은 무한 루프
while(true){
. . .
}
do~while문을 이용한 무한 루프
do{
. . .
} while(true)
for문 무한 루프
for( ; ; ){
. . .
}
for문도 반복의 조건을 명시하는 중간 부분에 true를 삽입하면 무한 루프가 형성된다.
이 부분을 그냥 비워도 무한 루프가 형성된다.
반복문의 중첩
for문 안에 if문을 삽입하는 경우가 있다.
마찬가지로 for문 안에 while문도, do~while문도 그리고 for문도 삽입할 수 있다.
이처럼 하나의 반복문 안에 다른 반복문이 삽입된 경우를 가리켜 '반복문의 중첩'이라 한다.
많이 등장하는 for문의 중첩
class ForInFor{
public static void main(String[] args){
for(int i = 0; i < 3; i++){
System.out.println("------------------");
for(int j = 0; j < 3; j++){
System.out.println("[" + i + ", " + j + "] ");
}
System.out.println('\n');
}
}
}
//실행 결과
---------------------
[0, 0] [0, 1] [0, 2]
[1, 0] [1, 1] [1, 2]
[2, 0] [2, 1] [2, 2]
중첩된 for문은 많은 설명이 필요치 않다.
가장 쉬운 예로 구구단의 출력을 들 수 있다.
각 단마다 1부터 9까지 곱을 진행하니 이를 위한 for문이 하나 필요하다.
그리고 2단 부터 9단까지 진행을 해야 하니 이를 위한 for문이 또 하나 필요하다.
구구단 출력을 위한 for문의 중첩
//구구단
class ByTimes{
public static void main(String[] args){
for(int i = 2; i < 10; i++){ // 2단부터 9단까지 진행 위한 바깥쪽 for문
for(int j = 1; j < 10; i++){ // 1부터 9단까지의 곱을 위한 안쪽 for문
System.out.println(i + " x " + j + " = " + (i * j));
}
}
}
}
while문의 중첩
class ByTimesWhile{
public static void main(System[] args){
int j = 2;
int j;
while(i < 10){
j = 1;
while(j < 10){
System.out.println(i + " x " + j + " = " + (i * j));
j++;
}
i++;
}
}
}
중첩된 반복문을 한 번에 빠져나오는 방법: 레이블을 설정하는 break문
class LabeledBreakPoint{
public static void main(System[] args){
outer: for(int i = 1; i < 10; i++){ // 바깥쪽 for문에 레이블 outer 명시!
for(int j = 1; j < 10; j++){
if((i * j) == 72){
System.out.println(i + " x " + j + " = " + i * j);
break outer; // outer로 명시된 반복문까지 빠져나간다.
}
}
}
}
}
//실행 결과
8 x 9 = 72
'iT-Programing > java' 카테고리의 다른 글
[java] 클래스와 인스턴스 (0) | 2020.01.13 |
---|---|
[java] 메소드와 변수의 스코프 (0) | 2020.01.12 |
[java] 연산자(Operators) (0) | 2020.01.12 |
[java] 상수와 형 변환 (0) | 2020.01.12 |
[java] 변수와 자료형 (0) | 2020.01.12 |