language/java

4. 조건문(if, switch) 반복문 (for, while)

wooweee 2023. 3. 2. 18:10
728x90
  • 제어문 종류
    1. 조건문
      • [ if / if - else / if-else if /  중첩 if ]
      • [ switch ]
    2.  반복문 - 반복 횟수 알 때 for 문, 모를 때 while 문
      • for - for문, 중첩 for문
      • while -while문, do-while문, break문, continue

 

1.조건문

1.1. if문

  • 조건식 안 : 비교연산자, 논리 연산자로 구성 - true, false로 나와야 함
  • ex) str.equals(), <=, || , ==
if(조건식) {
	// 내가 쓰고 싶은 문장들 쓰기 ;
}

// 4) 가 컨벤션
1) if(x==0) ~~~; // 수행문이 한줄일 경우 {} 생략가능
2) if(x==0)
	~~~;
3) if(x==0){~~~;}
4) if(x==0){
	~~~;
}

주의
1) if(x=0){} // error. x=0에서 =은 대입연산자 이므로 사용 불가
2) if(x==0) // 1줄만 조건식으로 사용하겠다는 의미로 딱 1줄만 if문과 관련
	System.out.println("working with if");
    	System.out.println("tab된거와 별개로 if문과 별개로 항상 작동");

 

1.2. if - else

  • if 문의 조건식에서 false가 나올 때 수행할 수행문을 작성하기 위해 else가 존재. 없어도 상관없음
int x = 1;
if (x>0) 
    System.out.println("true");
    System.out.println("working?"); // error. if-else가 같이 움직이는데 {} 없을때는 1개의 수행문만 작동함
else 
    System.out.println("false");
    System.out.println("working?"); // 마찬가지로 if-else문과 별개
/*
if만 쓸때는 else가 없으니깐 [if() 수행문;] 이렇게 한 block으로 묶여서 그다음에 어떤 문장이 와도 상관없지만
[if() 수행문; else 수행문;] 이렇게 block일 때는 {}을 안쓸때 규칙을 지켜야함

헷갈리면 그냥 코드 치기. 빨간 밑줄 뜸 = 이런거 이해만 하고 외우지 말라는 대충 그런 뜻
*/

 

1.3. if - else if

  • 조건식을 2개 이상으로 구성하고 싶을 때 사용
  • 특징: 여러 조건식을 loop에서 true인 조건식을 만나면 그 조건식의 수행문을 수행하고 loop에서 벗어난다.
  • loop: if - else if의 block이라 생각하면 됨
// int score; // 값 초기화 굳이 안해도 됨
char grade = ' '; // 변수 와 ' '으로 초기화 // D로 작성하고 시작하면 조건문이 모두 false일때 D의 값이 나옴

System.out.print("put score > ");
Scanner scanner = new Scanner(System.in);
// Scanner 사용하려면 import java.util.Scanner; 첫 줄에 넣기

int score = scanner.nextInt();
// int가 없으면 초기에 char grade = ''; 같이 변수 지정 및 값 초기화가 필요

if (score >= 90) grade = 'A';             
else if (80 <= score && score < 90) grade = 'B'; 
else if (70 <= score && score <80) grade = 'C';
else grade = 'D'; // char grade의 초기화 값이 D 일때 생략 가능

System.out.println("Your score "+ grade +".");

 

1.4. 중첩 if 문

  • if 조건 안에 if-else문 집어넣는 것. 
  • ex) 90~100 점인 학생은 a 학점인데 이중 97~100 점이면 a+, 아니면 a0
  • 주의. 이때도 {} 없으면 else가 무슨 바깥 if문의 else 같지만 어쩌고 저쩌고,,, 걍 { } 사용
  • 내 생각: 중첩 if문 보단 ? 조건식 사용 할 것 

[backEnd/java] - 연산자(operator)- (조건식) ? a:b 

  • 중요개념
  • ex) 에서 조건에 결과에 따라 a값을 주고 이후에 + or 0의 값을 준다. 값을 주고 저장하기 위해서는 변수가 필요하다.
  • 변수는 메모리의 공간에 이름을 부여하고 어떤 type의 값이 올지 지정을 해주고 값을 기다리는 집같은 존재
  • 집이 없으면 값은 갈 곳이 없다. = 이 값을 추출해서 표현할 방법이 없다.

 

1.5. switch문

  • 조건이 많을 때 사용.
  • 규칙
    1. if 문은 true값을 만나면 loop에서 빠져나오지만 switch문은 break를 통해서만 loop에서 나옴.
    2. else 역할 = default . 굳이 안써도 되고 break 쓸 필요 X -> else는 모든 조건이 false일 때 마지막으로 수행하는 문장이라서 어차피 이거 끝나면 loop 종료됨
  • 제약 조건이 많아서 쓰기 힘들다.
  • 제약조건
    1. 조건식 결과 : 정수, 문자열
    2. case 값 : 정수, 상수, 문자, 문자열 가능   /   실수, 변수 error
형식
switch (조건식) {
	case 값1 : 
    	수행문
        break;
	default :
    	수행문
}

제약조건
1. 조건식 결과 : 정수, 문자열
2. case 값 : 정수, 상수, 문자, 문자열 가능   /   실수, 변수 error

<예제>
int month = 1;

switch(month) {
    case 3: 
    case 4: 
    case 5:
        System.out.println("spring.");
	break;
    case 6: case 7: case 8:
        System.out.println("summer.");
        break;
    case 9: case 10: case 11:
        System.out.println("authom.");
        break;
    default:
//	case 12: case 1: case 2:
        System.out.println("winter.");
}

 

 

2. 반복문

2.1 for

1) for(초기화; 조건식; 증감식)  {

        for문의 조건식이 true일 때, 수행할 문장  == 수행문

    }

조건식이 거짓이면 for 문을 빠져 나온다.

실행 순서 : 초기화 -> 조건식 -> 수행문 -> 증감식

// 초기화
// 변수의 타입이 동일할 때만 ,를 통해서 둘 이상의 변수를 초기화 가능.
for(int i=1,j=0; i<10; i++)

// 조건식
// 비교 연산자를 통해서 조건을 만듬, 변수가 2개 이상일 때 하나의 변수만 사용가능하고 2개 이상 사용하고 싶을 때 논리 연산자 이용
for(int i=1, j=1; i<10; c++)
for(int i=1, j=1; i<10 || j<20; c++)

// 증감식
// 반복문을 제어하는 변수의 값을 증가 또는 감소시키는 식 주로 i++ 사용, i*=3(3배씩 증가) 도 사용 가능
for(int i=1; i<10; i++) //1씩 증가
for(int i=1; i<10; i*=3) //3배씩 증가

// 생략 가능 부분(상식적으로 생각 해보자)
for(int i=1; i<10; ) // 증감은 필수 아님
for(int i=1; ;)  // 조건이 없어지면 항상 true로 간주  cf) while문은 아님
for(int i=1; ; i++)
for ( ; ; ) // for(true) 와 같음

int i=0;
for(;i<10;) // for(int i=0; i<10; ) 과 같음

2) 유형 연습

Q1) 1~n까지의 합 구하기

int sum = 0; // 0으로 초기화 필요
for(int i=1; i<=5 ;i++) {
System.out.println(sum +=i); 
// sum = sum +i 인데 sum 초기화를 안할 시 [변수 + int] 로 되서 error
}

Q2) random 정수 만들기 -5~5 사이 수
/*
(Math.random() 이용) - 로또 할 때 유용할 듯
공식: 0.0 <= Math.random() < 1.0 사이의 double type 값을 반환
1~3 사이의 수를 원한다
0.0*3 <= (int)(Math.random()*3) < 1.0*3 -> 0<=M<3
0.0*3 + 1 <= (int)(Math.random()*3) +1 < 1.0*3 + 1 -> 1<=M<4
*/
for(int i=1; i<=5; i++) {
System.out.println((int)(Math.random()*10)-5);
}

 

2.2. 중첩 for문

계단을 만들어보자
*
**
***
****

for(int i=1; i<=5; i++) {
// i를 중접 for문의 조건문에 넣고 false가 될때 까지 inside for문이 돌고 
// loop 빠져나오면 다시 outside for문 loop 돈다. outside for문에게 inside for문은 수행문일 뿐이다.
    for(int j=1; j<=i; j++) {
        System.out.print("*");
    }
    System.out.println();
}

 

2.3. while문

for문과 동일 하지만 생김새만 다름

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

 

증감식 헷갈리지 말자
int i =5;
while(i-- != 0){
	System.out.println(i); // 이때 결과값으로 4,3,2,1,0 이 나온다. for문과 달리 증감식에 영향을 받음
}
while(i != 0){ // 조건식을 풀어쓸 때 이렇게 됨. 먼저 조건 따지고
	i--;   // 1빼주고
    System.out.println(i); // 실행
}

 

유형연습

Q1. 1부터 n까지 더했을 때 100이 넘지 않는 수 구하기
int n = 1;
int sum = 1;
while(sum < 100) {
    System.out.println("1~" + n + " : " + sum);
    n++;
    sum = sum + n; // sum += n;
    /*
    ++n;
    sum = sum +n;  // sum += n;
    */
    /*
    sum += ++n; //후위형은 또 안됨 후위형은 sum += n; 이후에 n++하기 때문
    */
}

 

2.4. do-while문

앞에 while문 작동순서는 조건식 -> 수행문 이다. 이는 while 수행문이 false일 때 아예 실행되지 않는다는 의미.

그래서 do-while문으로 false true에 상관없이 수행문을 우선 실행하는 것.

뭔가를 질문을 하고 true / false 해야되는 경우 비밀번호 칠때 내가 옳게 한지 아닌지 상관없이 우선적으로 비밀번호 치세용 하는 문구 같은 경우 do-while 문 사용

do{
    // 수행문
} while (조건식);

int pw = 1234;
int try1 =0;

do{
    System.out.print("비밀번호 작성");
    Scanner scanner = new Scanner(System.in);
    try1 = scanner.nextInt();
	
    if(pw != try1) System.out.println("다시 하세요");
    
}while(pw != try1); // pw == try 가 false인 상황
    System.out.println("님이 맞군요");

 

2.5. break문

조건문 중 switch문과 같이 반복 loop에서 빠져나오게 하는 역할. while과 if를 같이 사용할 때 주로 쓰임

int sum=0;
int i=0;

// while
while(true) { // for와 달리 조건식 안에 true를 넣어야 함
    if(sum>100) break; // 100 넘어가면 loop 빠져 나옴
    sum += ++i;
}
System.out.printf("i = %d, sum = %d %n" ,i,sum);

 

2.6. continue 문

반복문 도중 반복문의 끝으로 이동시킴. 그렇다고 반복 loop에서 나가는게 아님

 

조건

  1. 반복문 (while, for, do-while)에서만 사용 가능
  2. for문에서 continue 만나면 증감식으로 이동,  작동순서 : 초기화 -> 조건문 -> 수행문-> 증감식(얘가 마지막)
  3. do-while에서 while 조건식으로 이동
for(int i=0;i <= 10;i++) {
    if (i%3==0) continue; 
    // 3의 배수이면 true 이후 continue 작동. 그럼 print 건너뛰기 i++ 로 이동
    System.out.println(i);
}