Java

제어문 - 반복문(for, while)

ZIAHO 2021. 9. 15. 17:37
  • 반복문 : 제어문 중의 하나로 특정 문장들을 반복해서 수행하게 한다.
    • 종류 : for문, while문
    • 반복문을 사용하는 이유? -> 똑같은 문장을 여러번 출력한다고 했을 때, 여러번의 숫자가 커질수록 하나하나 코드를 작성하기 힘들뿐더러 수정해야 할 일이 생겼을 경우 수정이 간편하다.(유지보수가 쉽다)   
      • for문
        1. 기본형식
          // for문의 기본형식
          for(초기식; 조건식; 증감식) {
          	수행 될 문장;
          }
          // for(초기식; 조건식; 증감식) -> 초기식, 조건식 증감식은 for문이 몇번 반복실행할지 정해주는 내용
          // 초기식 : for문에서 활용할 변수를 선언한다. -> 반복할 때 필요한 초기값을 설정하는 변수
          // 조건식 : 반복문을 특정순간에 중단할 수 있게 하는 비교연산자 -> true면 실행, false면 중단
          //			* 초기식이나 증감식에서 사용하는 변수를 이용해서 조건식을 구성해야 한다.
          // 증감식 : 초기식에서 선언한 변수를 변경시키는 연산
          
          // 실행 순서 : 초기식 -> 조건식 -> 수행 될 문장 -> 증감식
          // 이후 조건식 -> 수행 될 문장 -> 증감식 반복
          // 언제까지?? 조건식이 false가 될 때까지!!!​
          
          // 기본 실습
          // for문을 사용해서 "안녕하세요"를 100번 출력하기.
          for(int i=0; i<100; i++) { // i가 0값을 가지고 있는데, 100미만이 될 때까지 안녕하세요를 출력하고 1씩 증가한다.
          	System.out.println("안녕하세요");
          }​
        2. for문 { } 내부에서 변수를 선언한다면?? -> 매번 초기화 된다 => 누적되야하는 값은 내부선언 하지 않는것이 좋다.
          // for문 내부에서 변수를 선언한다면??
          for(int i=0; i<3; i++) {
          	String name = ""; // for문 내부에서 변수 선언
              name += i // for문 {}내부에서 실행되는 내용은 매번 초기화가 된다.
              System.out.print(name + " ");
          } // 결과 : 0 1 2​
        3. for문의 초기식에서 선언한 변수는 for문 외부에서 사용이 불가능하다.
        4. for문을 포함하고 있는 메소드영역 내에 선언된 변수는 for문에서 사용이 가능하다.
          for(int i=0; i<3; i++) {
          	int num = 3;
          	System.out.println(i); // 초기식에서 사용한 변수는 for문 내부에서 사용이 가능!
          }
          // System.out.println(num) // for문 내부에서 선언된 변수는 외부에서 사용이 불가능하므로 에러 발생
          
          ============================================================================================
          
          double d = 17.5;
          for(int i=0; i<5, i++) {
          	double d2 = 33.4;
              d += i; // for문 외부에서 선언된 변수는 for문 내부에서 사용이 가능하다.
              		// 단, 같은 메소드 영역 내부에 한해서
          }​
        5. for문에 사용하는 초기식, 조건식, 증감식은 필요에 따라 작성하지 않을 수 있다.
          // 초기식, 증감식을 사용하지 않는 경우
          int num = 3;
          for(; num=3; ) { // num값이 3이 될 경우 for문 종료
          	System.out.print("문자를 입력하세요(종료 : 3 입력) : ");
              num = sc.nextInt(); // 사용자가 3을 입력할 경우 for문 종료, 3이 아닐경우 반복 실행
              System.out.pritnln(num);
          }
          
          ========================================================================================
          // 조건식을 작성하지 않는 경우
          for(int i=0; ; i++) {
          	System.out.println(i); // 종료 할 수 있는 조건이 없기 때문에 무한루프 발생!!
          }​
        6. 실습해보자!!
          // 사용자에게 문자열을 5개 입력받고, 한번에 출력해보기
          Scanner sc = new Scanner(System.in);
          
          String temp = "";
          for(int i=0; i<5; i++) {
          	System.out.print("문자열을 입력하세요 : ");
          	temp += sc.nextLine() + "\n"; // temp변수에 입력받은 문자열을 누적한다.
              // for문 내부에서 변수를 선언하게 되면 반복하면서 같은 명의 변수를 선언할 수 없기 때문에 에러가 발생한다!
              // String temp += sc.nextLine(); -> 에러발생
          }
          System.out.println(temp);​
          
          // 결과
          문자열을 입력하세요 : 안녕하세요
          문자열을 입력하세요 : 오늘은
          문자열을 입력하세요 : 9월
          문자열을 입력하세요 : 15일
          문자열을 입력하세요 : 입니다.
          안녕하세요
          오늘은
          9월
          15일
          입니다.
          // 축구선수를 등록하는 기능을 만들어보자
          // 선수를 등록할 수를 입력받고 그 수만큼의 선수를 입력받고
          // 입력된 선수들을 한번에 출력하는 기능.
          // 선수 데이터 : 이름, 나이, 포지션, 국적
          Scanner sc = new Scanner(System.in);
          		
          System.out.println("=== 선수 등록 프로그램 ===");
          System.out.print("몇명의 선수를 등록하시겠습니까? : ");
          int playerNum = sc.nextInt();
          String player = "";
          		
          for(int i=0; i<playerNum; i++) {
          	sc.nextLine();
          	System.out.println("=== 선수 정보 입력 ===");
          	System.out.print("선수 이름 : ");
          	String name = sc.nextLine();
          	System.out.print("선수 나이 : ");
          	int age = sc.nextInt();
          	System.out.print("선수 포지션 : ");
          	String position = sc.next();
          	System.out.print("선수 국적 : ");
          	String nation = sc.next();
          			
          	player += "이름 : " + name + " 나이 : " + age + " 포지션 : " + position + " 국적 : " + nation + "\n";
          }
          System.out.println("=== 선수 정보 확인 ===");
          System.out.println(player);
          
          // 결과
          === 선수 등록 프로그램 ===
          몇명의 선수를 등록하시겠습니까? : 2
          === 선수 정보 입력 ===
          선수 이름 : 손흥민
          선수 나이 : 30
          선수 포지션 : 공격수
          선수 국적 : 대한민국
          === 선수 정보 입력 ===
          선수 이름 : 김민재
          선수 나이 : 24
          선수 포지션 : 수비수
          선수 국적 : 대한민국
          === 선수 정보 확인 ===
          이름 : 손흥민 나이 : 30 포지션 : 공격수 국적 : 대한민국
          이름 : 김민재 나이 : 24 포지션 : 수비수 국적 : 대한민국​
          // 문자열을 입력받고
          // 입력받은 문자열 중 영어문자열이 아닌 글자는 몇개인지 출력하고,
          // 영어문자열 중 대문자는 몇개인지 출력하기
          Scanner sc = new Scanner(System.in);
          		
          System.out.print("문자열을 입력하세요 : ");
          String temp = sc.nextLine();
          
          int count = 0;
          int upperCaseCount = 0;
          
          for(int i=0; i<temp.length(); i++) {
          	char alpha = temp.charAt(i);
          	if (!('A' <= alpha && alpha <= 'Z' || 'a' <= alpha && alpha <= 'z')) {
          		count++;
          	}
          }
          for(int i=0; i<temp.length(); i++) {
          	char alpha = temp.charAt(i);
          	if('A' <= alpha && alpha <= 'Z') {
          		upperCaseCount++;
          	}
          }
          System.out.println("총 글자 수(띄어쓰기 포함) : " + temp.length());
          System.out.println("영어문자열이 아닌 글자의 수(띄어쓰기 포함) : " + count); 
          System.out.println("대문자의 수 : " + upperCaseCount);​
          
          // 결과
          문자열을 입력하세요 : Apple은 맛있어
          총 글자 수(띄어쓰기 포함) : 10
          영어문자열이 아닌 글자의 수(띄어쓰기 포함) : 5
          대문자의 수 : 1
      • while문
        1. 기본형식
          // while 기본형식
          while(조건식) { // 조건식이 true이면 {}안의 문장을 수행한다.
          	수행될 문장;
              [증감식 or 분기문]; // 조건을 벗어나게 할 연산이 되어준다.
          }
          
          // while 기본예시
          int i = 1; // 초기문
          while(i <= 5) { // 조건식 -> 조건식이 true이면 {}안의 문장을 수행한다.
          	System.out.println(i); // 수행될 문장
              i++ // 증감식
          }
          // 결과
          1
          2
          3
          4
          5​
        2. while 사용시기
          1. 로직에 따라 무한루프를 실행 할 때.
          2. 메소드의 값을 가지고 반복문을 실행 할 때.
            // while 사용시기
            // 1. 로직에 따라 무한루프를 실행할 때
            while(true) { // for(;;) -> for문에 비해 무한루프 문장을 만들기 간결하다.
            	System.out.println("무한루프")
                // 조건식을 빠져나갈 연산이 없기 때문에 "무한루프"가 무한으로 출력된다.
            }
            
            // 2. 메소드의 값을 가지고 반복문을 실행할 때
            Scanner sc = new Scanner(System.in);
            String msg = "";
            while(!msg.equals("끝")) { // 사용자의 입력값이 "끝"일 경우에 조건식을 빠져나간다.
            	msg = sc.nextLine();
                System.out.println(msg);
            }​
        3. while 실습해보기
          // 원하는 만큼 실행할 수 있는 계산기를 만들어 보자.
          // while문을 이용할것
          // 연산 이후에 계속 사용할 것인지, 종료할것인지 물어보고
          // 사용자가 종료를 누르면 1.계속 2.종료 선택할 수 있게 할것.
          // 종료시에는 "프로그램 종료" 출력
          Scanner sc = new Scanner(System.in);
          		
          int choice = 1;
          while(choice == 1) {
          	System.out.println("===== 계산기 프로그램 =====");
          	System.out.print("첫번째 수 입력 : ");
          	int a = sc.nextInt();
          	System.out.print("두번째 수 입력 : ");
          	int b = sc.nextInt();
          	System.out.print("원하는 연산을 입력하세요(+, -, *, /) : ");
          	char op = sc.next().charAt(0);
          	switch(op) {
          		case '+' : System.out.println(a + " + " + b + " = " + (a + b)); break;
          		case '-' : System.out.println(a + " - " + b + " = " + (a - b)); break;
          		case '*' : System.out.println(a + " * " + b + " = " + (a * b)); break;
          		case '/' : System.out.println(a + " / " + b + " = " + (a / b)); break;
          		default : System.out.println("잘못 입력하셨습니다.");
          	}
          	System.out.print("계속 사용하시겠습니까?(1.계속 2.종료) : ");
          	choice = sc.nextInt();
          }
          System.out.println("프로그램 종료");
          
          // 결과
          ===== 계산기 프로그램 =====
          첫번째 수 입력 : 3
          두번째 수 입력 : 7
          원하는 연산을 입력하세요(+, -, *, /) : +
          3 + 7 = 10
          계속 사용하시겠습니까?(1.계속 2.종료) : 1
          ===== 계산기 프로그램 =====
          첫번째 수 입력 : 3
          두번째 수 입력 : 4
          원하는 연산을 입력하세요(+, -, *, /) : *
          3 * 4 = 12
          계속 사용하시겠습니까?(1.계속 2.종료) : 2
          프로그램 종료​