Java
제어문 - 반복문(for, while)
ZIAHO
2021. 9. 15. 17:37
- 반복문 : 제어문 중의 하나로 특정 문장들을 반복해서 수행하게 한다.
- 종류 : for문, while문
- 반복문을 사용하는 이유? -> 똑같은 문장을 여러번 출력한다고 했을 때, 여러번의 숫자가 커질수록 하나하나 코드를 작성하기 힘들뿐더러 수정해야 할 일이 생겼을 경우 수정이 간편하다.(유지보수가 쉽다)
- for문
- 기본형식
// for문의 기본형식 for(초기식; 조건식; 증감식) { 수행 될 문장; } // for(초기식; 조건식; 증감식) -> 초기식, 조건식 증감식은 for문이 몇번 반복실행할지 정해주는 내용 // 초기식 : for문에서 활용할 변수를 선언한다. -> 반복할 때 필요한 초기값을 설정하는 변수 // 조건식 : 반복문을 특정순간에 중단할 수 있게 하는 비교연산자 -> true면 실행, false면 중단 // * 초기식이나 증감식에서 사용하는 변수를 이용해서 조건식을 구성해야 한다. // 증감식 : 초기식에서 선언한 변수를 변경시키는 연산 // 실행 순서 : 초기식 -> 조건식 -> 수행 될 문장 -> 증감식 // 이후 조건식 -> 수행 될 문장 -> 증감식 반복 // 언제까지?? 조건식이 false가 될 때까지!!! // 기본 실습 // for문을 사용해서 "안녕하세요"를 100번 출력하기. for(int i=0; i<100; i++) { // i가 0값을 가지고 있는데, 100미만이 될 때까지 안녕하세요를 출력하고 1씩 증가한다. System.out.println("안녕하세요"); }
- for문 { } 내부에서 변수를 선언한다면?? -> 매번 초기화 된다 => 누적되야하는 값은 내부선언 하지 않는것이 좋다.
// for문 내부에서 변수를 선언한다면?? for(int i=0; i<3; i++) { String name = ""; // for문 내부에서 변수 선언 name += i // for문 {}내부에서 실행되는 내용은 매번 초기화가 된다. System.out.print(name + " "); } // 결과 : 0 1 2
- for문의 초기식에서 선언한 변수는 for문 외부에서 사용이 불가능하다.
- 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문 내부에서 사용이 가능하다. // 단, 같은 메소드 영역 내부에 한해서 }
- 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); // 종료 할 수 있는 조건이 없기 때문에 무한루프 발생!! }
- 실습해보자!!
// 사용자에게 문자열을 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문
- 기본형식
// while 기본형식 while(조건식) { // 조건식이 true이면 {}안의 문장을 수행한다. 수행될 문장; [증감식 or 분기문]; // 조건을 벗어나게 할 연산이 되어준다. } // while 기본예시 int i = 1; // 초기문 while(i <= 5) { // 조건식 -> 조건식이 true이면 {}안의 문장을 수행한다. System.out.println(i); // 수행될 문장 i++ // 증감식 } // 결과 1 2 3 4 5
- while 사용시기
- 로직에 따라 무한루프를 실행 할 때.
- 메소드의 값을 가지고 반복문을 실행 할 때.
// 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); }
- 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 프로그램 종료
- 기본형식
- for문