자바의정석 4장

서현우·2022년 3월 12일
0

자바의정석

목록 보기
4/22

4장 조건문과 반복문

제어문(flow control statement)

  • 조건문 : 조건을 만족할때만 { }를 수행(0~1번)
  • 반복문 : 조건을 만족하는 동안 { }를 수행(0~n번)

if문

조건식이 true일 때, 괄호{}안의 문장들을 수행한다.

if (조건식) {
	//조건식이 참(true)일 때 수행될 문장들을 적는다.
}

블럭 { }

여러 문장을 하나로 묶어주는 것

if(score > 60)
      System.out.println("합격입니다."); //문장1. if문에 속한 문장
      System.out.println("축하드립니다."); //문장2. if문에 속한 문장이 아님

if-else문

  • 여러 개 중의 하나
  • 여러 개의 조건식을 포함한 조건식
if (조건식1) {
        //조건식1의 연산결과가 참일 때 수행될 문장들을 적는다.
} else if (조건식2) {  //여러 개의 else if를 사용할 수 있다.
        //조건식2의 연산결과가 참일 때 수행될 문장들을 적는다.
} else if (조건식3) {
        //조건식3의 연산결과가 참일 때 수행될 문장들을 적는다.
} else {  //마지막은 보통 else블럭으로 끝나며, else블럭은 생략가능하다.      
//위의 어느 조건식도 만족하지 않을 때 수행될 문장들을 적는다.
}

//예제4-4 학점계산기
int score = 0; //학점을 저장하기 위한 변수
//초기값을 'D'로 넣으면 else문을 뺄 수 있다.

char grade = ' '; //학점을 저장하기 위한 변수, 공백으로 초기화

System.out.printf("점수를 입력하세요>");
Scanner scanner = new Scanner(System.in);
score = scanner.nextInt(); //화면을 통해 입력받는 숫자를 score에 저장

if (score >= 90) {
	grade = 'A';
} else if (score >= 80) {
	grade = 'B';
} else if (score >=70) {
	grade = 'C';
} else {
	grade = 'D';
}
System.out.println("당신의 학점은 "+grade+"입니다");

중첩 if문 - if문 안의 if

if (조건식1) {
	       //조건식1의 연산결과가 true일 때 수행될 문장들을 적는다.
	if (조건식2) {
	       //조건식1과 조건식2가 모두 true일 때 수행될 문장들
	} else {
	       //조건식1이 true이고, 조건식2가 false일 때 수행될 문장들
	}
} else {
     //조건식1이 false일 때 수행되는 문장들
     
//예제4-5 중첩if문 예제
int score = 0;
char grade = ' ', opt = '0';

System.out.print("점수를 입력해주세요.>");

Scanner scanner = new Scanner(System.in);
score = scanner.nextInt();

System.out.printf("당신의 점수는 %d입니다.%n", score);

if (score >= 90) {
	grade = 'A';
	if (score >= 98) {
		opt = '+';
	} else if (score < 94) {
		opt = '-';
	}	
}	else if (score >=80) {
	grade = 'B';
	if (score >=88) {
		opt = '+';
	} else if (score < 84) {
		opt = '-';
	}
}	else {
	grade = 'C';
}
System.out.printf("당신의 학점은 %c%c입니다.%n",grade,opt);     

switch문

처리해야 하는 경우의 수가 많을 때 유용한 조건문

switch (조건식) {
	case 값1 :
	//조건식의 결과가 값1과 같을 경우 수행될 문장들
	//. . .
  	break;
	case 값2 :
	//조건식의 결과가 값2와 같을 경우 수행될 문장들
	//...
	break;     //switch문을 벗어난다.
	//. . .
	default :
	// 조건식의 결과와 일치하는 case문이 없을 때 수행될 문장들.	
	//. . .
}

//예제 4-6 switch문의 제약조건 예제
public static void main(String[] args) {

System.out.print("현재 월을 입력하세요.>");

Scanner scanner = new Scanner(System.in);
int month = scanner.nextInt();

switch(month) {
	case 3:
	case 4:
	case 5:
		System.out.println("현재의 계절은 봄입니다.");
		break;
	case 6: case 7: case 8:
		System.out.println("현재의 계절은 여름입니다.");
		break;
	case 9: case 10: case 11:
		System.out.println("현재의 계절은 가을입니다.");
		break;
	default:
	//case 12: case 1: case 2:
	System.out.println("현재의 계절은 겨울입니다.");
}
} //main의 끝. break하면 여기로 이동.				
  1. 조건식을 계산한다.
  2. 조건식의 결과와 일치하는 case문으로 이동한다.
  3. 이후의 문장들을 수행한다.
  4. break문이나 switch문의 끝을 만나면 switch문 전체를 빠져나간다.
  • "switch문은 if문으로 전부 바꿀 수 있지만, if문은 switch문으로 전부 바꿀수 있는 것은 아니다."

switch문의 제약조건

  1. switch문의 조건식 결과는 정수 또는 문자열이어야 한다.
  2. case문의 값은 정수 상수(문자포함), 문자열만 가능하며, 중복되지 않아야 한다.(변수 불가, 실수 불가
int num, result;
final int ONE = 1;
. . .
switch(result) {
	case '1' :      //OK. 문자 리터럴(정수 49와 동일)
	case ONE :      //OK. 정수 상수
	case "YES" :    //OK. 문자열 리터럴. JDK1.7부터 적용
	case num :      //에러. 변수는 불가
	case 1.0 :      //에러. 실수도 불가
	. . .
}

임의의 정수 만들기

Math.random()

  • 0.0과 1.0사이의 임의의 double값을 반환
  • 0.0 <= Math.random() < 1.0

1~3 정수 만들기

1. 각 변에 3을 곱한다
0.0 * 3 <= Math.random() * 3 < 1.0 * 3
    0.0 <= Math.random() * 3 < 1.0 * 3 

2. 각 변을 int형으로 변환한다.
(int)0.0 <= (int)(Math.random() * 3) < 1.0 * 3 
       0 <= (int)(Math.random() * 3) < 3

3. 각 변에 1을 더한다.
0 + 1 <= (int)(Math.random() * 3) + 1 < 3 + 1
    1 <= (int)(Math.random() * 3) + 1 < 4
    
//예제4-7 1~6 난수 만들기	

int num = 0;

//괄호{} 안의 내용을 5번 반복한다.
for(int i=0; i<5; i++) {
	num = (int)(Math.random()*6)+1;
	System.out.println(num);
}    

for문

조건을 만족하는 동안 블럭{}을 반복 - 반복횟수를 알 때 적합

for(int i=1; i<=5; i++) {
	System.out.println("I can do it.");

//예제 4-10 for문 - 1~5 합계
int sum = 0;

for(int i=1;i<=5;i++) {
	
	sum+=i; //sum = sum + i;
	System.out.printf("1부터 %2d 까지의 합: %2d%n",i,sum);
}
}

중첩 for문

for문 내에 또 다른 for문을 포함시킬 수 있다.

//구구단 2단~9단 중첩 for문
for(int i=1;i<=9;i++) {
	for(int j=2;j<=9;j++) {
		System.out.println(i+"*"+j+"="+(i*j));
	}
}

//5x10 별찍기 중첩 for문
for(int i=1;i<=5;i++) {
	for(int j=1;j<=10;j++) {
		System.out.print("*");
	}
	System.out.println();
}

//예제 4-11 중첩for문 - 별찍기2
for(int i=1;i<=5;i++) {
	for(int j=1;j<=i;j++) {   //j의조건확인
		System.out.printf("*");
	}
	System.out.println();
}
  • 별찍기2 중첩 for문

while문

조건을 만족시키는 동안 블럭{}을 반복 - 반복횟수 모를 때

while (조건식) {
	//조건식의 연산결과가 참(true)인 동안, 반복될 문장들을 적는다.
}

int i=1; //초기화
while(i<=10) {  //조건식
	System.out.println(i);
	i++;  //증감식
}

//while문과 for문은 100% 서로 변경 가능
for(int i=1;i<=10;i++) {
	System.out.println(i);
}

//예제 4-12 while문
int i=5; //i 선언 및 초기화

while(i--!=0) {  //조건과 결과 확인 할 것
	System.out.println(i);
}  //결과 i가 4,3,2,1,0이 나온다.

//예제 4-13 while문2
int sum = 0;
int i = 0;

//i를 1씩 증가시켜서 sum에 계속 더해나간다.
while (sum<=100) {
	System.out.printf("%d - %d%n", i, sum);
	sum += ++i; //sum = sum + ++i
}

//예제 4-14 while문
int num = 0, sum = 0;

System.out.println("숫자를 입력하세요.(예:12345)>");

Scanner scanner = new Scanner(System.in);
String tmp = scanner.nextLine();
num = Integer.parseInt(tmp);

while(num!=0) {
	//num을 10으로 나눈 나머지를 sum에 더함
	sum += num%10;  //sum = sum+num%10;
	System.out.printf("sum=%3d num=%d%n",sum,num);
	
	num /= 10; //num = num / 10;
}
System.out.println("각 자리수의 합:"+sum);

do-while문

블럭{ }을 최소한 한 번 이상 반복 - 사용자 입력받을 때 유용

do {
	// 조건식의 연산결과가 참일 때 수행될 문장들을 적는다.(처음 한 번은 무조건 실행)
} while (조건식); //끝에 ';'을 잊지 않도록 주의

//[예제 4-15] do-while문 - 1~100사이 숫자 맞추기
int input = 0, answer = 0;

answer = (int)(Math.random()*100)+1;
Scanner scanner = new Scanner(System.in);

do {
	System.out.println("1과 100사이의 정수를 입력하세요>");
	input = scanner.nextInt();
	
	if(input > answer) {
		System.out.println("더 작은 수로 시도해보세요.");
	} else if(input < answer) {
		System.out.println("더 큰 수로 시도해보세요");
	}
} while(input!=answer);

System.out.println("정답입니다.");

break문

자신이 포함된 하나의 반복문을 벗어난다
//switch문, 무한반복문

//[예제 4-16] break문
int sum = 0;
int i = 0;

while(true) {
	if(sum > 100)
		break;
	++i;
	sum += i;			
}  // end of while

System.out.println("i="+i);
System.out.println("sum="+sum);

continue문

  • 자신이 포함된 반복문의 끝으로 이동 - 다음 반복으로 넘어감
  • 전체 반복 중에서 특정 조건시 반복을 건너뛸 때 유용
  • 조건식이 참이 되어 continue문이 수행되면 블럭의 끝으로 이동한다.
  • break문과 달리 반복문을 벗어나지 않는다.
//[예제 4-17] continue문 - 3의 배수 제외
for(int i=0;i<=10;i++) {
	if(i%3==0)
		continue;
	System.out.println(i);
}

//[예제 4-18] break문과 continue문
public static void main(String[] args) {

int menu = 0;
int num = 0;

Scanner scanner = new Scanner(System.in);

while(true) {
	System.out.println("(1) square");
	System.out.println("(2) square root");
	System.out.println("(3) log");
	System.out.println("원하는 메뉴(1~3)를 선택하세요.(종료:0)>");
	
	String tmp = scanner.nextLine();
	menu = Integer.parseInt(tmp);
	
	if(menu==0) {
		System.out.println("프로그램을 종료합니다.");
		break;
	} else if(!(1<=menu && menu<=3)) {
		System.out.println("메뉴를 잘못 선택하셨습니다.(종료는 0)");
		continue;
	}
	
	System.out.println("선택하신 메뉴는 "+menu+"번입니다.");
}
}  //main의 끝				

이름붙은 반복문

반복문에 이름을 붙여서 하나 이상의 반복문을 벗어날 수 있다.

  • break; : 하나의 반복문을 벗어난다.
  • break 이름; : 이름의 모든 반복문을 벗어난다.
//[예제 4-19] 이름 붙은 반복문
{ Loop1 : for(int i=2;i<=9;i++) {
	for(int j=1;j<=9;j++) {
		if(j==5)
			break Loop1;
//			break;
//			continue;
		
		System.out.println(i+"*"+j+"="+i*j);
	}
	System.out.println();
}
}
//[예제 4-20] 계산 프로그램 만들기
public static void main(String[] args) {
int menu = 0, num = 0;
Scanner scanner = new Scanner(System.in);

outer:
while(true) {
	System.out.println("(1) square");
	System.out.println("(2) square root");
	System.out.println("(3) log");
	System.out.println("원하는 메뉴(1~3을 선택하세요.(종료:0)>");
	
	String tmp = scanner.nextLine();
	menu = Integer.parseInt(tmp);
	
	if(menu==0) {
		System.out.println("프로그램을 종료합니다.");
		break;
	} else if(!(1<=menu && menu<=3)) {
		System.out.println("메뉴를 잘못 선택하셨습니다.(종료는 0)");
		continue;
	}
	
	for(;;) {
		System.out.print("계산할 값을 입력하세요.(계산 종료:0, 전체 종료:99)>");
		tmp = scanner.nextLine();
		num = Integer.parseInt(tmp);
		
		if(num==0) 
			break; //계산 종료
		
		if(num==99)
			break outer; //전체 종료

		switch(menu) {
		case 1:
			System.out.println("result="+num*num);
			break;
		case 2:
			System.out.println("result="+Math.sqrt(num));
			break;
		case 3:
			System.out.println("result="+Math.log(num));
			break;
		}		
	} //for(;;)
}  //while의 끝		
} //main의 끝
profile
안녕하세요!!

0개의 댓글