04-1 / 조건문: if문, switch문

  • 조건문은 조건식에 따라 다른 실행문을 실행하기 위해 사용된다. 종류는 if문과 switch문 2가지가 있다.

if문) 

if문은 조건식의 결과가 true, false이냐에 따라 실행문이 결정된다.

따라서 조건식으로는 true, false 값을 낼 수 있는 연산식이나 boolean 타입의 변수가 올수 있다.

 

조건식이 true면 블록({내용})을 실행하고 그렇지 않다면 실행하지 않고 넘어간다.

if (조건식){
	실행문A
}
실행문B

조건식이 true 경우 : 실행문 A → 실행문 B
조건식이 false 경우 : 실행문 B

 

 

 

if-else문) 

if문은 조건식의 결과에 따라 실행 블록을 선택할 수 있게 하는 if-else문이 있다.

if (조건식){
	실행문A
} else {
	실행문B	
}
실행문C

조건식이 true 경우 : 실행문 A → 실행문 C
조건식이 false 경우 : 조건식 false → 실행문 B → 실행문C

 

 

 

if-else if-else문) 

조건문이 여러개인 if문도 있다.

if블록과 else블록 사이에 else if 블록을 넣음으로써 여러조건식 중 true인 블록만 실행하고 if문을 벗어나는 조건문이다.

if (조건식1){
	실행문A
} else if (조건식2){
	실행문B	
} else if (조건식3){
	실행문C
} else {
	실행문D
}
실행문E

(앞에 조건식을 거쳐 false가 되면 그다음 조건식으로 넘어가는 방식)

조건식1이 true 경우 :                                                     실행문 A → 실행문 E

조건식1이 false 이면서    조건식2가 true 경우 :    조건식1 false → 실행문 B → 실행문E
조건식1,2가 false 이면서 조건식3이 true 경우 :    조건식1 false 조건식2 false 실행문 C → 실행문E

조건식1,2,3 모두 false인 경우:                                      조건식1 false 조건식2 false 조건식3 false 실행문 D → 실행문E

 

 

if문을 이용하여 무작위 숫자에 대한 조건문 만들어보기) 

 

1. 임의의 정수를 뽑는 함수 Math.random() 을 사용

double randomNo = Math.random();
System.out.println(randomNo);

// 0.9533989939956973
// 0.4139816992085926
// 0.26388711048064784
// 매번 값이 다르다
0.0 <= Math.random() < 1.0

이 함수는 0.0 에서 1.0사이의 double타입의 난수(=랜덤한 수)를 리턴한다. (다만 0.0은 포함되나 1.0은 포함되지 않는다)

 

자신이 원하는 숫자와 자리수에 맞춰 수를 곱하고 캐스팅 연사자 (int)로 형 변환을 시키면 원하는 정수값을 얻을 수 있다.

0이상 60 미만 사이 정수값을 얻고싶으면 60을 곱하여 적용하면 되고

0.0 * 60 <= Math.random() * 60 < 1.0 * 60

1이상 60 이하 사이의 값을 얻고 싶다면 이에 +1를 적용하면 된다.

0.0 * 60 +1 <= Math.random() * 60 +1 < 1.0 * 60 +1
int randomNo = (int)(Math.random() * 60 + 1);

 

이를 이용한 if문 작성

int diceNo = (int)(Math.random() * 6 + 1);

if (diceNo == 1){
    System.out.println("1번");
} else if (diceNo == 2) {
    System.out.println("2번");
} else if (diceNo == 3) {
    System.out.println("3번");
} else if (diceNo == 4) {
    System.out.println("4번");
} else if (diceNo == 5) {
    System.out.println("5번");
} else {
    System.out.println("6번");
}

 

 

switch문) 

switch문은 변수의 값에 따라 실행문이 결정된다.

if문이 경우의 수가 true, false 두가지 뿐이기 때문에 경우의 수가 많아지면 else if가 많아지며 코드가 복잡해진다.

이때 switch문을 사용하면 간결해진다.

int diceNo = (int)(Math.random() * 6 + 1);

switch (diceNo){
    case 1:
        System.out.println("1번");
        break;
    case 2:
        System.out.println("2번");
        break;
    case 3:
        System.out.println("3번");
        break;
    case 4:
        System.out.println("4번");
        break;
    case 5:
        System.out.println("5번");
        break;
    default:
        System.out.println("6번");
}

중간에 break; 를 쓰는건 해당 case만 실행하고 switch문을 빠져나가기 위해서이다. 

break;가 없다면 그 다음 case들도 실행이 되며 다시 break;를 만나거나 switch문이 끝나기 전까지는 종료되지 않는다.

반대로 이를 이용해 두가지 케이스가 같은 실행문을 실행하게도 만들 수 있다.

char grade = 'B';

switch (grade){
    case 'A':
        System.out.println("A");
        break;
    case 'B':
    case 'b':
        System.out.println("B");
        break;
    case 'C':
        System.out.println("C");
        break;
    default:
        System.out.println("D");
}

// 대문자 B라 case B에 들어갔지만 break;가 없어 case b로 넘어가 실행하게 되어 
// 대문자 소문자 상관없이 동일한 처리를 하는 모습

 

 

 

 

 


04-2 / 반복문: for문, while문, do-while문

  • 반복문은 어떤 작업(코드)를 반복적으로 실행되도록 할 때 사용되며 종류에는 for문, while문, do-while문이 있다.

for문) 

for문과 while은 서로 변환이 가능하여 둘 중 어느거나 선택해서 사용하면 좋지만

for문은 보통 반복 횟수를 알고 있는 때 주로 사용한다.

 

반복문을 사용하지 않고 변수에 1부터 100까지 하나씩 더한다면 100줄의 실행문이 필요할 것이다.

int sum = 0;
sum = sum + 1;
sum = sum + 2; 
sum = sum + 3;
...
sum = sum + 100;

 그러나 for문을 사용한다면 단 몇줄로 줄일 수 있다.

int sum = 0;
for (int i=0; i<=100; i++){
    sum += i;
}

코드가 간결해지면 개발시간을 줄일 수 있고, 에러가 날 확률도 줄어든다.

 

for문 실행 흐름은

for ( int i = 0 ; i <= 100 ;  i++ ) { ④ 실행문 }
① 초기화식 ② 조건식 ③ 증감식

1. ①초기화식에 들어가서 실행

2. ②조건식을 평가한다

     true면 블록내부의 ④실행문을 실행  (false면 블록을 실행하지 않고 for문 종료)

3. ④실행문이 다 실행 되면 ③증감식을 실행하고 다시 2번 과정으로 돌아간다.

 

 

초기화식, 조건식, 증감식은 무조건 1개씩 있어야하는 건 아니다

초기화식이 없는 경우도 있고

int i = 1;
for (; i<=100; i++) { ... }

초기화식, 조건식, 증감식이 둘 이상인 경우도 있다. (이런경우는 ,로 구분)

for(int i=0, int j=100; i<=50 && j>=50; i++, j--) {...}

 

* for문에서 주의할 점은

- 초기화식에 선언된 변수는 로컬 변수로 for문을 나가서 사용할 수는 없다.

- 초기화식에서 루프카운터 변수로 float 타입을 사용하지 말야한다. (0.1f 가 우리가 생각하는 실제값보다 살짝 크다 부정확)

 

* 중첩 for문

for문 안에는 또다른 for문을 내포할 수 있는데 이를 중첩 for문이라 한다. 

바깥 for문이 한번 돌때 안쪽 for문은 정해진 횟수대로 도는 방식으로 돌아간다.

//구구단 
for(int m=2; m<=9; m++){
    System.out.println("*** "+m+"단 ***");
    for(int n=1; n<=9; n++){
        System.out.println(m +" x "+n+" = "+ (m*n));
    }
}
// 바깥 for문이 한번 돌때 안쪽 for문은 9번 돈다

 

 

 

while문) 

while문은 조건에 따라 반복할 때 주로 사용한다. 

int sum = 0;
int i = 1;
while (i<=100){
	sum += i
}

 

while문의 실행 흐름은 

for ( i<10 ) { ② 실행문 }
① 조건식 (참이면 계속 반복)

1. ①조건식을 평가한다

    true면 ②실행문을 실행한다. (false면 while문 종료)

2.  ②실행문이 모두 실행되면 다시 1번으로 돌아간다. 

 

* while문 주의 할 점

- 내부에서 계속 누적되는 값을 갖는 루프 카운터 변수는 while문 시작 전에 미리 선언해야한다.

- 조건식에 항상 참인 값이나 연산식이 있으면 while문은 무한히 돌게 된다. 이때, while문을 종료시킬 수 있는 장치를 만들어야 하는 데 변수값을 false로 변환시키거나 break문을 사용해야한다.

 

 

do-while문) 

while문과 거의 동일하지만 단 한가지 다른점이 있다.

do-while문의 경우에는 실행문을 최초에 한번 무조건 돌리고 나서 조건식에 따라 실행문을 반복할지 여부를 따지게 된다.

 

do-while의 실행 흐름은

do { sum+=(i+1); i++; } while ( i<10 );
① 실행문 ② 조건식

1. 처음 실행시 ①실행문 우선 실행

2. ②조건식을 평가한다

3. true면 ①실행문을 실행한다 (false면 do-while문을 종료)

4. ①실행문이 모두 실행되면 2번 과정으로 돌아간다.

 

 

break문) 

break문은 반복문인 for문, while문, do-while문의 실행을 중지하는 역할은 한다. 또한 조건문인 switch문도 종료시킨다.

break문은 대개 if문과 같이 사용되어 특정 조건에 따라 for문과 while문을 종료할 때 많이 사용한다.

while(true){
    int num = (int) (Math.random() *6 +1);
    System.out.println(num);
    if (num==6){
        break;
    }
}
// while구문은 조건식 자체가 true라 무한히 돌 예정이지만 숫자 6이 나온다면 무한 루프를 탈출하게 된다.

 

반복문이 중첩되어 있을 경우 안쪽 반복문에서 break를 선언하면 안쪽 반복문만 종료되고

바깥 반복문은 종료되지 않는다.

바깥 반복문까지 종료하려면 바깥 반복문에 이름(라벨)을 붙여주고 break뒤에 바깥 반복문 이름을 붙여 사용하면

바깥 반복문까지 함께 종료된다.

Outter: for(char upper='A'; upper<='Z'; upper++){
    for(char lower='a'; lower<='z'; lower++){
        System.out.println(upper +"-"+ lower);
        if(lower=='g'){
            break Outter;
        }
    }
}
System.out.println("프로그램 종료");

 

 

continue문) 

continue문은 반복문에서만 사용되는데 블록내부에서 continue문이 실행되면

for문의 조건식, while문, do-while문의 조건식 으로 이동한다. 

continue문은 break문과 달리 종료하지 않고 계속 반복하나 특정 조건에서만 반복을 피하고 싶을 때 많이 사용한다.

for(int i=1; i<=10; i++){
    if(i%2==0){
        continue;
    }
    System.out.println(i);
}
// 1부터 10사이의 홀수 숫자만 출력

 

 

 

Chapter 4 확인문제 

2번)

for문을 이용해 1부터 100까지 정수 중 3의 배수의 총합을 구하는 코드를 작성하세요

더보기
int sum = 0;
for(int i=1; i<=100; i++){
    if(i%3==0){
        sum += i;
    }
}
System.out.println(sum);
// 1683

 

3번)

while문과 Math.random()메소드를 이용해 2개의 주사위를 던졌을 때 나오는 눈을 (눈1, 눈2) 형태로 출력하고,

눈의 하비 5가 아니면 계속 주사위를 던지고, 눈 합이 5이면 종료하는 코드를 작성하세요

더보기
while(true){
    int diceNo1 = (int)(Math.random() *6 +1);
    int diceNo2 = (int)(Math.random() *6 +1);

    System.out.println("("+diceNo1+","+diceNo2+")");

    if(diceNo1+diceNo2 == 5){
        break;
    }
}

 

4번)

중첩 for문을 이용하여 방적식 4x+5y=60의 모든 해를 구해서 (x,y)형태로 출력해보세요. 

단, x와 y는 10이하의 자연수입니다.

더보기
for(int x =1; x<=10; x++){
    for(int y=1; y<=10; y++){
        if((4*x)+(5*y)==60){
            System.out.println("("+x+","+y+")");
        }
    }
}

 

5번)

for문을 이용해서 다음과 같이 *을 출력하는 코드를 작성해보세요

*
**
***
****
더보기
for(int x =1; x<=4; x++){
	System.out.println("*".repeat(x));
}

 

6번)

for문을 이용해서 다음과 같이 *을 출력하는 코드를 작성해보세요

   *
  **
 ***
****
더보기
for(int x =1; x<=4; x++){
	System.out.println(" ".repeat(4-x)+"*".repeat(x));
}

 

7번)

while문과 Scanner을 이용해서 키보드로 입력된 데이터로 예금, 출금, 조회, 종료 기능을 제공하는 코드를 빈공간에 작성해보세요. 프로그램을 실행하면 다음과 같은 실행결과가 나와야합니다(Scanner의 nextLine()사용) ***

boolean run = true;
int balance = 0;
Scanner scanner = new Scanner(System.in);

while(run) {
    System.out.println("-----------------------------------");
    System.out.println("1.예금 | 2.출금 | 3.잔고 | 4.종료");
    System.out.println("-----------------------------------");
    System.out.println("선택 > ");

    빈공간

}

System.out.println("프로그램 종료");

//-----------------------------------
//1.예금 | 2.출금 | 3.잔고 | 4.종료
//-----------------------------------
//선택 > 1
//예금액>10000
//-----------------------------------
//1.예금 | 2.출금 | 3.잔고 | 4.종료
//-----------------------------------
//선택 > 2
//출금액>2000
//-----------------------------------
//1.예금 | 2.출금 | 3.잔고 | 4.종료
//-----------------------------------
//선택 > 3
//잔고>8000
//-----------------------------------
//1.예금 | 2.출금 | 3.잔고 | 4.종료
//-----------------------------------
//선택 > 4
//프로그램 종료
더보기
boolean run = true;
int balance = 0;
Scanner scanner = new Scanner(System.in);

while(run) {
    System.out.println("-----------------------------------");
    System.out.println("1.예금 | 2.출금 | 3.잔고 | 4.종료");
    System.out.println("-----------------------------------");
    System.out.println("선택 > ");

    String num = scanner.nextLine();
    String moneyString;
    int money = 0;

    switch(num){
        case "1":
            System.out.println("예금액>");
            moneyString = scanner.nextLine();
            money = Integer.parseInt(moneyString);
            balance += money;
            break;
        case "2":
            System.out.println("출금액>");
            moneyString = scanner.nextLine();
            money = Integer.parseInt(moneyString);
            balance -= money;
            break;
        case "3":
            System.out.println("잔고>" +balance);
            break;
        case "4":
            run = false;
            break;
    }
}
System.out.println("프로그램 종료");

 

 

+ Recent posts