🟨 목 차 🟨
1. if, else if 조건문
2. switch 조건문
3. for / while 반복문
3-1. while
3-2. do-while
3-3. for
3-4. label
◼️ 1. if, else if 조건문 ◼️
if문은 보통 두가지 이상의 값을 비교하거나, 단순히 true, false 여부만 확인하고자 할 때 많이 사용된다.
if 다음에는 반드시 소괄호를 열고 닫아야 하며, 이 소괄호 안에는 boolean 형태의 결과가 있어야 한다.
또한 소괄호 안의 결과가 true 일 때 처리하는 처리문장과 세미콜론이 온다.
if문 안에는 || 이나 && 같은 논리 연산자를 쓸 수 있다.
if 문 다음에 또 다른 조건문인 else if문을 이용해서 조건을 추가할 수 있고 마지막 조건에서는 else를 이용해 그 외 모든 경우의 수에 대한 것을 따질 수 있다.
if문은 쉽기 때문에 생략하겠다.
◼️ 2. switch 조건문◼️
학점이나 이자 계산 같이 하나의 값이 여러 범위에 걸쳐 비교되어야 할 때에는, 하나의 값으로 분기하여 비교하는 switch 문을 사용하는것이 좋다.
switch문장의 작성 순서
- 가장 첫 줄에는 switch(비교대상변수)라고 명시한 후 중괄호를 시작한다. 여기서 비교대상변수는 long을 제외한 정수형과 몇몇 특별한 타입만 들어갈 수 있다. [여기서 중골호는 if 문장처럼 생략하면 절대 안된다.]
- 중괄호 안에는 "case 점검값 : "이 오거나. "default:"이 나와야만 한다. 만약 이 case 문장이 없으면 switch문을 쓸 필요가 없기 때문에 반드시 있어야 한다. 그리고, 각 case를 마무리 하고 싶다면 "반드시 break;"를 추가해야한다.
- 모든 조건이 끝나면 중괄호를 닫는다.
[EX]
package Part6;
public class ControlSwitch {
public static void main(String[] args) {
ControlSwitch exam = new ControlSwitch();
exam.switchStatement(1);
exam.switchStatement(2);
exam.switchStatement(3);
exam.switchStatement(4);
exam.switchStatement(5);
exam.switchStatement(6);
}
public void switchStatement(int nuberOfWheel) {
switch (nuberOfWheel) {
case 1:
System.out.println(nuberOfWheel+":It is one foot bicycle.");
break;
case 2:
System.out.println(nuberOfWheel+":It is motor cycle or bicycle.");
break;
case 3:
System.out.println(nuberOfWheel+":It is a three wheel car.");
break;
case 4:
System.out.println(nuberOfWheel+":It is a car.");
break;
default:
System.out.println(nuberOfWheel+":It is an expensive car.");
break;
}
}
}
1:It is one foot bicycle.
2:It is motor cycle or bicycle.
3:It is a three wheel car.
4:It is a car.
5:It is an expensive car.
6:It is an expensive car.
여기서 다른것은 다 이해하기 쉬울것인데 default:라는 것이 조금 애매할 것이다. default:는 앞에 있는 조건에 맞지 않는 경우에 수행이 된다.
해당하는 case문을 그만두기 위해선 break문을 꼭 쓰자.
특정 조건에 따른 처리를 해야 할 것우 case문의 경우는 순서에 상관 없지만 가독성을 위해 순서를 지켜주자.
또한 default:를 중간에 넣으면 안되냐고 물어보는데 중간에 넣으면 원하지 않은 결과가 나올 수 있으므로 맨 뒤에 넣는 것을 권장한다.
또한 switch문의 활용으로서 아래와 같은 달력이라던지 이런 경우에 switch문을 사용하면 좋다.
[EX]
package Part6;
public class ControlOfFlow {
public static void main(String[] args) {
ControlOfFlow exam = new ControlOfFlow();
exam.switchCalender(2);
}
public void switchCalender(int month) {
switch(month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
System.out.println(month + " has 31 days.");
break;
case 4:
case 6:
case 9:
case 11:
System.out.println(month + " has 30 days.");
break;
case 2:
System.out.println(month + " has 28 or 29 days.");
break;
default :
System.out.println(month + " is not a month.");
break;
}
}
}
◼️ 3. for / while 반복문 ◼️
반복문이라는 것은 말 그대로 지정한 횟수만큼 반복하거나, 조건에 맞을 때 까지 반복하는 문장을 말한다.
우리가 1부터 10까지 더해야 하는 경우가 있다고 하면 아래의 코드를 작성할 수 있다.
int sum =1+2+3+4+5+6+7+8+9+10;
하지만 1000이나 100000까지의 값을 더할때는 위의 방법을 이용할 수 없다.
==> 이럴때 사용하는 것이 바로 반복문이다.
우선 while 문을 알아보자.
while 후에 오는 소괄호 안에는 boolean 조건이 있어야 한다. 그리고 그 boolean 조건 값이 true일 경우에만 중괄호 안에 있는 내용들이 수행된다.
만약, 처음부터 소괄호 안에 있는 조건 결과 값이 false인 경우에는 아예 while 문장이 수행되지 않는다.
if와 while은 비슷해보이지만 큰 차이가 있다.
가장 큰 차이는 if문장은 중괄호가 끝나면 그 다음 아래줄로 넘어가지만,
while 반복문은 중괄호가 끝난 이후에 다시 위로 올라가 boolean 조건을 확인을 하고 이 값이 true 이면 중괄호 안의 내용이 계속 실행이 된다.
[EX]
package Part6;
public class ControlWhile {
public static void main(String[] args) {
ControlWhile exam = new ControlWhile();
exam.whileLoope();
}
public void whileLoope() {
int loop = 0;
while (loop< 12) {
loop++;
ControlOfFlow exam = new ControlOfFlow();
exam.switchCalender(loop);
}
}
}
1 has 31 days.
2 has 28 or 29 days.
3 has 31 days.
4 has 30 days.
5 has 31 days.
6 has 30 days.
7 has 31 days.
8 has 31 days.
9 has 30 days.
10 has 31 days.
11 has 30 days.
12 has 31 days.
while의 조건인 loop의 값이 12보다 커지면 멈추게 된다.
내가 원하는 조건이나 부분에서 문장을 빠져 나오고 싶으면 원하는 곳에서 break를 사용하여 빠져 나오면 된다.
또한 break 말고 문장을 건너뛰기 위해서 사용할 수 있는 예약어가 있는데 continue 이다.
==> 즉, contune를 사용하면 해당하는 조건이나 부분을 뛰어넘고 다음 부분을 실행시킨다고 생각하면 된다.
break와 continue는 정말 조심히 사용해야한다. 예를 들어 설명하겠다.
[EX]
public void whileContinueInfinit() {
int loop = 0;
while (loop< 12) {
if(loop==6) continue;//증가 값이 없으므로 6에 계속 무한 루프를 시전한다.
loop++;
ControlOfFlow exam = new ControlOfFlow();
exam.switchCalender(loop);
}
}
1 has 31 days.
2 has 28 or 29 days.
3 has 31 days.
4 has 30 days.
5 has 31 days.
6 has 30 days.
결과값은 6월 결과까지 나온 후 커맨드 창이 응답을 안한다. 왜냐하면 무한루프에 걸렸기 때문이다.
이해하기 쉽게 설명하자면 while의 조건은 loop가 12보다 작을때 무한으로 돈다.
그 와중에 loop의 값이 6일때는 continue 이 값을 빼고 다음값으로 가야한다. 여기서 loop의 값을 증가시키는 값이 없기 때문에 다음값(7)으로 가지 못하기 때문에 무한루프에 걸린다. 이것을 제대로된 코드로 짜본다면 아래의 코드가 될 것이다.
[ loop를 증가시키는 위치를 continue 앞에 놓았기 때문에 값이 정상적으로 증가해지기 때문에 정상적인 코드가 된다. ]
public void whileContinueInfinit() {
int loop = 0;
while (loop< 12) {
loop++;
if(loop==6) continue;//증가 값이 없으므로 6에 계속 무한 루프를 시전한다.
ControlOfFlow exam = new ControlOfFlow();
exam.switchCalender(loop);
}
}
do-while문에 대해서 알아보자.
do-while문은 적어도 한 번은 반복 문장이 실행된다. (while문은 조건에 한번도 맞지 않으면 한번도 실행되지 않지만, do-while 문은 "한번은 꼭 실행시키고 싶을 때 사용"한다.
중요한 것은 do-while문을 사용할 시 while의 소괄호 뒤에 세미콜론을 반드시 입력해주 주어야 한다는 것이다. (세미콜론 없으면 컴파일 안됨)
break, continue도 여기서 사용 가능하다.
while문과 거의 비슷하다는 것이다.
[EX]
package Part6;
public class ControDoWhile {
public static void main(String[] args) {
ControDoWhile exam = new ControDoWhile();
exam.doWhile();
}
public void doWhile() {
ControlOfFlow exam = new ControlOfFlow();
int loop=0;
do {
loop++;
exam.switchCalender(loop);
} while(loop<12);
}
}
1 has 31 days.
2 has 28 or 29 days.
3 has 31 days.
4 has 30 days.
5 has 31 days.
6 has 30 days.
7 has 31 days.
8 has 31 days.
9 has 30 days.
10 has 31 days.
11 has 30 days.
12 has 31 days.
while 루프의 경우 잘못 사용하면 우리가 임의로 중지 시키지 않으면 멈추지 않는 무한 루프에 빠지기 싶다.
==> 그래서 for 루프 사용을 추천한다.
for 루프의 각각의 문장 사이에는 세미콜론을 적어 주어야만 한다. (즉, 기본적인 for 루프를 사용할 때는 두 개의 세미콜론이 소괄호 안에 있어야만 한다. 예외적인 부분도 있긴하다.)
말보다는 예시를 보면서 이해를 해보도록 하자.
[EX]
package Part6;
public class ControlFor {
public static void main(String[] args) {
ControlFor exam = new ControlFor();
exam.forLoop(10);
}
public void forLoop(int until) {
int sum =0;
for(int loop=1; loop<=until; loop++) {
sum +=loop; // sum = sum + loop 이 코드와 같다.
}
System.out.println("1 to " + until + "= " + sum );
}
}
위의 코드를 순차적으로 설명을 하겠다.
- until 이라는 값을 forLoop의 매개변수로 받았다.
- 1 부터 until까지의 합을 저장하는 sum이라는 int를 정의하였다.
- for 루프에서는 loop라는 값을 1부터 until까지 1씩 증가하도록 했다.
- for 루프가 반복되면서 증가되는 loop으 값을 sum에 더한다. for 루프의 loop의 값이 until(10) 을 넘으면 for 루프는 종료된다.
- sum 값을 출력한다.
많이 사용하지 않는 label에 대해 알아보자
label은 하나의 반복 루프가 있을때는 필요없고, 두 개 이상의 for나 while 루프가 있을 때 사용된다.
일단 2개 이상의 루프를 사용하여 구구단 코드를 완성하여 보자.
package Part6;
public class CotrolLabel {
public static void main(String[] args) {
CotrolLabel exam = new CotrolLabel();
exam.printTimesTable();
}
public void printTimesTable() {
for(int level=2 ; level<10; level++) {
for(int unit=1; unit<10; unit++ ) {
System.out.println(level + "*" + unit + "="+level*unit);
}
System.out.println();
}
}
}
5*3=15
5*4=20
5*5=25
5*6=30
5*7=35
5*8=40
5*9=45
6*1=6
6*2=12
6*3=18
6*4=24
6*5=30
6*6=36
6*7=42
6*8=48
6*9=54
7*1=7
7*2=14
7*3=21
7*4=28
7*5=35
7*6=42
7*7=49
7*8=56
7*9=63
8*1=8
8*2=16
8*3=24
8*4=32
8*5=40
8*6=48
8*7=56
8*8=64
8*9=72
9*1=9
9*2=18
9*3=27
9*4=36
9*5=45
9*6=54
9*7=63
9*8=72
9*9=81
위의 구구단 코드에서 4단을 출력하지 않으려고 한다. 어떻게 할 까?
==> 많은 방법이 있다.
우선 첫번째 방법은 아래의 결과와 같이 공백이 생긴다.
[EX]
package Part6;
public class CotrolLabel {
public static void main(String[] args) {
CotrolLabel exam = new CotrolLabel();
exam.printTimesTable();
}
public void printTimesTable() {
for(int level=2 ; level<10; level++) {
for(int unit=1; unit<10; unit++ ) {
if(level==4 || unit==4) continue;
System.out.print(level + "*" + unit + "="+level*unit+ " ");
}
System.out.println();
}
}
}
2*1=2 2*2=4 2*3=6 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18
3*1=3 3*2=6 3*3=9 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27
5*1=5 5*2=10 5*3=15 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45
6*1=6 6*2=12 6*3=18 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54
7*1=7 7*2=14 7*3=21 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63
8*1=8 8*2=16 8*3=24 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72
9*1=9 9*2=18 9*3=27 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
두번째 방법은 if문을 밖으로 빼 내면 된다.
[EX]
package Part6;
public class CotrolLabel {
public static void main(String[] args) {
CotrolLabel exam = new CotrolLabel();
exam.printTimesTable();
}
public void printTimesTable() {
for(int level=2 ; level<10; level++) {
if(level==4) continue;
for(int unit=1; unit<10; unit++ ) {
if(unit==4) continue;
System.out.print(level + "*" + unit + "="+level*unit+ " ");
}
System.out.println();
}
}
}
2*1=2 2*2=4 2*3=6 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18
3*1=3 3*2=6 3*3=9 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27
5*1=5 5*2=10 5*3=15 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45
6*1=6 6*2=12 6*3=18 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54
7*1=7 7*2=14 7*3=21 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63
8*1=8 8*2=16 8*3=24 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72
9*1=9 9*2=18 9*3=27 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
여기서 더 심화해서 System.out.println(); 문장을 거치지 않고 level을 사용하는 for 루프로 바로 가려고 하면 어떻게 해야 할까?
==> label을 사용하면 된다. 바로 예시로 알아보자.
[EX] (label을 사용하지 않은 예)
package Part6;
public class CotrolLabel {
public static void main(String[] args) {
CotrolLabel exam = new CotrolLabel();
exam.printTimesTable();
}
public void printTimesTable() {
startLabel:
for(int level=2 ; level<10; level++) {
for(int unit=1; unit<10; unit++ ) {
if(unit==4) continue ;
System.out.print(level + "*" + unit + "="+level*unit+ " ");
}
System.out.println();
}
}
}
2*1=2 2*2=4 2*3=6 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18
3*1=3 3*2=6 3*3=9 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27
4*1=4 4*2=8 4*3=12 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36
5*1=5 5*2=10 5*3=15 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45
6*1=6 6*2=12 6*3=18 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54
7*1=7 7*2=14 7*3=21 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63
8*1=8 8*2=16 8*3=24 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72
9*1=9 9*2=18 9*3=27 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
[EX] (label을 사용한 예)
package Part6;
public class CotrolLabel {
public static void main(String[] args) {
CotrolLabel exam = new CotrolLabel();
exam.printTimesTable();
}
public void printTimesTable() {
startLabel:
for(int level=2 ; level<10; level++) {
for(int unit=1; unit<10; unit++ ) {
if(unit==4) continue startLabel;
System.out.print(level + "*" + unit + "="+level*unit+ " ");
}
System.out.println();
}
}
}
2*1=2 2*2=4 2*3=6 3*1=3 3*2=6 3*3=9 4*1=4 4*2=8 4*3=12 5*1=5 5*2=10 5*3=15 6*1=6 6*2=12 6*3=18 7*1=7 7*2=14 7*3=21 8*1=8 8*2=16 8*3=24 9*1=9 9*2=18 9*3=27
결과를 보게 되면 label을 지정해준 조건에서 올라가기 때문에 그 이후의 루프 내의 문장은 전혀 수행이 되지 않는다.
즉, for 루프를 두 개 이상 쓰거나, while 루프를 두 개 이상 사용할 경우 바깥쪽 루프의 시작점으로 이동하려고 할 때 label을 사용하면 좋다. [ 즉, for 루프를 두 개 이상 쓸 때 아래쪽에 있는 for 루프에서 다시 맨 처음 for 루프를 가기 위해서 쓴다고 생각하면 된다.
예를 들어 for 루프를 두 개 쓴다고 가정을 하자. for 루프 두 개를 위쪽에 있는 for 루프, 아래쪽에 있는 for 루프라고 칭하겠다.
아래쪽에 있는 for 루프에서 continue를 사용해봤자 continue 조건에 해당하는 값을 뛰어넘고 아래쪽에 있는 for 루프에서 수행된다.
하지만 나는 아래쪽에 있는 루프가 아닌 위쪽에 있는 for 루프로 올라가고 싶은데 말이다. 이럴때 사용하는 것이 label이다. ]
사실 Label을 이용하려는 목적과 for 루프가 두 개 이상 쓸 때 아래에 있는 for문에서 break를 쓴다면 위에 있는 for문으로 돌아가기 때문에 차이가 없는 것 같다..
'JAVA > 자바의신 1' 카테고리의 다른 글
8장 참조 자료형에 대해서 더 자세히 알아보자. (0) | 2022.09.06 |
---|---|
7장 여러 데이터를 하나에 넣을 수는 없을까?(배열) (0) | 2022.09.03 |
5장 계산을 하고 싶어요 (0) | 2022.09.03 |
4장 정보를 어디에 넣고 싶은데? (1) | 2022.09.02 |
3장 자바를 제대로 알려면 객체가 무엇인지 알아야 한다. (0) | 2022.09.02 |