< 5일차 수업 >
오늘은 조건문과 반복문에 대해 배웠다 !
if(else if - else) / switch-case / while(do-while) / for
1. if(else if - else)
if (조건식) {
실행 영역
} else if (조건식) {
실행 영역
} else {
실행 영역
}
if 문은 말그대로 "만약에 ~라면"으로 시작한다. 조건식이 참일 경우 { } 영역이 실행된다. 그러나 조건식이 거짓이라면 { } 영역이 실행되지 않는다. if-else if 문은 : 예를들어 if - else if - else 형태의 코드가 있을 때 if 가 참이었다면, 나머지 else if - else 의 { } 코드를 생략한다.
- if 문은 실행영역의 코드가 하나일 경우 { }를 생략할 수 있다.
- if 문은 반드시 else 로 끝나야 하는 것은 아니다. if - else if 로 끝날 수도 있고, if 만 있을 수도 있다. else 만 있는 건 안된다.
- if 문의 중첩 시 보기 편하게 짜는 것이 권장된다. ( 실행 코드가 하나일 경우 {}를 생략할 수 있다는 점을 활용한다.)
한편 if 문과 유사한 조건 연산자로, 3항 연산자가 있다.
(조건식)? a : b
조건식이 참이면 a가 반환되고, 거짓이면 b가 반환된다. 매우 당연하게도 a, b의 형태는 이 3항 연산자가 어떤 자료형으로 선언된 변수인지에 달려있다.
예를 들면,
int a = (3>2) ? 3:0;
String b = (5>4) ? "정답" : "멍충이";
/* 결과
3
정답
*/
a와 b가 어떤 자료형으로 선언되었는지에 따라서 true/false일 때 반환되는 값들의 형태가 달라진다.
또한, 3항 연산자라고 해서 무조건 각각에 단순한 항만 넣어야 되는 게 아니다.(사실 내가 착각함ㅋ) 조건식에도, a와 b의 위치에도 식이 들어갈 수 있다. 여기서 식은 if문 같은 복합적인 식 말고 단순 연산같은 식을 말한다.
예를 들면,
(num1 > num2) ? (num1 - num2) : (num2-num1);
(a > b) ? a : (b : c) ? b : c;
이처럼 각각의 차리에는 단순 연산식들이 들어갈 수 있다 ! ! 3항 연산자의 중첩이라고 지칭한다. 음.. 나는 if문 중첩을 알고 있으니 저 이름이 더 직관적으로 쉽게 이해될거라 생각했다.
2. switch-case
switch(n) {
case 1:
...
case 2:
...
.
.
default :
...
}
case와 default는 레이블이라고 한다. 그니까, 읽다 만 도서에 끼워놓는 라벨처럼 단지 시작 위치를 가리키는 것이다.
swith 문은 n이 가리키는 case n번부터 시작해서 break를 만날때까지 계속 진행된다. (요거시 핵심이다)
그러니까, break가 없으면 default까지 쭉 진행되는거고, 각각의 case에 break가 있으면 해당 case만 진행하고 빠져나온다.
case는 그냥 n에 해당할 때 시작할 코드 위치일 뿐이다. 따라서 내용이 같은 case를 묶는 것도 가능하고(짝수/홀수 case로 묶기 등), 무조건 case 번호대로 나열해야되는 것도 아니다. 다만 묶이는 case가 많을수록 가장 위에 배치해서, 조금이라도 컴퓨터의 처리 성능을 높이는 것도 좋다고 하셨다(많은 case가 얽혀있을 수록 위에서 해결된다면 아래 코드를 진행할 필요도 없으니까).
아래 달력 예제를 참조한다.
package lecture;
public class Lecture05 {
public static void main(String[] args) {
int month = 12;
int days = 0; //초기화. 0으로 초기화 안해주면 default에 걸릴 경우 days 값이 정해지지 않게 됨 = 에러발생
switch(month){
case 1: case 3: case 5: case 7: case 9:case 11:
days = 31;
break;
case 4: case 6: case 8: case 10: case 12:
days = 30;
break;
case 2 : //case 2를 왜 여기에 배치했을까?
//많이 걸리는 case를 전진 배치해서 성능 최적화 최대한 앞에서 바로 걸러지라고.
days = 28;
break;
default:
System.out.println("X");
break;
}
System.out.println(month + " 의 말일은 " + days + " 입니다." );
}
}
if문과 switch문은 조건문으로, while문과 for문은 반복문으로 분류된다.
웨냐면 ㅡ if문과 switch문은 조건에 맞으면 {} 내용을 한번 진행하는 거고, 다음의 while문과 for문은 조건에 맞으면(조건을 만족하는 동안) 코드가 "반복" 되기 때문이다.그니까 음.. 강조점이 다르다. if문과 switch문은 조건에 부합할 때만 역할을 수행하고, while문과 for문은 조건이 부합하는 동안 역할을 반복 수행한다.
3. while(do-while)
while(반복조건){
실행 영역
}
---------------------
do{
실행 영역
}while(반복조건);
while문은 반복 조건을 먼저 검사하고, 조건이 true 일 때(동안), {} 의 내용이 계속 실행된다.
do-while문은 {} 영역을 먼저 실행한 후 while의 반복조건이 검사된다. 반복조건이 참이라면, 다시 {}내용이 계속 실행된다.
즉, 두 while문의 차이는 반복조건검사가 먼저 실행되는지의 여부이다. 조건이 참인 동안 { } 영역의 코드는 계속 재실행된다.
- while : 선조건검사 & 후실행
- do-while : 선실행 & 후조건검사
4. for
for(int i = 0; i < n; i++) {
실행 영역
}
while 문은 반복조건에 사용되는 변수의 초기화를 while 바깥에서 선언해줘야 한다. 하지만 for문은 반복조건에 사용되는 변수를 조건식에서 바로 초기화 할 수 있다. 할 수 있다는 거지 반드시 for문 괄호 안에서 초기화 해야된다는 것은 아니다.
int i = 0을 초기화식, i<n을 조건식, i ++를 증감식이라고 하며, for문은 초기화식 - 조건식 - 실행영역 - 증감식 순으로 진행된다. 초기화식은 for문이 실행되는 처음에만 작동하고, 그다음부터는 조건식을 만족하지 못할때까지 나머지 부분들을 반복한다.
+) 오늘 예제를 풀면서 든 생각
package lecture;
public class Lecture05 {
public static void main(String[] args) {
int n = 0; //합계를 저장할 변수
//1부터 100까지의 합 구하기
for(int i = 1; i <= 100; i++) {
n = n + i;
}
System.out.println(n);
}
}
package lecture;
public class lecture05 {
public static void main(String[] args) {
//3개의 정수 중 max 값 구하기.
int a = 10; b = 5;, c = 8; //a,b,c에 할당한 값은 계속 바꿔가면서 테스트
int max = a; // 임시로 max 값을 a로 할당
if (b > max)
max = b; //a였던 max 값이 b보다 작으므로, max값을 b로 바꾼다.
if (c > max)
max = c; //b였던 max 값이 b보다 작으므로, max값을 c로 바꾼다.
System.out.println(max);
}
}
위의 코드들은 모두 연산이 연쇄적으로 이루어 지고 있다.
첫 코드는 연이은 수와 더해가고 그 총합을 구하는 연산이고, 두번째 코드는 메모리 공간에 저장된 값을 연이어서 바꾸면서 비교하는 연산이다. 두 코드를 검토하면서 이렇게 피연산자들이 이어지는 형태의 코드를 짤 때는 따로 0으로 초기화 한 변수에다가 저장해가면서 연산을 진행하는게 더 쉽고 깔끔하겠다는 생각을 했다. (+= 연산자처럼)
그리고 로직 짜는게,, 연산자 특성이나 if, for 등등 각각의 특성을 고려하면서 하려니까 상당히 어려웠다. 하루 빨리 많이 다뤄서 익숙해지고 아는게 많아 지기를 ... 그래서 원하는 대로 코드를 바로바로 짤 수 있었으면 .... ☆
'study_java > java_수강정리(~10.29)' 카테고리의 다른 글
[JAVA]7일차 (0) | 2020.05.19 |
---|---|
[JAVA]6일차 (0) | 2020.05.19 |
[JAVA]4일차 (0) | 2020.05.15 |
[JAVA]3일차 (0) | 2020.05.13 |
[JAVA]1일차 + 2일차 (0) | 2020.05.12 |