▼ 제어문은 예제 위주로 정리하려 한다..
----------------------------------------------------------------------------------------------------------------------
[제어문의 종류]
- 제어문이란? Control Statement, 프로그램의 흐름(fow)을 바꾸어주는 명령문
제어문 | 코드 | 내용 |
조건문 |
if, if-else | 제한을 두거나 범위를 지정하여 선택 |
switch-case | 다차원 선택 (조건식에 따라 여러개의 결과값으로 이동, 명령 수행) | |
반복문 (Loop) |
for | 반복 횟수를 알 때 주로 사용 |
while | 반복 횟수를 모를 때 (화일 처리/키보드입력) | |
do while | 반복 횟수를 모르고, 특정 명령 수행 후 지속여부 확인 후 반복 시 사용 | |
기타 | break | switch-case 또는 반복문에서 종료 역할. //제어문 밖으로 |
continue | 반복문에서만 사용 가능 //반복문의 끝으로 이동 | |
return |
* 객체지향에서 다루는 제어자(motifier)와는 다르다.
* printf의 제어문자 \n, \r... 는 다른 말로 이스케이프라고 하고, 위 제어문과 다르다.
(프로그래밍 문법을 번역할 때 '제어'를 붙이는 경우가 참 많은 것 같은데... ;; 그럴 땐 원어를 보면 될 것 같다.)
1. 조건문 - if, switch
조건문은 말 그대로 알고리즘 내에 [조건]을 걸어 선택을 할 때 사용 - if문, if-else - switch : 다차원 선택 |
1) If문
(1) if문 예제_명령프롬프트에서 받은 숫자 확인
package practice;
public class PromptTest {
public static void main(String[] args) {
String input = args[0];
int num = Integer.parseInt(input);
if(num == 0) {
System.out.println("입력한 숫자는 0입니다.");
}
if(num != 0) {
System.out.println("입력한 숫자는 0이 아닙니다.");
}
}
}
>> 결과 (argument : 3)
입력한 숫자는 0이 아닙니다.
(2) if - else문
- 자바는 자바스크립트와 달리 else if문이 없다.
- if - else문 안에 중첩된 if-else문이 마치 else if문처럼 보이는 것..
package mymain;
import java.util.Scanner;
public class _02_Ex_if4 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int kor; //나의 국어점수
String grade = "F"; //결과(나의 등급)
System.out.print("국어 : ");
kor = scanner.nextInt();
//등급 세분
if(kor>=0 && kor<=100)
{
if(kor>=96) grade = "A+";
else if(kor>=93) grade = "A";
else if(kor>=90) grade = "A0";
else if(kor>=86) grade = "B+";
else if(kor>=83) grade = "B";
else if(kor>=80) grade = "B0";
else if(kor>=76) grade = "C+";
else if(kor>=73) grade = "C";
else if(kor>=70) grade = "C0";
else if(kor>=66) grade = "D+";
else if(kor>=63) grade = "D";
else if(kor>=60) grade = "D0";
else if(kor>=56) grade = "F+";
else if(kor>=53) grade = "F";
else if(kor>=50) grade = "F0";
}
else
{
System.out.printf("입력된 점수 [%d]는 유효하지 않습니다.",kor);
}
System.out.printf("국어점수 : %d(점) --> 등급 : %s\n",kor,grade);
scanner.close();
}
}
▼ 위 코드는 사실상
1) if(kor >= 96) else 가 있을 때
2) else안에 : if(kor>=93), if(kor>=90)......이 들어있는 것과 같음.
(3) 중첩 if문에서 코드를 간결히 하기 _ 위의 원리를 알면 아래와 같이 &&로 일일히 범위 지정을 하지 않을 수 있다.
package mymain;
import java.util.Scanner;
public class _02_Ex_if3 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int kor; //나의 국어점수
//String grade="ABCDF"; //등급
char result = 'F'; //결과(나의 등급)
System.out.print("국어 : ");
kor = scanner.nextInt();
//효율적 코드
//방법 1)
/*
if(kor>=90 && kor <= 100)
result = grade.charAt(0);
else if(kor>=80 && kor <90)
result = grade.charAt(1);
else if(kor>=70 && kor <80)
result = grade.charAt(2);
else if(kor>=60 && kor <70)
result = grade.charAt(3);
*/
//방법 2)
//유효범위를 먼저 체크(0~100)
if(kor>=0 && kor<=100)
{
if(kor>=90) result = 'A';
else if(kor>=80) result = 'B';
else if(kor>=70) result = 'C';
else if(kor>=60) result = 'D';
//else grade = 'F';
}
else
{
System.out.printf("입력된 점수 [%d]는 유효하지 않습니다.",kor);
}
System.out.printf("국어점수 : %d(점) --> 등급 : %c\n",kor,result);
scanner.close();
}
}
2) switch문
- 다차원 선택 - break를 걸지 않으면 내 case의 명령 이후에, 다음 case의 명령, 그 다음 case의 명령.... 수행 |
- 로그인한 사용자의 등급을 체크하여 권한을 부여하는 코드
//break를 안 쓰면 grantDelete()부터 아래까지 명령 하나씩 실행
//level 2면, grantWrite(), grantRead() 실행
switch(level){
case 3 : grantDelete();
case 2 : grantWrite();
case 1 : grantRead();
}
- 계절 예제
package mymain;
import java.util.Scanner;
public class _04_Ex_switch2_계절구하기 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int month;
String season = "";
System.out.print("월 : ");
month = scanner.nextInt();
//유효성 검사
if(month >= 1 && month <= 12) {
//계절 구하기__방법1
switch(month)
{
case 3: case 4: case 5: season="봄"; break;
case 6: case 7: case 8: season="여름"; break;
case 9: case 10: case 11: season= "가을"; break;
default : season="겨울";
}
}else {
System.out.println("월은 1~12사이 값을 입력하세요.");
}
System.out.printf("[%d월]의 계절은 [%s]입니다.",month,season);
scanner.close();
}
}
- 학점 내기 예제_ switch의 조건식에서 연산자 /를 통해 몫을 구함
package mymain;
import java.util.Scanner;
public class _05_Ex_switch3_문제 {
public static void main(String[] args) {
//1.국어점수 입력받는다.
//2. switch문을 이용해서 등급을 산출하세요.(ABCDF)--수식활용(10배)
Scanner scanner = new Scanner(System.in);
System.out.print("국어 점수 : ");
int score = scanner.nextInt();
char grade = 'F';
//유효성 확인
if(score>=0 && score<=100) {
//등급내기
switch(score/10)
{
case 10 :
case 9 : grade = 'A'; break;
case 8 : grade = 'B'; break;
case 7 : grade = 'C'; break;
case 6 : grade = 'D'; break;
default : grade = 'F';
}
System.out.printf("[%d]점일 때, 등급은 [%c]입니다.",score,grade);
}else {
System.out.println("유효하지 않은 값입니다.(0~100사이)");
}
scanner.close();
}
}
- 가위바위보 예제
package practice;
import java.util.Scanner;
public class SwitchTest {
public static void main(String[] args) {
//가위(1) 바위(2) 보(3)
String[] optArr = {"","가위","바위","보"};
Scanner scanner = new Scanner(System.in);
System.out.print("가위(1), 바위(2), 보(3) 중 하나 선택 : ");
int user_num = scanner.nextInt();
int comp_num = (int)(Math.random()*3)+1;
if(user_num==1 || user_num==2 || user_num ==3) {
switch(user_num - comp_num) {
case -2 : case 1 :
System.out.printf("당신 : [%s] vs 컴퓨터 : [%s] = 당신의 승!\n", optArr[user_num], optArr[comp_num]);
break;
case -1 : case 2 :
System.out.printf("당신 : [%s] vs 컴퓨터 : [%s] = 비겼네요.\n", optArr[user_num], optArr[comp_num]);
break;
default :
System.out.printf("당신 : [%s] vs 컴퓨터 : [%s] = 졌네요.ㅠㅠ\n", optArr[user_num], optArr[comp_num]);
}
}else {
System.out.println("잘못 입력했습니다.");
}
scanner.close();
}
}
>> 결과
가위(1), 바위(2), 보(3) 중 하나 선택 : 3
당신 : [보] vs 컴퓨터 : [가위] = 졌네요.ㅠㅠ
2. for/while/do-while
- for 문 : 반복횟수를 알 때 - while 문 : 반복횟수를 모를 때(화일처리/키보드입력) pf. 파일 처리의 경우 --> 사용자가 file을 선택하여 읽을 것 --> 개발자는 file에 몇개의 글자수가 있을지 모른다. --> 이럴 경우, while문으로 file의 끝까지 읽어라 명령 |
1) for문
for문은 반복횟수를 알고 있을 때 사용하기 용이하다. |
(1) for문
- 양의 정수의 합 구하기 : 1+2+3+...+num
package practice;
public class SumTest {
public static void main(String[] args) {
int num = 10;
int sum = 0;
for(int i = 1; i <= num; i++)
{
sum += i;
}
System.out.println("sum : "+sum);
}
}
>> 결과
sum : 55
- 짝수의 합 구하기 : 2+4+...+num / 1+3+...+num
package practice;
public class EvenOdd {
public static void main(String[] args) {
int num = 20;
int sum = 0;
//짝수의 합 구하기
//방법1 _ if문 활용
//두번째 차례만 출력 : 1 (2) 3 (4) 5 (6)
for(int i = 0; i <= num; i++)
{
if(i % 2 == 0)
{
sum += i;
}
}
System.out.println("sum : "+sum);
sum = 0;
//방법2 _ for문 내 증감식 활용
//증감을 +2씩 : 2 4 6 8 10
for(int i = 0; i <= num; i+=2)
{
sum += i;
}
System.out.println("sum : "+sum);
}
}
>> 결과
sum : 110
sum : 110
- 'A'부터 'Z'까지 문자 출력하기
(1) ASCII 코드 A : 65, Z : 90, a : 97임을 활용 pf. int ch = 'A'; 가 가능한 이유는? char은 JAVA에서 2byte이며, int는 4byte. 더 큰 타입으로는 자동 형변환 (2) System.out.printf의 형식지정자(formatter) %c 활용 - System.out.printf("%c",65); 의 결과는 'A' - System.out.printf("%d",'A'); 는 안 됨 **why? 그렇게 메서드가 정의되어 있음. (외울 때 Tip. 출력은 디코딩이니 'A' -> %d는 안되는 걸로) |
package practice;
public class CharTest {
public static void main(String[] args) {
//A부터 Z까지 출력
//Ascii에서 A : 65, Z : 90, a : 97
//방법1_아스키 10진수 직접 입력
for(int i = 65; i <= 90; i++) {
System.out.printf("%c",i);
}
System.out.println();
//방법2_Char to Int 자동 형변환
for(int i = 'A'; i <= 'Z'; i++) {
System.out.printf("%c",i);
}
System.out.println();
}
}
>> 결과
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
- 'A'부터 'Z'까지 중 3번째 차례 뒤에 구분문자(delim) 넣기
package practice;
public class CharTest2 {
public static void main(String[] args) {
//A~Z사이에 구분문자(delim) 넣기
//ABC-DEF-....
char delim = '-';
//방법1_012-345...
//n번 반복/ n번 중 3의 나머지가 2일 때 delim (출력시 'A'+n)
for(int j = 0; j < 26; j++) {
if(j % 3 == 2) {
System.out.printf("%c%c",'A'+j,delim);
}else {
System.out.printf("%c",'A'+j);
}
}
System.out.println();
//방법2_65 66 67 - 68 69 70 - ...
//n번 반복/'A'부터 'Z'중 3의 나머지가 1일 때 delim
for(int i = 'A'; i <= 'Z'; i++) {
if(i % 3 == 1) {
System.out.printf("%c%c",i,delim);
}else {
System.out.printf("%c",i);
}
}
System.out.println();
}
}
>> 결과
ABC-DEF-GHI-JKL-MNO-PQR-STU-VWX-YZ
ABC-DEF-GHI-JKL-MNO-PQR-STU-VWX-YZ
(2) 중첩 for문
- 5x5 블럭쌓기
package practice;
public class BlockTest {
public static void main(String[] args) {
int col = 5;
int row = 5;
for(int i = 0; i < row; i++) {
for(int j = 0; j < col; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
>> 결과
*****
*****
*****
*****
*****
- 반 피라미드 블럭 쌓기
package practice;
public class BlockTest2 {
public static void main(String[] args) {
int row = 5;
for(int i = 0; i < row; i++) {
for(int j = 0; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
>> 결과
*
**
***
****
*****
2) While문
- 반복횟수 모를 때에(파일 처리/키보드입력) |
- 파일 읽기
(가정) 프로젝트 폴더에 "test.txt"에 아래와 같이 적었다고 가정
Hello, my love |
package practice;
import java.io.FileReader;
import java.io.IOException;
public class FileTest {
public static void main(String[] args) throws IOException, InterruptedException {
//파일을 읽어볼 때
//io안의 클래스 FileReader
//메서드 read() - 파일읽기, close() - 파일닫기
FileReader file = new FileReader("test.txt");
int ch = 0;
int cnt = 0;
//파일을 문자가 없을 때까지 한 문자씩 반복해서 읽고 출력
//**몇개의 문자가 있을지 모른다.
while(true)
{
ch = file.read();
if(ch == -1) break; //문자없을 때 반복문 나가기
System.out.printf("%c",ch);
Thread.sleep(100);
cnt++;
}
System.out.println("\n-----------------------");
System.out.println("총 문자 수 : "+cnt);
file.close();
}
}
>> 결과
Hello,
my love
-----------------------
총 문자 수 : 15
**** 총 문자 수가 15가 나온 이유 :
','과 공백 포함 보이는 문자는 13개 + Enter(실제 코드 : \r\n)
<<--- \r,\n처럼 눈에 안 보이는 문자를 화이트 문자라고 한다.
- 키보드 입력
(아래 프로그램 흐름)
※ 참조 : 키보드 버퍼, https://dogrushdev.tistory.com/39
자바 프로그램 | RAM | 외부 입력 장치 | ||||
int ch | ← | System.in.read() | ← | 키보드 버퍼 | ← | 키보드 |
(문자 1byte씩 읽고 int형으로 return) |
(임시 저장) | (사용자가 입력 후 엔터를 치면 버퍼로 이동) |
package practice;
import java.io.IOException;
public class KeyBoardTest {
public static void main(String[] args) throws IOException, InterruptedException {
int ch;
int cnt = 0;
//사용자에게 입력 안내
System.out.println("문자를 입력하세요.(종료 시 : Ctrl + Z)");
//사용자가 Ctrl+Z를 누를 때까지 반복해서 버퍼 내용을 읽기
while(true)
{
ch = System.in.read();
if(ch == -1) break;
System.out.printf("%c",ch);
Thread.sleep(100);
cnt++;
}
System.out.println("\n------------------");
System.out.println("총 문자 수 : "+cnt);
}
}
- 키보드 입력2
package mymain;
import java.io.IOException;
public class _12_Ex_while3_키보드입력2 {
public static void main(String[] args) throws IOException {
//키보드 표준장치명 : System.in (byte씩 입력)
//사용자가 언제 끝낼 지 결정 - 개발자는 반복횟수 알 수 없음
int ch;
int total_count = 0; //총 입력 문자수
int number_count = 0; //숫자문자 갯수
int alpha_upper_count = 0; //대문자 갯수
int alpha_lower_count = 0; //소문자 갯수
int white_count = 0; //white문자 갯수 : (\r,\n,\t,'')
int etc_count = 0; //나머지 문자 갯수
System.out.println("값을 입력하세요(종료 : Ctrl + Z)");
//운영체제의 CL(명령 라인)에서 Ctrl+z는 종료의 단축키
while(true)
{
ch = System.in.read();
if(ch == -1) break; //System.in.read()가 -1반환
//총 입력 갯수 카운트(EOF 제외)
total_count++;
//수문자 갯수 카운트
if(ch >= '0' && ch <= '9')
number_count++;
//대문자 갯수 카운트
else if(ch >= 'A' && ch <= 'Z')
alpha_upper_count++;
//소문자 갯수 카운트
else if(ch >= 'a' && ch <= 'z')
alpha_lower_count++;
//白문자 갯수 카운트
else if(ch == '\r' || ch == '\n' || ch == '\t' || ch == ' ')
white_count++;
//나머지 갯수 카운트
else
etc_count++;
System.out.printf("%c",ch);
}
System.out.printf("전 체 갯수 : %2d\n",total_count);
System.out.printf("숫 자 갯수 : %2d\n",number_count);
System.out.printf("대문자 갯수 : %2d\n",alpha_upper_count);
System.out.printf("소문자 갯수 : %2d\n",alpha_lower_count);
System.out.printf("화이트 갯수 : %2d\n",white_count);
System.out.printf("나머지 갯수 : %2d\n",etc_count);
System.out.println("-----[END]-----");
}
}
3) do-While문
- 반복횟수 모를 때에 용이 - 특정 명령을 행한 뒤(do), (사용자의 의사에 따라) 지속할 지 확인(confirm) 후 반복할 때 사용. |
package practice;
import java.util.Scanner;
public class Dan99Test {
public static void main(String[] args) {
int dan = 0;
String yn = "Y";
Scanner scanner = new Scanner(System.in);
do
{
System.out.print("단 입력(2~9단 중 하나) : ");
dan = scanner.nextInt();
if(dan >= 2 && dan <= 9) {
for(int i = 1; i <=9; i++) {
System.out.printf("%d x %d = %2d\n",dan,i,dan*i);
}
System.out.print("더 하시겠습니까? (y/n) :");
yn = scanner.next();
}else {
System.out.println("2~9 중 하나를 입력해주세요.");
}
}while(yn.equals("Y") || yn.equals("y"));
scanner.close();
}
}
>> 결과
단 입력(2~9단 중 하나) : 10
2~9 중 하나를 입력해주세요.
단 입력(2~9단 중 하나) : 3
3 x 1 = 3
3 x 2 = 6
3 x 3 = 9
3 x 4 = 12
3 x 5 = 15
3 x 6 = 18
3 x 7 = 21
3 x 8 = 24
3 x 9 = 27
더 하시겠습니까? (y/n) :n
'Language > Java' 카테고리의 다른 글
[자바_복습] 제어문 활용_최대값/키보드 버퍼 문자 읽기/사칙연산/제곱과 팩토리 (0) | 2022.03.12 |
---|---|
[자바_복습] 중첩for문 활용_구구단/행렬/별찍기 (0) | 2022.03.11 |
[자바_복습] 연산자 구체적으로 보기 (0) | 2022.03.07 |
[자바_복습] Scanner 입력 메서드 구분 (0) | 2022.03.04 |
[자바의 정석_복습] 객체지향 프로그래밍1(2) - 클래스(생성자, 초기화블럭) (0) | 2022.02.27 |