[제어문]조건문, 반복문, 분기문

EUNJI LEE·2023년 4월 10일
0

JAVA

목록 보기
3/12

조건문 : if, switch

if문

조건에 따라 다른 문장이 실행될 수 있도록 수행하는 역할을 한다.
if문은 조건의 범위 안에서 결과값을 반환하기 때문에 조건식이 범위로 되어있을 때 주로 사용한다.

if (조건식) { true일 때 실행 문장; } else { false일 때 실행 문장; }

if문 { } 안에는 변수 선언, 연산자, 메소드 호출, 조건문, 반복문을 넣어 사용할 수 있다.

//입력한 값이 10보다 큰지 작은지 구분해서 출력.
int num=sc.nextInt(); //사용자로부터 값을 받는다.
if (num>10) {//true 일때 실행할 문장을 입력.
      System.out.println("10보다 큰 수를 입력하셨습니다.");
}else {//false일때 실행할 문장을 입력
      System.out.println("10보다 작은 수를 입력하셨습니다.");
}

//입력받은 아이디가 admin이고 패스워드가 1234면 관리자 로그인 성공 출력.
System.out.print("ID : ");
String id=sc.next();
System.out.print("PW : ");
String pw=sc.next(); //특수문자, 알파벳도 받을 수 있도록 문자열로 받는다.

if (id.equals("admin")&&pw.equals("1234")){
   System.out.println("관리자 로그인 성공");
}else {
   System.out.println("관리자가 아닙니다.");
}
💡 `else{ }` 부분은 생략이 가능하다. 조건에 맞지 않는 값이 입력되면 아무런 실행도 하지 않도록 생략할 수 있다. 다만, 사용자가 조건에 해당하는 값을 입력하지 않았다는 것을 확인할 수 있게 출력해주는 것이 보기 편하다.

✅ 문자열 비교 연산은 equals() 기능 활용할 것. 아이디와 패스워드를 둘 다 만족하는 조건을 만들기 위해서 && 연산자 사용해서 조건식을 작성한다.

위의 첫번째 코드를 작성했을 때 10을 입력 받으면 실행될 값이 없기 때문에 10을 입력 받으면 “10을 입력하셨습니다.”라는 메시지를 출력하는 조건을 하나 더 넣어줄 수 있다. else if를 사용해서 조건을 하나 더 넣어준다.

if ( 조건식1) { 조건식1이 true면 실행 }
else if (조건식2) { 조건식1은 false, 조건식2는 true }
else { 조건식1,2가 false }

if부터 else까지가 하나의 그룹으로 취급하기 때문에 else if만 따로 선언해서 사용할 수 없다. else if 자체가 if(조건식) 을 만족하지 않고 다른 조건식을 만족하는 경우에 실행하기 때문이다.

int num=sc.nextInt(); //사용자로부터 값을 받는다.
if (num>10) {//true 일때 실행할 문장을 입력.
      System.out.println("10보다 큰 수를 입력하셨습니다.");
}else if(num<10) {//if조건은 만족하지 않고, else if조건을 만족할 때 실행할 문장을 입력
      System.out.println("10보다 작은 수를 입력하셨습니다.");
}else { //10보다 큰 값도 아니고 10보다 작은 값도 아닌 정수는 10뿐이다.
      System.out.println("10을 입력하셨습니다.");
}
  • if문의 중복 사용 if문 안에 if문을 넣어서 중복 해서 사용이 가능하다. 선택지가 여러 개인 회원 가입 화면에 적용해서 풀어보면 아래와 같다.
    1. 성인/미성년자를 구분하고 성인만 가입할 수 있도록 만든다.

    2. 성인은 내/외국인을 구분하고 내국인이면 바로 가입하고 외국인이면 외국인 등록번호가 있을 때만 회원 가입을 할 수 있도록 만든다.

    3. 단, 선택지를 잘못 입력했을 때 “잘못 입력하셨습니다” 라는 안내 메시지를 띄워준다.

    4. 회원 정보는 이름,주소를 받고 외국인은 외국인 등록번호를 추가로 받는다.

      System.out.print("나이 입력 : ");
      		int age=sc.nextInt(); //첫 기준이 되는 나이를 입력 받아 저장한다.
      		
      		if (age>19) { //성인일때
      			System.out.println("내국인입니까?");
      			System.out.println("1. Yes");
      			System.out.println("2. No");
      //나이가 성인이라면 내/외국인을 판별할 수 있도록 한다.
      			System.out.print("번호 입력 : ");
      			int adualt=sc.nextInt();
      //입력을 간단하게 할 수 있도록 선택지를 메시지로 띄운 뒤, int형으로 리터럴을 받는다.
      			
      			if (adualt==1) { //내국인 일때
      //내국인이면 바로 회원 정보를 받는다.
      				System.out.print("이름 입력 : ");
      				String name=sc.next();
      				System.out.print("주소 입력 : ");
      				sc.nextLine();
      				String address=sc.nextLine();
      				System.out.println("계정(내국인) 이름은 "+name+", 주소는 "+address);
      //받은 정보를 확인.
      				
      			}else if(adualt==2) { //외국인 일때
      				System.out.println("외국인 등록 번호가 있나요?");
      				System.out.println("1. Yes");
      				System.out.println("2. No");
      //외국인 등록 번호가 있는지 판별한다.
      				System.out.print("번호 입력 : ");
      				int number=sc.nextInt();
      				
      				if (number==1) { //외국 등록번호가 있을때
      					sc.nextLine(); //버퍼 비우기.
      					System.out.print("등록번호 : ");
      					String num=sc.nextLine();
      					System.out.print("이름 입력 : ");
      					String name=sc.nextLine();
      //외국 이름은 띄어쓰기 포함해서 받을 수 있도록 한다.
      //name 변수를 다시 선언하고 싶지 않다면 if문 밖에서 선언후 변수만 불러와서 사용할 수 있다.
      					System.out.print("주소 입력");
      					String address=sc.nextLine();
      					System.out.println("계정(외국인) 등록번호는 "+num+", 이름은 "+name+", 주소는 "+address);
      //받은 정보 확인.
      
      				}else if(number==2) { //외국 등록번호가 없을때
      					System.out.println("등록번호가 없으면 회원가입이 불가능합니다.");
      //회원 가입 불가 메시지를 출력.
      
      				}else { //1,2외에 다른 번호 입력했을 때(외국인 등록번호 유무 구분)
      					System.out.println("잘못 누르셨습니다.");	
      				}
      			}else { //1,2외에 다른 번호 입력(내/외국인 구분)
      				System.out.println("잘못 누르셨습니다.");
      			}
      		}else {//나이가 19살이하일때
      			System.out.println("미성년자는 회원가입이 불가능합니다.");
      		}

      if문이 총 3개가 사용된 예시다. 중복 사용하기 위해 복잡하게 꼬아서 만들었지만, 선택지를 구분하고 중괄호{ }가 어디서 끝나는지 잘 확인할 수 있으면 오류 없이 실행하기에 크게 어렵지 않다.

      조건 정리가 어렵다면 마인드맵을 그리는 것처럼 문항을 가볍게 정리해서 이해해보는 것도 괜찮다. (나중에도 그려서 활용할 수는 없겠지만 if문을 이해하는 과정까지는 나쁘지 않은 것 같다.)

      💡 `중괄호{ }` 안에서 선언한 변수는 해당 중괄호{ } 안에서만 사용할 수 있다. 때문에 위에 코드에서 외국인의 이름을 받는 변수를 내국인 이름을 받는 변수와 이름을 똑같이 해서`Stringname=sc.next();` 으로 선언 했어도 오류가 일어나지 않는다. 변수를 한 번만 선언해서 사용하고 싶을 땐 변수를 사용할 중괄호{ } 밖에서 선언하면 선언한 변수 아래에 있는 중괄호{ } 에서는 사용할 수 있다.

switch문

정해진 값에 대해서 분기 처리할 때 사용하는 조건문이다.
switch문은 정해진 값에 따라서 결과값을 반환한다. 때문에 메뉴 기능을 구현할 때 많이 사용한다.

switch ( 변수 자리 ) { case 값 : ...; break; ... default: …; break; }

switch의 괄호{ } 안에는 변수, 변수의 연산 결과를 작성한다. 때문에 int, String, char 자료형만 가능하다.

System.out.println("===menu===");
System.out.println("1. 마라탕");
System.out.println("2. 마라샹궈");
System.out.println("3. 꿔바로우");

System.out.println("메뉴 번호 : ");
int order=sc.nextInt();
//사용자로부터 메뉴 번호를 입력 받는다.
int price=0; //고른 메뉴의 가격을 표시할 변수를 선언.
String menu=" "; //고른 메뉴의 이름을 넣을 변수 선언.

switch (order) {
case 1 : menu="마라탕"; price=10000; break;
case 2 : menu="마라샹궈"; price=15000; break;
case 3 : menu="꿔바로우"; price=25000; break;
default : break;
}
System.out.println(menu.equals(" ")?"번호를 다시 골라주세요":menu+"는 "+price+"원입니다.")
//1~3의 값을 입력하면 000은 0000원입니다 출력.
//1~3외의 값을 입력하면 번호를 다시 골라주세요 출력.
💡 `break;` 는 생략해도 오류 발생으로 프로그램이 실행이 안 되는 건 아니지만 생략했을 경우 바로 다음 case를 실행한다. case1의 결과값이 나오고 바로 case2의 결과값까지 같이 반환 되는 것이다. break;를 만나야 switch문을 종료할 수 있다.
  • 참고 ✅ 위에 코드에서 `default` 는 반환하는 것 없이 break; 만 실행 돼서 사실 생략해도 된다. 형식 전체를 생략 없이 표현하기 위해서 굳이 넣어두었다. default에서도 실행하는 문장을 넣고 싶으면 `default : menu=”없음”; break;` 를 작성해주고 아래 삼항 연산자의 조건식을 `menu.equals(”없음”)` 으로 줄 수 있지만… 따로 쓰지 않았다. 어차피 switch문 밖에서 변수를 초기화 해줬고 case 값에 해당하는 데이터가 아니면 초기값이 그대로 남아 있기 때문에 손 아프게 작성해줄 필요는 없다.

반복문 : for,while

특정 코드를 반복해서 조건을 만족하는 만큼 반복해서 수행하도록 한다.

for문

for문 내부에는 변수 선언, 연산자, 조건문 다 사용 가능하다.

for ( 초기식; 조건식; 증감식) { 수행될 코드; }

초기식에는 반복되는 횟수를 저장할 변수를 초기화해서 선언해준다. 조건식에는 반복을 실행할지 말지에 대한 조건을 넣는다. 조건의 결과에 따라 true : 실행 / false : 중단 으로 반환한다. 증감식에는 초기식에서 선언한 변수의 값을 수정하는 연산을 넣는다.

💡 실행 순서 : 초기식 ➡️ 조건식 ➡️ { } 문장 ➡️ 증감식 ➡️ 다시 조건식 실행.

//1~10까지 순서대로 출력
for (int i=1; i<=10; i++){//i는 1부터 시작해서 10이하까지 실행. 1씩 증가.
  System.out.print(i+" "); //1 2 3 4 5 6 7 8 9 10 출력
}

//임의의 정수 4개를 입력 받고 누적한 값을 출력
int total=0; //누적 받을 변수 선언
for(int i=0;i<4;i++) { //i는 1부터 출력해야되는 것이 아니라면 0으로 선언하는 것이 기본적이다.
//for문 안에 변수를 선언하면 for문이 실행되면서 변수가 계속 초기화된다.
			System.out.print("숫자 입력 : ");
			total+=sc.nextInt();
			System.out.println(total); //누적된 값 출력
}
  • 초기식, 조건식, 증감식의 생략 for문의 초기식, 조건식, 증감식 생략이 가능하다.
    int count=0; //기준값을 for문 밖에 선언
    
    for (;count<10;count++) {//초기식 생략
    			System.out.println(count);
    }//0~9까지 10번 반복 실행
    
    for(;;count++) {//조건식 생략
    			System.out.println(count);
    }	//무한 루프가 발생한다. ->멈추는 순간을 입력 해주지 않았다.
    
    for (;msg.equals("exit");) {//증감식 생략
    			System.out.println("메시지 입력 : ");
    			msg=sc.next();
    			System.out.println(msg);
    }//증가값이나 초기값이 따로 없고 msg 변수에 "exit" 를 입력 받으면 종료한다.
  • for문과 if문의 중복 사용 구현하려는 기능에 따라서 반복문과 제어문을 중복 해서 사용할 수 있다. 원하는 값이 나오면 프로그램을 바로 종료하지만, 원하는 값이 나오지 않았을 때는 틀린 값을 계속 누적하고 프로그램을 다시 실행시키려고 할 때 사용해볼 수 있다.
    String msg=""; //for 조건식에 넣을 것은 그 이전에 선언.
    String total="";
    
    for (;!msg.equals("exit");) { //조건식이 true일 때 실행할 수 있도록 부정 연산자 사용
       System.out.print("명령 메시지 입력 : ");
     	 msg=sc.nextLine(); //문장은 공백을 포함해서 받을 수 있도록 한다.
     			if(!msg.equals("exit")) { //만약 msg가 exit 아니면
     				total+=msg+" "; //total에 msg에 저장된 값을 누적한다.
     			}
     			System.out.println(total); //exit를 뺀 누적값을 출력
     		}
    💡 for문을 사용하면 누적한 값을 출력하고 다시 입력 받는 기능을 구현할 수 있지만, 원하는 값이 아닐 때 다시 입력 받고, 마지막 입력값은 빼서 출력하는 기능을 구현할 수는 없다. 만약 `msg=sc.nextLine();` 아래에 `total+=msg+" ";` 을 작성했으면 “exit”까지 포함한 누적값을 출력 받을 수 있다. ”exit”아닌 값을 받아서 for문 재실행 ➡️ “exit”를 입력 받음 ➡️ if 조건에 맞지 않아서 실행하지 않고(total에 누적x) 넘어감 ➡️ for문 종료 이런 순서라고 보면 된다.

while문

특정 조건에서 반복이 일어날 때 주로 사용한다. 의도적으로 무한 루프를 만들 때도 사용할 수 있다.

while( 조건문 ) { 조건이 true일 때 반복 실행할 코드; }

for문처럼 초기식, 조건식, 증가식이 ( )안에 전부 존재하지는 않지만 프로그램 실행을 위해 컴퓨터에게 실행에 필요한 입력은 필요하다.

//1부터 10까지 출력
int i=0; //초기값 지정 ->초기식을 설정하는 것과 같다.
while (i<10) {//i가 10보다 작을 때 실행한다.
  System.out.print(i+" "); //1 2 3 4 5 6 7 8 9 출력
  i++; //while문이 i가 증가함에따라 종료될 수 있게 증감식을 넣어준다.
}

//무한 루프 생성
while (true) {//true일 때 { }안의 내용을 실행하기 때문에 고정으로 true를 주면 계속 실행한다.
  System.out.println("무한 루프입니다."); //문장이 종료 없이 계속 실행된다.
}
  • while문 안에 if문을 중첩 실행
    //"exit"라는 문자열을 입력받을 때까지 계속 입력을 받고 입력 받은 값을 누적해서 출력
    String msg="";
    String total=""; //while문 밖에서 누적값을 출력할 변수
    while (!msg.equals("exit")){ //exit가 아닐때 실행
      System.out.println("메시지 입력 : ");
      msg=sc.nextLine();
        if(msg.equals("exit"){
           total+=msg;
        }
    }
    System.out.println(total);

do { 실행되는 문장; } while (조건식);

do{ } 안에 문장을 먼저 한 번 실행하고 while의 조건이 true 값일 때 do{ } 안의 문장을 수행한다. false이면 그대로 종료된다.

💡 while문과 차이점은 `do~while`은 조건식이 true 값이 아니더라도 { }안에 문장이 무조건 한 번은 수행이 된다는 것이다. do~while문도 마찬가지로 { }안에 조건을 벗어나게 할 연산이 필요하다.

정수 두 개를 입력 받아서 연산을 실행하고 계속 실행할지 말지 선택 받아서 프로그램 실행/종료를 수행하는 기능을 구현해보면 아래와 같다.

System.out.println("==계산기==");
int answer=0;
do{
System.out.println("정수1 입력 : ");
int num1=sc.nextInt();
System.out.println("정수2 입력 : ");
int num2=sc.nextInt();

System.out.println("===계산===");
System.out.println("1. 더하기");
System.out.println("2. 빼기");
System.out.println("3. 곱하기");
System.out.println("4. 나눈 몫");
System.out.println("5. 나눈 나머지");
System.out.print("번호 : ");
int oper=sc.nextInt();

switch(oper){
      case 1 : total=num1+num2; break;
 	 		case 2 : total=num2-num2; break;
 	 		case 3 : total=num1*num2; break;
 	 		case 4 : total=num1/num2; break;
 	 		case 5 : total=num1%num2; break;
}
System.out.println(total);

while(answer!=2&&answer!=1) {
System.out.println("계산기를 실행하시겠습니까? 1.Yes/2.No");
answer=sc.nextInt();
  if(answer==1||answer==2) {System.out.println("1 혹은 2만 입력 가능합니다!");
  }
}while(answer==1);

분기문 : break, continue

특정 조건에서 반복문의 실행을 통제하기 위해서 사용할 수 있다.

continue; : 반복문에서 continue문을 만나면 아래 코드를 생략하고 증감식으로 넘어간다.
break; : 반복문에서 break문을 만나면 종료된다.


//continue
for(int i=0;i<10;i++) {
 	if(i%2==0) continue; //continue를 만나면 아래 구문을 생략한다
 	//짝수이면 ->continue 만나서 생략된다.
 	System.out.println(i); //1 3 5 7 9 출력
}

//break
for(int i=2;i<10;i++) {
	for(int j=1;j<10;j++) {
 	  if(i%2==0) break ; //{ } 생략
 		//break;를 만나면 가장 가까이 있는 반복문만 종료한다.
 	System.out.print(i+"x"+j+"="+(i*j)+" ");
//2단일 땐 j 변수 사용하는 for문은 생략하게 된다.
//i의 값이 홀수일 때 구구단을 출력.
//3x1=3 3x2=6 ...
}
  • break; 대신 continue; 사용
    for (int i=2;i<10;i++) {//2단부터 시작
     	for(int j=1;j<10;j++) {
     		if(j%2==0) continue;
        //break를 넣으면 가까이 for문 자체가 종료한다.
     		System.out.print(i+"x"+j+"="+(i*j)+" "); //if가 true일때 continue; 때문에 생략
     	}
    }
    💡 위에 break; 예시 코드를 작성한 것과 똑같지만 break 자리에 continue; 넣으면 실행 결과 자체는 동일하게 출력 되지만 continue;는 내부 for문은 종료하지 않고 계속 실행하기 때문에 처리 횟수가 증가한다.

💡랜덤으로 숫자를 출력 받는 법

  1. Math.random() 기능

    임의의 숫자를 출력한다. 숫자는 0부터 1사이의 실수값이다.
    정수값으로 받아내고 싶을 땐 *10을 실행해서 int 자료형으로 강제 형변환 시켜줄 수 있다.

    System.out.println(Math.random);
    //ex)0.513487
    
    System.out.println((int)(Math.random()*10));
    //0~9 사이의 정수가 랜덤으로 출력
    //강제 형변환이 곱하기 연산보다 먼저 실행되므로 연산을 괄호로 묶어준다.
    
    //1~10까지 무작위 수 5개 출력
    for(int i=0;i<5;i++) { //다섯 번 반복
    	System.out.println((int)(Math.random()*10)+1);//1~10 사이의 무작위 수 출력.
    }
  2. Random 클래스

    임의의 숫자를 출력하는 클래스이다. 숫자는 정수 범위 안이다.
    Random r=new Random(); 으로 선언할 수 있다.

    Random r=new Random();
    System.out.println(r.nextInt()); //정수 범위
    System.out.println(r.nextInt(10)); //0~9
    System.out.println(r.nextInt(20)); //0~19
    System.out.println(r.nextInt(10)+1); //1~10
    //범위 사이에서 랜덤으로 값이 출력된다.
profile
천천히 기록해보는 비비로그

0개의 댓글