조건문 : 조건을 만족할때만 { }를 수행 (0~1)

조건문에는 if문과 switch문이 있음.

 

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

 

블록 { } : 여러 문장을 하나로 묶어주는 것

 

if-else: 둘 중의 하나 - 조건식이 참일 때와 거짓일 때로 나눠서 처리

형식은 다음과 같다.

if (input==0) {
	System.out.println("0입니다.");
	} else {
	System.out.println("0이 아닙니다.");
}

 

if-else if: 여러개 중의 하나 여러개의 조건식을 포함한 조건식

형식은 다음과 같다.

 

if (조건식1) {
	/* 내용 */
} else if (조건식2) {
	/* 내용 */
} else if (조건식3) {
	/* 내용 */
} else {
    /* 내용 */
}

 

조건식을 만족하게 되면 바로 조건문을 나오게 된다.

마지막은 보통 else 블록으로 끝나며, else 블록은 생략가능하다.

 

 

ex)

import java.util.Scanner;

public class Ex4_4 {

	public static void main(String[] args) {
		int score = 0;		// 점수를 저장하기 위한 변수
		char grade = ' ';	// 학점을 저장하기 위한 변수, 공백으로 초기화한다.
		
		System.out.println("점수를 입력하세요.");
		Scanner sc = new Scanner(System.in);
		score = sc.nextInt();
		
		if (score >= 90) {
			grade = 'A';
		} else if (score >= 80) {
			grade = 'B';
		} else if (score >= 70) {
			grade = 'C';
		} else {
			grade = 'D';
		}
		System.out.println("당신의 학점은 "+grade+" 입니다.");
	}

}
 

 

중첩 ifif문 안의 if

형식은 다음과 같다.

 

if (조건식1) {
	if (조건식2) {
    /* 내용 */
    } else {
    /* 내용 */
    }
    } else {
	/* 내용 */
}
import java.util.Scanner;

public class Ex4_5 {

	public static void main(String[] args) {
		int score = 0;		
		char grade = 'D';	
		char opt = ' ';
		
		System.out.println("점수를 입력하세요.");
		Scanner sc = new Scanner(System.in);
		score = sc.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 if (score >= 70) {
			grade = 'C';
			if (score >= 78) {
				opt = '+';
			} else if (score < 74) {
				opt = '-';
			}
		} 
		System.out.println("당신의 학점은 " + grade + opt + "입니다.");
	}

}

if문 안에 if문을 넣어서 점수를 더 세분화 했다.

이번에는 if문의 가장 마지막에서 else를 생략하면서 grade의 초기값에 D를 넣어주었다.

 

switch

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

1) 조건식을 계산한다.

2) 조건식의 결과와 일치하는 case문으로 이동한다.

3) 이후의 문장들을 수행한다.

4) break문이나 switch문의 끝을 만나면 switch 문 전체를 빠져나간다.

 

형식은 다음과 같다.

 

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

 

switch문의 제약 조건

1. switch문의 조건식 결과는 정수 또는 문자열이어야 한다.

2. case문의 값은 정수, 상수(문자 포함), 문자열만 가능하며 중복되지 않아야 한다.

 

 

int num, result;

final int ONE = 1;

 

switch(result) {

case ‘1’ : // OK. 문자 리터럴(정수 49와 동일)

case ONE : // OK. 정수인 상수

case “YES” : // OK. 문자열 리터럴. JDK 1.7부터 허용

case num : // 에러. 변수는 불가

case 1.0 : // 에러. 실수는 불가

}

import java.util.Scanner;

public class Ex4_6 {

	public static void main(String[] args) {
		System.out.println("현재 월을 입력하세요");
		
		Scanner sc = new Scanner(System.in);
		int month = sc.nextInt();
		
		switch(month) {
			case 3, 4, 5:
						System.out.println("현재의 계절은 봄입니다.");
						break;
			case 6, 7, 8:
						System.out.println("현재의 계절은 여름입니다.");
						break;
			case 9, 10, 11:
						System.out.println("현재의 계절은 가을입니다.");
						break;
			default:
						System.out.println("현재의 계절은 겨울입니다");
		
		}
	}

}

특별한 의도가 있지 않은 이상 switch문을 쓸 때 break를 빼먹으면 안 된다.

 

임의의 정수 만들기

 

Math.random() - 0.01.0 사이의 임의의 double값을 반환

0.0 <= Math,random() < 1.0

 

ex) Math.random()을 이용해서 1~3 사이의 정수(1 or 2 or 3) 얻기

1) 각 변에 3을 곱한다

0.0 <= Math.random() * 3 < 3.0

2) 각 변을 int형으로 변환한다.

(int)0.0 <= (int)(Math.random() * 3) < (int)3.0

0 <= (int)(Math.random() * 3) < 3

3) 각 변에 1을 더한다

1 <= (int)(Math.random() * 3) < 4

 
public class Ex4_7 {

	public static void main(String[] args) {
		int num = 0;
		
//		 괄호{} 안의 내용을 5번 반복한다.
//		 Quiz1. 1~10 사이의 난수를 20개 출력하시오
//		 1,2,3,4,5,6,7,8,9,10
//		for (int i = 1; i <= 20; i++) {
//			num = (int)(Math.random()*10) + 1;
//			System.out.println(num);
//		}
			
//		 Quiz2. -5~5사이의 난수를 20개 출력하시오
//		 -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5 -> 11개
		for (int i = 1; i <= 20; i++) {
			num = (int)(Math.random()*11)-5;
			System.out.println(num);
		}
	}

}

난수의 개수 = 조건문 반복횟수

난수의 종류 = Math.random()에 곱해줄 숫자

 

for

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

public class Ex4_10 {

	public static void main(String[] args) {
		int sum = 0;
		
		for(int i=1; i <=5; i++) {
			sum += i;
			System.out.printf("1부터 %2d 까지의 합: %2d%n", i, sum); // %2d - 2칸으로 표시
		}

	}

}

 

중첩 for

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

 

ex) 구구단 2~9단 출력

public class Ex4_11 {

	public static void main(String[] args) {
		for (int i =2; i<=9; i++) {
			for(int j=1; j<=9; j++) {
				System.out.println(i+"*"+j+"="+(i*j));
			}
			System.out.println();
		}

	}	// main의 끝

}

ex) 별 찍기

public class Practice0303 {

	public static void main(String[] args) {
		// 별 1개부터 10개까지 찍기
		for (int i=1; i<=10; i++) {
			for (int j=1; j<=i; j++) {
				System.out.print("*");
			}
			System.out.println();	// 줄바꿈 역할
		}
		// 별 9개부터 1개 찍기
		for (int k=1; k<=9; k++) {
			for (int l=9; l>=k; l--) {
				System.out.print("*");
			}
			System.out.println(); 
		}
		
	} // main의 끝

}

while

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

while문과 for문은 완벽히 호환 가능

 

while (조건식) {

// 반복될 문장

}

 

ex) 입력받은 숫자의 각 자리수의 합을 구하는 프로그램

import java.util.Scanner;

public class Ex4_14 {

	public static void main(String[] args) {
		int num = 0, sum = 0;
		System.out.println("숫자를 입력하세요.(예:12345)");
		
		Scanner sc = new Scanner(System.in);
		String tmp = sc.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 (조건식); <- (끝에 ‘ ; ’을 잊지 않도록 주의)

 

ex) 1~100 사이의 랜덤 정수를 맞추는 프로그램

import java.util.Scanner;

public class Ex4_15 {

	public static void main(String[] args) {
		int input = 0, answer = 0;
		
		answer = (int)(Math.random() * 100) + 1;
		Scanner sc = new Scanner(System.in);
		
		do {
			System.out.println("1과 100사이의 정수를 입력하세요.");
			input = sc.nextInt();
			
			if(input > answer) {
				System.out.println("더 작은 수로 다시 시도해보세요.");
			} else if(input < answer) {
				System.out.println("더 큰 수로 다시 시도해보세요.");
			}
		} while(input!=answer);
		
		System.out.println("정답입니다.");
	}	

}

break

자신이 포함된 하나의 반복문을 벗어난다.

public class Ex4_16 {

	public static void main(String[] args) {
		int sum = 0;
		int i = 0;
		
		while(true) {	// 무한 반복문, for(;;)와 같음
			if (sum > 100) { 
				break;	// 자신이 속한 반복문을 벗어난다.
			}
			++i;
			sum += i;
		}
		System.out.println("i=" + i);
		System.out.println("sum=" + sum);

	}

}

continue

자신이 포함된 반복문의 끝으로 이동 다음 반복으로 넘어감

전체 반복 중에서 특정 조건시 반복을 건너뛸 때 유용하다

 

ex) 3의 배수를 제외하고 출력하기

public class Ex4_17 {

	public static void main(String[] args) {
		for (int i=0; i <= 10; i++) {
			if (i%3==0)
				continue;	// 조건식이 참이 되어 continue 문이 수행되면 블록의 끝으로 이동함. 반복문을 벗어나지 않음
			System.out.println(i);
		}

	}

}

ex) breakcontinue를 활용한 무한 반복문

import java.util.Scanner;

public class Ex4_18 {

	public static void main(String[] args) {
		int menu = 0;
		int num = 0;
		
		Scanner sc = 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 = sc.nextLine();	// 화면에서 입력받은 내용을 tmp에 저장
			menu = Integer.parseInt(tmp); // 입력받은 문자열(tmp)을 숫자로 변환
			
			if(menu==0) {
				System.out.println("프로그램을 종료합니다.");
				break;	// while 문을 완전히 빠져나감
			} else if (!(1 <= menu && menu <= 3)) {
				System.out.println("메뉴를 잘못 선택하셨습니다.(종료는 0)");
				continue;
			}
			
			System.out.println("선택하신 메뉴는 "+ menu + "번 입니다.");
		}

	}

}

이름붙은 반복문

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

public class Ex4_19 {

	public static void main(String[] args) {
		
			// for문에 Loop1 이라는 이름을 붙였다.
			Loop1 : for(int i=2; i<=9;i++) {
				for(int j=1; j<=9; j++) {
					if(j==5)
						break Loop1;
//						break;

						System.out.println(i+"*"+j+"="+i*j);
				}	// for문의 끝
				System.out.println();
			} // Loop1의 끝

	} // Main의 끝

}
import java.util.Scanner;

public class Ex4_20 {

	public static void main(String[] args) {
		int menu = 0;
		int num = 0;
		
		Scanner sc = new Scanner(System.in);
		
		outer: while(true)	{ // while문에 outer라는 이름을 붙인다.
			System.out.println("(1) square");
			System.out.println("(2) square root");
			System.out.println("(3) log");
			System.out.println("원하는 메뉴(1~3)를 선택하세요.(종료:0)");
			
			String tmp = sc.nextLine();	// 화면에서 입력받은 내용을 tmp에 저장
			menu = Integer.parseInt(tmp); // 입력받은 문자열(tmp)을 숫자로 변환
			
			if(menu==0) {
				System.out.println("프로그램을 종료합니다.");
				break;	// while 문을 완전히 빠져나감
			} else if (!(1 <= menu && menu <= 3)) {
				System.out.println("메뉴를 잘못 선택하셨습니다.(종료는 0)");
				continue;
			}
			
			for(;;) {
				System.out.println("계산할 값을 입력하세요.(계산 종료:0, 전체 종료:99");
					tmp = sc.nextLine();		
					num = Integer.parseInt(tmp);
					
					if(num==0)
						break;	// 계산 종료. for문을 벗어난다.
					
					if(num==99)
						break outer;	// 전체 종료. for문과 while문을 모두 벗어난다.
					
					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의 끝

}

 

 


출처 - 유튜브 남궁성의 정석코딩 [자바의 정석 - 기초편] 

 

어디선가 들어본 난수 생성, 난수 맞추기, 별 찍기, 계산기 만들기를 오늘 처음 배워봤는데 다시 따라할 때 까먹거나 헷갈리고 작성 속도도 느렸음

 

이 공부는 반복이 답인거 같다. 귀찮지만 반복을 많이해봐야 익숙해지고 빨라진다.

+ Recent posts