반복문 / 제어문 생각할 점
1.조건을 지정한다. 어떻게 조건을 지정해야할까?
2.인덱스를 쓸거냐 안쓸거냐에 따라 while문을 쓸지 for문을 쓸지 결정한다. 그리고 인덱스의 범위에 주의한다.
3.상태유지를 할거냐 안할거냐(저장변수필요)를 결정한다.
4.제어의 흐름을 어떻게 제어 할 것인가
1.while문 탈출
1.2 탈출 오목판 만들기
아래의 예시는 오목판의 조건에 부합하지 않을 때 탈출하는 프로그램인데, if문의 break와 while문이 결합됐다. 이 둘의 결합와 흐름을 파악하는데 좋은 예시다. 예시를 익혀보며, if문의 break와 while문이 함께 쓰였을 때 어떻게 흐름이 잡히는 지 익혀보자.
import java.util.Scanner;
public class OmokProgram {
public static void main(String[] args) {
for (int j = 0; j < 12; j++) {
for (int i = 0; i < 12; i++)
if ((i == 0) && (j == 0))
System.out.print("┌");
else if ((i == 11) && (j == 11))
System.out.print("┘");
else if ((i == 0) && (j == 11))
System.out.print("└");
else if ((i == 11) && (j == 0))
System.out.print("┐");
else if (j == 0)
System.out.print("┬");
else if (j == 11)
System.out.print("┴");
else if (i == 0)
System.out.print("├");
else if (i == 11)
System.out.print("┤");
else
System.out.print("┼");
System.out.println();
}
while (true) {
Scanner scan = new Scanner(System.in);
int ox = 0;
int oy = 0;
System.out.println("그만두기 -1 0");
System.out.println("(x sp y):");
ox = scan.nextInt();
oy = scan.nextInt();
// ox혹은 oy의 값이 -1일경우 while문을 벗어난다.
if(ox==-1 ||oy ==-1) {
System.out.println("good bye");
break;
}
while (!((1 <= ox && ox <= 10) && (1 <= oy && oy <= 10))) {
//ox와 oy가 범위를 벗어났을 때 다시 입력하는 곳으로 이동한다.
System.out.println("오목 좌표의 범위(-1 or 1~10)를 벗어났습니다.");
System.out.println("그만두기 -1 0");
System.out.println("(x sp y):");
ox= scan.nextInt();
oy= scan.nextInt();
if(ox==-1 ||oy ==-1) {
System.out.println("good bye");
break;
}
}
for (int j = 0; j < 12; j++) {
for (int i = 0; i < 12; i++)
if ((i == 0) && (j == 0))
System.out.print("┌");
else if ((i == 11) && (j == 11))
System.out.print("┘");
else if ((i == 0) && (j == 11))
System.out.print("└");
else if ((i == 11) && (j == 0))
System.out.print("┐");
else if (ox == i && oy == j)
System.out.print("●");
else if (j == 0)
System.out.print("┬");
else if (j == 11)
System.out.print("┴");
else if (i == 0)
System.out.print("├");
else if (i == 11)
System.out.print("┤");
else
System.out.print("┼");
System.out.println();
}
}
}
}
2.do while문
왜 쓰지??
무한으로 조건을 확인하기위해 쓴다. 예를들어 오목의 좌표가 0보다 크고 10보다 작은 값을 넣는 유효성 검사를 해야한다면, do while문을 무한으로 써서 유효성 검사를 한다. 유효성 검사는 조건문을 통해 검사한다. 그러면 조건문인 if문을 써도 되지 않을까? do while문은 하나의 코드블록으로 if문과 달리 조건문을 무한 시행할 수 있다.(무제한 조건을 걸기위해선 if문은 무한대로 if문을 만들어야한다.) 또한 조건문에서 중복되는 코드를 do{ }에 입력하여 코드의 중복을 막아 유지보수에 보다 효율적이다.
1.무한으로 조건 확인
2.코드의 중복을 막아 유지보수에 효율적이다.
2.1 10x10 오목판 탈출하기
앞선 10x10 오목판 탈출하기를 do while문을 써서 코드를 작성해보자. do while문이 while문을 썼을 보다 코드가 간결해지고, 코드의 중복이 사라지는 걸 확인할 수 있다.
package com.newlecture.app.ex6.control.loop;
import java.util.Scanner;
public class OmokProgramVer2 {
public static void main(String[] args) {
//10x10 오목판 두기 ver3(조건에 따라 탈출하기)
for(int j=0; j<12; j++) {
for(int i=0; i<12; i++)
if((i==0)&&(j==0))
System.out.print("┌");
else if((i==11)&&(j==11))
System.out.print("┘");
else if((i==0)&&(j==11))
System.out.print("└");
else if((i==11)&&(j==0))
System.out.print("┐");
else if(j==0)
System.out.print("┬");
else if(j==11)
System.out.print("┴");
else if(i==0)
System.out.print("├");
else if(i==11)
System.out.print("┤");
else
System.out.print("┼");
System.out.println();
}
while(true) {
Scanner scan = new Scanner(System.in);
int ox = 0;
int oy = 0;
do {
System.out.println("그만두기 -1 0");
System.out.println("(x sp y):");
ox = scan.nextInt();
oy = scan.nextInt();
if(ox==-1 || oy==-1) {
System.out.println("안녕");
return; //do while문에는 break대신에 return을 쓴다.
}
if(!((1<=ox&&ox<=10) && (1<=oy&&oy<=10)))
System.out.println("오목 좌표의 범위(-1 or 1~10)를 벗어났습니다.");
} while (!((1<=ox&&ox<=10) && (1<=oy&&oy<=10)));
for(int j=0; j<12; j++) {
for(int i=0; i<12; i++)
if((i==0)&&(j==0))
System.out.print("┌");
else if((i==11)&&(j==11))
System.out.print("┘");
else if((i==0)&&(j==11))
System.out.print("└");
else if((i==11)&&(j==0))
System.out.print("┐");
else if(ox==i && oy==j)
System.out.print("●");
else if(j==0)
System.out.print("┬");
else if(j==11)
System.out.print("┴");
else if(i==0)
System.out.print("├");
else if(i==11)
System.out.print("┤");
else
System.out.print("┼");
System.out.println();
}
}
}
}
3.switch문
메뉴는 무조건 switch 제어구조를 떠올려라.
왜 쓰지?
모든 조건문을 순차적으로 따르지 않고 특정 조건문만 따르기 위해 사용한다. if를 통해서도 조건에 따른 문장을 수행할 수 있다. 하지만, if else문은 '순차적'으로 진행되게 때문에 만약 내가 원하는 조건 결과문이 100번, 1000번째에 있다면, 앞선 99번, 999번의 조건문을 읽어야 한다는 문제가 생긴다. switch case문은 특정 조건의 조건문만을 수행하여 이를 해결한다.


3.1 break label
아래의 그림과 같이 while,for,switch문이 겹쳐져있는 코드가 있다면 switch문에서 break를 써서 while문을 벗어날 수 없다. 백날 break를 써봤자 switch문을 벗어날 뿐 for문에 머물게 된다. 이런 문제를 해결하기 위해 break label을 활용한다.

아래의 코드는 switch case문과 break label을 익히기 위한 코드다. 제어의 흐름이 쉽지만은 않다. 찬찬히 제어의 흐름을 보면서 익혀보자. 특히 break label이 쓰인 case1:을 주의깊게보자.
public class OmokProgramVer2 {
public static void main(String[] args) {
while (true) {
System.out.println("┌─────────────────────────────┐");
System.out.println("│ Omok Game │");
System.out.println("└─────────────────────────────┘");
System.out.println("1. 게임시작");
System.out.println("2. 도움말");
System.out.println("3. 종료");
System.out.print(">");
Scanner scan = new Scanner(System.in);
int menu = scan.nextInt(); // 오목게임의 메뉴를 받을 것이니 변수명 menu
switch (menu) {
case 1: {
{
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 12; j++)
if (i == 0 && j == 0)
System.out.print("┌");
else if (i == 0 && j == 11)
System.out.print("┐");
else if (i == 11 && j == 0)
System.out.print("└");
else if (i == 11 && j == 11)
System.out.print("┘");
else if (j == 0)
System.out.print("├");
else if (j == 11)
System.out.print("┤");
else if (i == 0)
System.out.printf("┬");
else if (i == 11)
System.out.print("┴");
else
System.out.print("┼");
System.out.println();
} // for i
} // 지역화
GAMEOVER: while (true) {
int ox = -1;
int oy = -1;
do {
System.out.println("그만두기: -1 0");
System.out.print("(x sp y): ");
ox = scan.nextInt();
oy = scan.nextInt();
if (ox == -1) {
System.out.println("★GAME OVER★");
// return; // break이면 do~while문 안에 갇혀버리기 때문에 return으로 강제 종료한다.
break GAMEOVER;
} // if
if (!((1 <= ox && ox <= 10) && (1 <= oy && oy <= 10)))
System.out.println("오목 좌표의 범위(-1 or 1~10)를 벗어났습니다."); // while(true)문 안에서 반복되어야 하지만 조건이
// 달성되어야만 돌아거라서 조건을 따로 한 번 더 걸어줬다.
} while (!((1 <= ox && ox <= 10) && (1 <= oy && oy <= 10))); // ||을 했을 때는 왜 안되는지 생각해보기 //오목조건에 맞아야
// 한다는 뜻이다.
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 12; j++)
if (i == 0 && j == 0)
System.out.print("┌");
else if (i == 0 && j == 11)
System.out.print("┐");
else if (i == 11 && j == 0)
System.out.print("└");
else if (i == 11 && j == 11)
System.out.print("┘");
else if (ox == j && oy == i)
System.out.print("○");
else if (j == 0)
System.out.print("├");
else if (j == 11)
System.out.print("┤");
else if (i == 0)
System.out.printf("┬");
else if (i == 11)
System.out.print("┴");
else if (ox == j && oy == i)
System.out.print("●");
else
System.out.print("┼");
System.out.println();
} // for i
} // while 1
} // case 1
break;
// 2. 도움말
case 2: {
System.out.println("도움말");
break;
// 3. 종료
}
case 3: {
System.out.println("종료");
break;
}
default:
System.out.println("메뉴는 1부터 3까지 밖에 없습니다..");
}// switch
} // while
}// main
}// class
'뉴렉처 > 자바' 카테고리의 다른 글
[뉴렉처/자바] ★배열 2023.06.22 (0) | 2023.06.22 |
---|---|
[뉴렉처/자바] ★배열 2023.06.21 (0) | 2023.06.21 |
[뉴렉처/자바]★반복문과 제어문 2023.06.19 (1) | 2023.06.19 |
[뉴렉처/자바] ★반복문과 제어문 2023.06.16 (0) | 2023.06.16 |
[뉴렉처/자바] ★반복문과 제어문 2023.06.15 (0) | 2023.06.15 |
반복문 / 제어문 생각할 점
1.조건을 지정한다. 어떻게 조건을 지정해야할까?
2.인덱스를 쓸거냐 안쓸거냐에 따라 while문을 쓸지 for문을 쓸지 결정한다. 그리고 인덱스의 범위에 주의한다.
3.상태유지를 할거냐 안할거냐(저장변수필요)를 결정한다.
4.제어의 흐름을 어떻게 제어 할 것인가
1.while문 탈출
1.2 탈출 오목판 만들기
아래의 예시는 오목판의 조건에 부합하지 않을 때 탈출하는 프로그램인데, if문의 break와 while문이 결합됐다. 이 둘의 결합와 흐름을 파악하는데 좋은 예시다. 예시를 익혀보며, if문의 break와 while문이 함께 쓰였을 때 어떻게 흐름이 잡히는 지 익혀보자.
import java.util.Scanner;
public class OmokProgram {
public static void main(String[] args) {
for (int j = 0; j < 12; j++) {
for (int i = 0; i < 12; i++)
if ((i == 0) && (j == 0))
System.out.print("┌");
else if ((i == 11) && (j == 11))
System.out.print("┘");
else if ((i == 0) && (j == 11))
System.out.print("└");
else if ((i == 11) && (j == 0))
System.out.print("┐");
else if (j == 0)
System.out.print("┬");
else if (j == 11)
System.out.print("┴");
else if (i == 0)
System.out.print("├");
else if (i == 11)
System.out.print("┤");
else
System.out.print("┼");
System.out.println();
}
while (true) {
Scanner scan = new Scanner(System.in);
int ox = 0;
int oy = 0;
System.out.println("그만두기 -1 0");
System.out.println("(x sp y):");
ox = scan.nextInt();
oy = scan.nextInt();
// ox혹은 oy의 값이 -1일경우 while문을 벗어난다.
if(ox==-1 ||oy ==-1) {
System.out.println("good bye");
break;
}
while (!((1 <= ox && ox <= 10) && (1 <= oy && oy <= 10))) {
//ox와 oy가 범위를 벗어났을 때 다시 입력하는 곳으로 이동한다.
System.out.println("오목 좌표의 범위(-1 or 1~10)를 벗어났습니다.");
System.out.println("그만두기 -1 0");
System.out.println("(x sp y):");
ox= scan.nextInt();
oy= scan.nextInt();
if(ox==-1 ||oy ==-1) {
System.out.println("good bye");
break;
}
}
for (int j = 0; j < 12; j++) {
for (int i = 0; i < 12; i++)
if ((i == 0) && (j == 0))
System.out.print("┌");
else if ((i == 11) && (j == 11))
System.out.print("┘");
else if ((i == 0) && (j == 11))
System.out.print("└");
else if ((i == 11) && (j == 0))
System.out.print("┐");
else if (ox == i && oy == j)
System.out.print("●");
else if (j == 0)
System.out.print("┬");
else if (j == 11)
System.out.print("┴");
else if (i == 0)
System.out.print("├");
else if (i == 11)
System.out.print("┤");
else
System.out.print("┼");
System.out.println();
}
}
}
}
2.do while문
왜 쓰지??
무한으로 조건을 확인하기위해 쓴다. 예를들어 오목의 좌표가 0보다 크고 10보다 작은 값을 넣는 유효성 검사를 해야한다면, do while문을 무한으로 써서 유효성 검사를 한다. 유효성 검사는 조건문을 통해 검사한다. 그러면 조건문인 if문을 써도 되지 않을까? do while문은 하나의 코드블록으로 if문과 달리 조건문을 무한 시행할 수 있다.(무제한 조건을 걸기위해선 if문은 무한대로 if문을 만들어야한다.) 또한 조건문에서 중복되는 코드를 do{ }에 입력하여 코드의 중복을 막아 유지보수에 보다 효율적이다.
1.무한으로 조건 확인
2.코드의 중복을 막아 유지보수에 효율적이다.
2.1 10x10 오목판 탈출하기
앞선 10x10 오목판 탈출하기를 do while문을 써서 코드를 작성해보자. do while문이 while문을 썼을 보다 코드가 간결해지고, 코드의 중복이 사라지는 걸 확인할 수 있다.
package com.newlecture.app.ex6.control.loop;
import java.util.Scanner;
public class OmokProgramVer2 {
public static void main(String[] args) {
//10x10 오목판 두기 ver3(조건에 따라 탈출하기)
for(int j=0; j<12; j++) {
for(int i=0; i<12; i++)
if((i==0)&&(j==0))
System.out.print("┌");
else if((i==11)&&(j==11))
System.out.print("┘");
else if((i==0)&&(j==11))
System.out.print("└");
else if((i==11)&&(j==0))
System.out.print("┐");
else if(j==0)
System.out.print("┬");
else if(j==11)
System.out.print("┴");
else if(i==0)
System.out.print("├");
else if(i==11)
System.out.print("┤");
else
System.out.print("┼");
System.out.println();
}
while(true) {
Scanner scan = new Scanner(System.in);
int ox = 0;
int oy = 0;
do {
System.out.println("그만두기 -1 0");
System.out.println("(x sp y):");
ox = scan.nextInt();
oy = scan.nextInt();
if(ox==-1 || oy==-1) {
System.out.println("안녕");
return; //do while문에는 break대신에 return을 쓴다.
}
if(!((1<=ox&&ox<=10) && (1<=oy&&oy<=10)))
System.out.println("오목 좌표의 범위(-1 or 1~10)를 벗어났습니다.");
} while (!((1<=ox&&ox<=10) && (1<=oy&&oy<=10)));
for(int j=0; j<12; j++) {
for(int i=0; i<12; i++)
if((i==0)&&(j==0))
System.out.print("┌");
else if((i==11)&&(j==11))
System.out.print("┘");
else if((i==0)&&(j==11))
System.out.print("└");
else if((i==11)&&(j==0))
System.out.print("┐");
else if(ox==i && oy==j)
System.out.print("●");
else if(j==0)
System.out.print("┬");
else if(j==11)
System.out.print("┴");
else if(i==0)
System.out.print("├");
else if(i==11)
System.out.print("┤");
else
System.out.print("┼");
System.out.println();
}
}
}
}
3.switch문
메뉴는 무조건 switch 제어구조를 떠올려라.
왜 쓰지?
모든 조건문을 순차적으로 따르지 않고 특정 조건문만 따르기 위해 사용한다. if를 통해서도 조건에 따른 문장을 수행할 수 있다. 하지만, if else문은 '순차적'으로 진행되게 때문에 만약 내가 원하는 조건 결과문이 100번, 1000번째에 있다면, 앞선 99번, 999번의 조건문을 읽어야 한다는 문제가 생긴다. switch case문은 특정 조건의 조건문만을 수행하여 이를 해결한다.


3.1 break label
아래의 그림과 같이 while,for,switch문이 겹쳐져있는 코드가 있다면 switch문에서 break를 써서 while문을 벗어날 수 없다. 백날 break를 써봤자 switch문을 벗어날 뿐 for문에 머물게 된다. 이런 문제를 해결하기 위해 break label을 활용한다.

아래의 코드는 switch case문과 break label을 익히기 위한 코드다. 제어의 흐름이 쉽지만은 않다. 찬찬히 제어의 흐름을 보면서 익혀보자. 특히 break label이 쓰인 case1:을 주의깊게보자.
public class OmokProgramVer2 {
public static void main(String[] args) {
while (true) {
System.out.println("┌─────────────────────────────┐");
System.out.println("│ Omok Game │");
System.out.println("└─────────────────────────────┘");
System.out.println("1. 게임시작");
System.out.println("2. 도움말");
System.out.println("3. 종료");
System.out.print(">");
Scanner scan = new Scanner(System.in);
int menu = scan.nextInt(); // 오목게임의 메뉴를 받을 것이니 변수명 menu
switch (menu) {
case 1: {
{
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 12; j++)
if (i == 0 && j == 0)
System.out.print("┌");
else if (i == 0 && j == 11)
System.out.print("┐");
else if (i == 11 && j == 0)
System.out.print("└");
else if (i == 11 && j == 11)
System.out.print("┘");
else if (j == 0)
System.out.print("├");
else if (j == 11)
System.out.print("┤");
else if (i == 0)
System.out.printf("┬");
else if (i == 11)
System.out.print("┴");
else
System.out.print("┼");
System.out.println();
} // for i
} // 지역화
GAMEOVER: while (true) {
int ox = -1;
int oy = -1;
do {
System.out.println("그만두기: -1 0");
System.out.print("(x sp y): ");
ox = scan.nextInt();
oy = scan.nextInt();
if (ox == -1) {
System.out.println("★GAME OVER★");
// return; // break이면 do~while문 안에 갇혀버리기 때문에 return으로 강제 종료한다.
break GAMEOVER;
} // if
if (!((1 <= ox && ox <= 10) && (1 <= oy && oy <= 10)))
System.out.println("오목 좌표의 범위(-1 or 1~10)를 벗어났습니다."); // while(true)문 안에서 반복되어야 하지만 조건이
// 달성되어야만 돌아거라서 조건을 따로 한 번 더 걸어줬다.
} while (!((1 <= ox && ox <= 10) && (1 <= oy && oy <= 10))); // ||을 했을 때는 왜 안되는지 생각해보기 //오목조건에 맞아야
// 한다는 뜻이다.
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 12; j++)
if (i == 0 && j == 0)
System.out.print("┌");
else if (i == 0 && j == 11)
System.out.print("┐");
else if (i == 11 && j == 0)
System.out.print("└");
else if (i == 11 && j == 11)
System.out.print("┘");
else if (ox == j && oy == i)
System.out.print("○");
else if (j == 0)
System.out.print("├");
else if (j == 11)
System.out.print("┤");
else if (i == 0)
System.out.printf("┬");
else if (i == 11)
System.out.print("┴");
else if (ox == j && oy == i)
System.out.print("●");
else
System.out.print("┼");
System.out.println();
} // for i
} // while 1
} // case 1
break;
// 2. 도움말
case 2: {
System.out.println("도움말");
break;
// 3. 종료
}
case 3: {
System.out.println("종료");
break;
}
default:
System.out.println("메뉴는 1부터 3까지 밖에 없습니다..");
}// switch
} // while
}// main
}// class
'뉴렉처 > 자바' 카테고리의 다른 글
[뉴렉처/자바] ★배열 2023.06.22 (0) | 2023.06.22 |
---|---|
[뉴렉처/자바] ★배열 2023.06.21 (0) | 2023.06.21 |
[뉴렉처/자바]★반복문과 제어문 2023.06.19 (1) | 2023.06.19 |
[뉴렉처/자바] ★반복문과 제어문 2023.06.16 (0) | 2023.06.16 |
[뉴렉처/자바] ★반복문과 제어문 2023.06.15 (0) | 2023.06.15 |