Break문 특징
1) 가장 가까이에 있는 하나의 반복문을 벗어나기 위해 사용.
(break문이 실행되면 Loop가 전부 끝나지 않았음에도 해당 반복문을 즉시 탈출)
Return문 특징
1) 쓰인 해당 함수에서의 탈출을 의미. (break문은 반복문!! return은 함수!!)
→ 예를 들어, return문 실행 시 '반복문을 포함하는 '메서드' 자체를 종료시킴.
2) 메서드 내에서 return이 실행되면 뒷 줄에 코드가 더 있다고 하더라도 값 반환 후 종료.
3) 메서드의 출력값은 return명령어로만 가능.
4) 메서드의 리턴자료형이 void인 경우에는 return문이 필요없다.
5) return; 문(반환 값 명시안하고 바로 세미콜론(;) 옴) 만을 써서 메소드를 빠져나가는 방법은 리턴 자료형이 void형인 메서드에만 해당된다. 당연한 이야기지만, 리턴 자료형이 명시되어 있는 메서드에서 return; 문만을 작성하면 컴파일 오류 발생.
6) return; 다른 곳에 호출한 함수가 있으면 거기로 감.
예제
12의 약수를 구하시오.
약수 : 어떤 수 이하의 자연수 중에서 나머지가 0
for (int i = 1; i <= 12; i++) {
if (12 % i == 0) {
System.out.println(i);
}
}
num의 약수를 구하시오.
int num = 0;
for(int i = 1 ; i <= num ; i++) {
if(num % i == 0) {
System.out.println(i);
}
}
100 이하의 자연수 중 8의 배수를 구하시오.
for(int i = 1 ; i <=100 ; i++) {
if (i % 8 == 0) {
System.out.print(i + ", ");
}
}
공약수(common divisor), 최대공약수를 구하시오.
int num1 = 12;
int num2 = 18;
for(int i = 1 ; i <= num1 ; i++) {
for(int j = 1 ; j <= num2 ; j++) {
if (num1 % i == 0 && num2 % j == 0 && i == j) {
System.out.print(j + ", ");
}
}
}
-> 약수는 위에서 구했잖아. 공약수는 num1과 num2의 "공통" 약수잖아!!!! 그러니까 i == j 도 붙였어야지!!!
출력은 i로 하나 j로 하나 똑같음.
int num1 = 12;
int num2 = 18;
int gcd = 0;
for(int i = 1 ; i <= num1 ; i++) {
for(int j = 1 ; j <= num2 ; j++) {
if (num1 % i == 0 && num2 % j == 0 && i == j) {
gcd = i;
}
}
}
System.out.println("최대공약수: " + gcd);
-> 최대공약수를 담을 변수를 만들고 (변수 만드는 거 두려워하지말고 팍팍 쓰자.)
if문이 공약수가 출력되잖아. 공약수 하나 하나 나올 때마다 gcd에 담으면 마지막에 담기는 게 최대공약수지!!
for(int i = num1 ; i > 0 ; i--) {
for(int j = num2 ; j > 0 ; j--) {
if (num1 % i == 0 && num2 % j == 0 && i == j) {
System.out.println("for문 label로 최대공약수 구하기" + i);
break outer;
}
}
}
공배수와 최소공배수를 구하시오.
int num1 = 8;
int num2 = 12;
for (int i = 1; i <= 100; i++) {
for (int j = 1; j <= 100; j++) {
if (i % num1 == 0 && j % num2 == 0 && i == j) {
System.out.print(i + " ");
}
}
}
-> 공배수도 마찬가지로 num1과 num2의 "공통!!"배수잖아. 그러니깐 배수 구하는 반복문 두 개를 합치면 되지. 그리고 공통이니깐 i == j 로 하면 되지!
서로소 관계 (두 수의 공약수가 1밖에 없을 때)
int num5 = 80;
int num6 = 120;
int lcm = 0;
outer :
for (int i = 1; i <= num5 * num6; i++) {
for (int j = 1; j <= num5 * num6; j++) {
if (i % num5 == 0 && j % num6 == 0 && i == j) {
if(lcm == 0 && lcm < j) {
lcm = j;
}
lcm = j;
break outer;
}
}
}
System.out.println(lcm);
소수(prime number)를 구하시오.
-> 소수: 약수의 개수가 두 개인 수. (1과 자기 자신)
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31
int num = 7 ;
boolean result = true;
for(int i = 2 ; i < num ; i++) {
if(num % i == 0) {
result = false;
}
}
System.out.println(num + (result ? "소수" : "!소수") + "입니다.");
-> 일단 위에서 한 약수 구하기 식을 쓴 후,
모든 수의 약수에는 1과 자기 자신이 포함되어 있기 때문에 뺌. (for()에서 i = 2 , i < num 인 이유.)
result는 소수이면 true, 소수가 아니면 false. (1과 자기자신 말고 다른 약수가 존재)
-> 출력은 깔끔하게 하려고 삼항연산자 쓴 거
별찍기 for문을 while문으로 변경.
package review02;
public class Ex05 {
public static void main(String[] args) {
for(int i=0; i<=10; i++) {
for(int j=0; j<=i; j++) {
System.out.print("*");
}
System.out.println();
}
// while문으로 변경하기.
int i = 0;
while(i <= 10) {
int j = 0;
while(j <= i) {
System.out.print("*");
j++;
}
System.out.println();
i++;
}
}
}
- for문의 초기화를 밖으로 빼고, for문의 조건식이 while문의 조건식이 됨.
- 증감식은 while문 안에.
두 개의 주사위를 던졌을 때, 눈의 합이 6이 되는 모든 경우의 수를 출력
package review02;
public class Ex06 {
public static void main(String[] args) {
for (int i = 0; i < 6; i++) { // dice1
for (int j = 0; j < 6; j++) {
if (i + j == 6) {
System.out.println(i + ", " + j);
}
}
}
}
}
- 숫자로 이루어진 문자열 str이 있을 때, 각 자리의 합을 더한 결과를 출력
package review02;
public class Ex09 {
public static void main(String[] args) {
String str = "12345";
int sum = 0;
// 아스키코드. 0은 48
for(int i = 0 ; i < str.length() ; i++) {
sum += str.charAt(i)-48;
System.out.println(str.charAt(i));
}
System.out.println("sum=" + sum);
}
}
- int타입의 변수 num 이 있을 때, 각 자리의 합을 더한 결과를 출력
(문자열로 처리하지 말고 숫자로만 처리.)
package review02;
public class Ex10 {
public static void main(String[] args) {
int num = 12345;
int sum = 0;
while(num > 0) {
sum += num % 10;
num = num / 10;
}
System.out.println("sum=" + sum);
}
}
for문이 아니라 while이었군...
- 피보나치(Fibonnaci) 수열(數列)은 앞을 두 수를 더해서 다음 수를 만들어 나가
는 수열이다. 예를 들어 앞의 두 수가 1과 1이라면 그 다음 수는 2가 되고 그 다음 수는
1과 2를 더해서 3이 되어서 1,1,2,3,5,8,13,21,... 과 같은 식으로 진행된다. 1과 1부터
시작하는 피보나치수열의 10번째 수는 무엇인지
package review02;
public class Ex11 {
public static void main(String[] args) {
// 피보나치 수열 시작의 첫 두 숫자를 1, 1로.
int num1 = 1;
int num2 = 1;
int num3 = 0; // 세번째 값
// 1, 1, 2, 3, 5, 8, 13, 21, 34, 55
System.out.print(num1 + "," + num2);
for(int i = 0 ; i < 8 ; i++) {
num3 = num1 + num2; // 2
System.out.print("," + num3);
num1 = num2;
num2 = num3;
}
}
}
흠... num1 = num2;, num2 = num3; 이 잘 이해가 안 간다..
1+1 = 2
1+2 = 3
2+3 = 5
그러면 마지막 자리잡는 수는 1+2 값이다 라는 거죠
기존에 두번째 자리잡는 값은 연산이후 첫번째 자리로
기존에 세번째 자리잡는 값은 연산이후 두번째 자리로
자바 카페 댓글에서... 식은 이해가 갔다. 근데 이 식이 for문에 들어갔을 때가 좀 헷갈림.
출력에 for문 조건식을 문제에 있는 수(열 번째)로 하기. (i<8로 변경하지 않고!)
int num1 = 1;
int num2 = 0;
int num3 = 0;
for(int i = 0 ; i < 10 ; i++) {
num3 = num1 + num2;
// 1 + 0 = 1
// 0 + 1 = 1
// 1 + 1 = 2
// 1 + 2 = 3
// 2 + 3 = 5
System.out.print(num3 + ", ");
num1 = num2;
num2 = num3;
}
피보나치 수열 시작인 1 앞에 값이 더 있다고 생각하면 된다.
- 구구단의 일부분 출력하기. (가로 출력)
package review02;
public class Ex12 {
public static void main(String[] args) {
for(int i = 1 ; i <= 9 ; i++) {
for(int j = 1 ; j <= 3 ; j++) {
// int x = 0; // 단
// int y = 0; // 곱하는 숫자 (1,2,3 반복)
int y = i % 3 == 0 ? 3 : i % 3;
int x = (j + 1) + (i - 1) / 3 * 3;
if(x > 9) {
break;
}
System.out.print(x + "*" + y + "=" + x*y + "\t");
}
System.out.println();
if(i % 3 == 0) {
System.out.println();
}
}
}
}
- 주어진 문자열(value)이 숫자인지를 판별하기.
package review02;
public class Ex13 {
public static void main(String[] args) {
String value = "d12344";
char ch = ' ';
boolean isNumber = true;
// 반복문과 charAt을 이용해서 문자열의 문자를
// 하나씩 읽어서 검사.
for(int i = 0 ; i < value.length() ; i++) {
ch = value.charAt(i);
if(!(ch >= '0' && ch <= '9')) {
isNumber = false;
break; // 문자가 하나라도 발견되면 더 반복문 돌릴 필요가 없음.
}
}
if(isNumber) {
System.out.println(value + "는 숫자");
}
else {
System.out.println(value + "는 숫자가 아님.");
}
}
}
charAt이 '문자' 반환!!!
ch 변수를 이용해야 함.
- 1과 100사이의 값을 반복적으로 입력해서 컴퓨터가 생각한 값을 맞추면 게임 끝.
사용자가 값을 입력하면, 컴퓨터는 자신이 생각한 값과 비교해서 결과를 알려준다. 사용자가 컴퓨터가 생각한 숫자를 맞추면 게임이 끝나고 몇 번 만에 숫자를 맞췄는지 알려준다.
package review02;
import java.util.Scanner;
public class Ex14 {
public static void main(String[] args) {
// 1~100 사이의 임의의 값 얻어서 answer에 저장.
int answer = (int)(Math.random() * 100) + 1;
int input = 0; // 사용자 입력
int count = 0; // 시도 횟수
Scanner scanner = new Scanner(System.in);
do {
count++;
System.out.print("1~100 입력");
input = scanner.nextInt();
if(input < answer) {
System.out.println("더 큰 수 입력");
}
else if(input > answer) {
System.out.println("더 작은 수 입력");
}
else {
System.out.println("정답. 시도횟수: " + count);
break;
}
} while(true); // 무한반복
}
}
count++ 이랑 ++count랑 차이가 있을까? ++count로 해 봤을 때 결과는 제대로 나오긴 함.
- 회문수 구하기.
package review02;
public class Ex15 {
public static void main(String[] args) {
int num = 12345;
int copyNum = num;
int result = 0;
int tmp = 0;
while(true) {
result = num % 10; // 5
num /= 10;
tmp += result;
System.out.println(tmp);
if(num == 0) break;
tmp *= 10;
}
System.out.println(copyNum == tmp ? "회문수" : "회문수 아님.");
}
}
num은 반복문에서 사용되면서 값이 바뀌니깐 copyNum을 둔 것 같고..
5
50 + 4
540 + 3
이렇게 되어야 해서 tmp *=10 을 한 것..
'JAVA' 카테고리의 다른 글
15장- 입출력 I/O 끝 21. 02. 16. (0) | 2021.02.17 |
---|---|
15장- 입출력 I/O 21. 02. 15. (0) | 2021.02.15 |
11장- 컬렉션 프레임웍 21 . 02. 08. (0) | 2021.02.09 |
21. 01. 27. 03장- 연산자 (0) | 2021.01.27 |
02장- 변수 21. 01. 23. (0) | 2021.01.27 |