공부했던 자료 정리하는 용도입니다.
재배포, 수정하지 마세요.
조건문 (if, switch)
조건문은 조건과 코드가 들어간 { } 로 이루어져 있으며 조건식의 결과에 따라 프로그램의 흐름이 바뀐다. 일반적으로 if 문을 많이 쓰고 조건이 많을 때는 switch 문을 사용한다고 하지만 조건이 많은데도 if 문을 써야 하는 경우도 있다. 상황에 따라 적절한 것을 사용하면 된다.
if문
if (조건식){
// 조건식이 true일 때 수행될 문장
}
if 옆 ( ) 안에 있는 조건식이 참이면 { } 안의 문장들을 실행시킨다.
( ) 안에는 결과값이 true 나 false 인 것들만 올 수 있다.( boolean형 이나 boolean값을 반환하는 조건식 )
score 의 값이 60 보다 크다면 "합격입니다." 가 출력되고,
60 보다 작다면 아무 일도 일어나지 않는다.
■ if-else문
if(조건식){
//if의 조건식이 true(0이 아닌값)일 때 수행되는 문장
}else{
//if의 조건식이 false(0)일 때 수행되는 문장
}
if 문의 변형인 형태이다. if 문은 조건식이 true일 때는 if { } 안의 코드가 실행되고 false인 경우에는 아무 일도 일어나지 않는다.
if-else 문도 마찬가지로 true일 때는 if 문과 동일하게 if { } 안의 코드가 실행되지만 false인 경우 else { } 의 문장들이 실행된다.
만약 input 이 0(true)이라면 "입력한 숫자는 0입니다." 가 출력되고,
input이 0이 아닌 다른 숫자(false)가 나온다면 "입력한 숫자는 0이 아닙니다." 가 출력된다.
■ if- else if문
if(조건식1){
//if의 조건식(조건식 1)이 true(0이 아닌값)일 때 수행되는 문장
}else if(조건식2){
//if의 조건식(조건식1)이 false(0)이고 else if의 조건식(조건식2)이 true(0이 아닌값)일 때 수행되는 문장
}else if(조건식3){ // 필요한 경우else if가 여러 개 들어올 수 있음
//if의 조건식(조건식1)이 false(0), 첫 번째 else if의 조건식(조건식2)도 false(0)이고, 두번 째 else if의 조건식(조건식3은 true(0이 아닌값)일 때 수행되는 문장
}else{ //전부 해당하지 않는 것들에 대해 처리하고 싶을 때는 마지막에 else문을 사용한다(필수 X)
//위에 나온 조건식들이 모두 false일 때 수행되는 문장
}
//전체 if문의 바깥
처리해야 할 조건식이 3개 이상인 경우에 사용한다.
주의할 점은 앞의 조건에 해당하지 않는 것들 중에서 또 그다음 조건식에 대한 참 거짓을 따진다는 점이다.
또한 해당하는 조건식이 나오면 그 블럭 { } 안의 코드들만을 수행하고 바깥으로 빠져나온다.(주석된 부분)
score 의 값이 100 이므로 첫 번째 if 문의 블럭 { } 만 수행하고 바깥으로 빠져나온다.
else if 문도 조건만 보면 맞아 보이지만 사실은 if 문의 조건식이 참이 아닌 것들 중에 score 가 80 이상인 조건이므로 (80 <= score) && (score < 90)과 같은 의미이다.
■ 중첩 if문
if(조건식1){
//if문의 조건식(조건식1)이 true일 때 수행될 문장
if(조건식2){
//첫번째 if문의 조건식(조건식1)이 true이고 두번째 if문(조건식2)이 true일 때 수행될 문장
}else{
//조건식1은 true지만 조건식2는 false일 때
}
}
if 문 안에 또 다른 if 문을 넣은 것을 중첩 if 문이라고 한다. 중첩 횟수에는 제한이 없다.
중첩 if 문은 들여 쓰기를 해서 if 문들이 서로 명확하게 구분되도록 해야 한다.
성적을 구하는 코드의 한 부분이다.
중첩 if 문을 사용해서 score 가 90 점 이상인 사람들 중 95 점이 넘으면 A+를 주고,
score 가 90 점 이상이지만 95 점을 넘지 않는 사람에게는 A를 주는 코드이다.
이처럼 중첩 if 문을 활용하면 조건을 세분화시킬 수 있다.
■ 단락 회로 평가(short circuit evaluation)
- 논리 곱(&&)의 경우 : 두 조건이 모두 true인 경우에만 결과가 true → 앞의 조건이 false이면 뒤의 조건은 평가하지 X
- 논리 합(||)의 경우 : 두 조건이 모두 false인 경우에만 결과가 false → 앞의 조건이 true이면 뒤의 조건은 평가하지 X
int num1 = 10;
int num2 = 100;
if ((num1 = num1 + 10) < 10 && (num2 = num2 + 100) > 100)
System.out.println("all true");
System.out.println("num1 : " + num1);
System.out.println("num2 : " + num2);
단락 회로 평가를 확인해볼 수 있는 간단한 예시이다.
의도대로라면 num1과 num2의 값이 모두 바뀌어야 하지만 뒤의 조건 부분은 평가되지 않았기 때문에 num2의 값은 변하지 않았다.
switch문
switch(조건식){
case 값1:
//조건식의 결과가 값1과 같을 경우 수행 될 문장
break; //break문을 만나면 switch문 바깥으로 빠져나간다.
case 값2:
//조건식의 결과가 값2와 같을 경우 수행 될 문장
break;
...
default: // else문 처럼 필수가 X
//조건식의 결과와 일치하는 case문이 없을 때 수행 될 문장
}
경우의 수가 많은 경우에 if 문보다 간결하게 표현할 수 있어서 많이 사용한다. if 문처럼 중첩도 가능하다.
다만 제약조건이 있어 경우의 수가 많다고 무조건 switch 문을 사용할 수 있는 것은 아니다.
switch문의 제약조건 1. 조건식 결과는 정수 or 문자열이어야 한다. 2. case문의 값은 정수 or 정수 상수만 가능하며, 중복되지 않아야 한다. (Java 7이후로는 문자열도 가능) |
switch 문은 조건식을 계산한 값과 일치하는 case 값을 찾아서 그 위치부터 코드를 실행시킨다.
주의할 점은 해당하는 코드만 실행시키고 조건문을 빠져나가는 if 문과 달리 switch 문은 break 를 만날 때까지 계속해서 코드를 실행한다는 점이다.
default 문은 해당하는 case 값이 없을 때 실행되는 부분이다. 보통 마지막에 위치하지만 중간에 넣을 경우 마찬가지로 break 문을 넣어야 해당 부분만 실행되고 조건문 바깥으로 빠져나온다.
위의 코드를 실행시키면 어떻게 될까?
case 1 뿐만 아니라 case 2 에 해당하는 코드가 출력되었다. break 문이 없기 때문이다.
switch 문에서 조건문을 빠져나오려면 break 문이 있어야 한다는 것을 알 수 있다.
반복문 (for, while, do-while)
반복문은 어떤 작업이 반복적으로 수행되도록 할 때 사용한다. 조건식을 만족하는 동안 작업을 반복하는 것이므로 조건문을 포함한다. for 문과 while 문은 비슷해서 어떤 것을 사용해도 기능에 차이는 없으나 보통 반복 횟수를 알고 있을 경우에는 for , 반복 횟수를 모를 때는 while 을 많이 사용한다. 또한 for 문이나 while 문에 속한 문장은 조건에 따라 한 번도 수행되지 않을 수도 있지만 do-while 은 무조건 최소 한 번은 수행된다는 차이점이 있다. 반복문을 잘못 작성하면 무한루프가 되기 때문에 주의해서 쓰자!
for문
for(초기화 ; 조건식 ; 증감식){
//조건식이 참일 때 수행될 문장
}
초기화 : for 문에 사용될 변수를 초기화하는 부분이며 처음에 한 번만 수행된다. 여러 개의 변수를 쓸 경우 타입이 같아야 하고. 콤마( , )를 사용해서 구분한다. 조건식 : 반복할 때 true / false 를 따질 조건식 증감식 : 반복문을 제어하는 변수의 값을 제어하는 식(증가/감소). 보통 ++ 나 -- 를 쓰지만 i+=3 과 같이 식을 쓰는 경우도 있다. 초기화 식과 마찬가지로 식이 여러 개일 경우 콤마( , )로 구분한다. 조건식이 생략된 경우 무한루프가 된다. 초기화, 조건식, 증감식은 모두 필요하지 않으면 생략할 수 있다. 3가지 전부 생략하면 무한루프가 된다. |
for 문은 조건식이 참인동안 블록 { } 안을 반복해서 수행된다. 조건문이 거짓인 경우 for 문을 빠져나온다
for 문도 if 문처럼 중첩이 가능하다.
위의 반복문은 i 는 1 로 초기화되고 1 씩 증가해서 5 보다 작거나 같을 때까지 for 문 블럭 { } 안에 있는 print 문을 실행할 것이다.
i 가 6 이 되면 for 문의 조건식이 false 가 되기 때문에 print 문을 실행하지 않고 for 문을 빠져나간다.
■ 중첩 for문
for 문안에 또 다른 for 문이 있는 것을 말한다. 2개가 중첩되어 있을 경우 이중 for 문, 3개가 중첩될 때는 삼중 for 문이라고 하는 데 3개 이상은 복잡해서 잘 쓰이지 않는다. 보통 행렬을 표현할 때 많이 사용한다.
위의 반복문은 i 가 행이 되고 j 가 열이 되어 5x5 행렬의 행과 열을 출력한다.
■ 향상된 for문
for(타입 변수명 : 배열 or 컬렉션){
//반복할 문장
}
타입은 배열 이나 컬렉션 요소의 타입과 같아야 한다. 배열 이나 컬렉션 에 저장된 값을 매 반복마다 하나씩 순서대로 읽어와서 변수에 저장한다. 반복문 { } 내에서는 이 변수를 이용해서 코드를 작성한다. 향상된 for 문은 일반 for 문과 달리 배열 이나 컬렉션 컬렉션 에 저장된 값을 읽어오는 용도로만 사용할 수 있다.
배열 인 arr 의 내용을 하나씩 읽어와서 tmp 에 저장한다.
print 문을 이용해서 하나씩 출력했다.
while문
while(조건식){
// 조건식의 연산결과가 참(true)인 동안 반복될 문장
}
while 은 if 문과 달리 조건식이 참 인동안 블럭 { } 내의 문장들을 반복하다 조건식이 거짓 이 되면 while 문을 빠져나간다. while 문은 초기화 식이나 증감 식이 없기 때문에 반복문을 제어할 문장이 필요하다면 while 문 외부나 while{ } 안에 추가로 넣어주어야 한다. 조건식을 true 로 하면 무한루프가 된다.
아까 for 문에서 나온 예시를 while 문으로 바꿨다. 초기화 식을 while{ } 안에 넣으면 매번 초기화되어서 반복문을 빠져나오지 못하게 되므로 외부에 선언했고, 반복문을 제어할 증감식이 필요해서 while{ } 내부에 i++ 를 넣었다.
위의 예시는 i 가 1 씩 증가되며 print문으로 출력되다가 i 가 6 이되면 while 문을 빠져나오게 된다.
결과값이 동일한 것을 확인할 수 있다.
이처럼 if 문과 while 문은 서로 변환이 가능하다.
■ do-while문
do{
//조건식의 연산결과가 참일 때 수행될 문장
}while(조건식);
do-while 은 while 이 변형된 형태이다. while 은 조건식을 따지고 나서 반복할지 말지 결정하는 반면에 do-while 은 먼저 do{ } 안의 내용들을 실행한 다음에 조건식을 따진다. 그래서 while 문은 조건식에 따라서 한 번도 수행되지 않을 수 있지만 do-while 문은 무조건 최소 1번은 수행된다.
위의 코드는 어떻게 될까? 또한 i 값은 몇이 될까?
while 은 조건식의 결과가 false 이기 때문에 while{ } 의 내용을 한 번도 실행하지 않고 빠져나왔다.
반면에 do-while 은 조건식이 false 지만 do{ } 내용을 최소 1번은 수행하기 때문에 do{ } 의 내용대로 print 문이 실행되고 i 에서 1 이 감소되어 do-while 이 끝나고 i 를 출력했을 때 0 이 출력된다.
break문
반복문도 break 문을 사용해서 반복문 바깥으로 벗어날 수 있다. break 문은 자신이 포함된 가장 가까운 반복문을 벗어난다. 특정 조건을 만족하면 반복문을 벗어나는 식으로 많이 사용된다.
continue문
continue 문은 반복문 내에서만 사용될 수 있다. 반복이 진행되는 도중에 continue 문을 만나면 반복문의 끝으로 이동하여 다음 반복으로 넘어간다. for 의 경우 증감식으로 이동하며, while 문과 do-while 문의 경우 조건식으로 이동한다. 전체 반복 중에 특정 조건을 만족하는 경우를 제외하고 싶을 때 많이 사용한다.
+ 이름 붙은 반복문
break 문은 근접한 단 하나의 반복문만 벗어날 수 있기 때문에 하나이상의 반복문을 벗어날 때 사용한다. 반복문 앞에 이름 : 을 붙여주고 break 이름; 이나 continue 이름; 처럼 사용하면 된다.
'Back end > Java' 카테고리의 다른 글
[Java] 변수(Variable)와 메서드(Method) (0) | 2019.06.17 |
---|---|
[Java] 객체지향 언어, 클래스(Class)와 객체(instance) (0) | 2019.06.11 |
[Java] 배열(Array) (0) | 2019.06.04 |
[Java] 연산자(Operator) (0) | 2019.05.21 |
[Java] 변수(Variable) (0) | 2019.05.20 |