-> 실행문을 여러 번 실행하여 코드를 간결하게 하는 구문!
-> 형태
for(초기화식;조건식;증감식) {
실행문
}
-> 실행 과정
1. 초기화식을 실행
2. 비교 연산자를 사용한 조건식을 평가 후 true와 false여부 판단
(false의 경우 실행 종료)
3. 실행문 실행
4. 증감식 실행 (횟수 추가)
package ch04.sec04;
public class ForExam1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i=1;i<=10;i++) {
// for문 : 실행문을 원하는 횟수만큼 반복실행함
// (초기값;조건식;증감문){실행문}의 구조를 가짐
// 본 for문은 같은 실행문을 10번 실행하는 것
// 1부터 10까지 수를 나열하는 구문
System.out.print(i + " ");
}
}
}
package ch04.sec04;
public class For1to100Sum {
public static void main(String[] args) {
int sum = 0; // 값을 저장해야 함으로 초기값을 0으로 설정
int i;
for(i=1;i<=100;i++) {
sum += i; // sum = sum + i -> sum 값이 없을 경우 에러 발생
}
// 1부터 100까지의 수를 더하는 for문
// i의 초기값을 1로 설정
// i 값이 100과 같거나 작은지 확인 -> 이 결과가 false일 경우 실행 종료
// 실행문 실행
// i에 1이 더해짐 (실행 횟수도 1 추가)
System.out.println(sum);
}
}
-> for문 안에 for문이 들어간 형태로 내부의 for문을 실행하고 외부의 for문을 실행하는 구조!
-> 아래는 구구단을 출력하는 for문
package ch04.sec04;
public class Gugudan {
public static void main(String[] args) {
for(int x=2;x<=9;x++) {
System.out.println(x + "단");
for(int y=2;y<=9;y++) {
System.out.println(x + "x" + y + "=" + (x*y));
}
System.out.println();
}
// 구구단을 출력하는 문제
// for문안에 for문 사용 가능! (중첩 for문)
// 중첩 for문의 경우 가장 안쪽에 있는 for문부터 실행!
}
}
-> 실수 형태의 값은 오차범위가 존재하기 때문에 실수 형태의 값으로 for문을 실행시킬 경우 원하는 대로 반복되지 않을 가능성이 큼
-> for문에서 정수 형태의 값으로 실행 시키고 for 실행문 부분에 실수 형태의 값의 증감식을 진행하면 됨!
-> 물론 위와 같이 진행한다고 하더라도 실수 형태의 값이 오차범위가 있기 때문에 원하는 만큼 반복은 하더라도 결과값에 오차가 있을 가능성이 있음
package ch04.sec04;
public class floatFor {
public static void main(String[] args) {
for(float x=0.1f; x<=1.0f; x+=0.1f) {
System.out.println(x);
}
// for문에 실수를 넣지 않는게 좋음
// 실수는 정밀도가 떨어져 오차범위가 있기 때문에 원하는 횟수만큼 반복하기 어려움
System.out.println();
float x = 0; // float 변수 x값에 초기값을 줌
for(int i=1;i<=10;i++) {
x += 0.1f; // x에 0.1씩 더함
System.out.println(x);
}
// for문에 정수를 넣고 실행시키면 원하는 횟수만큼 반복이 가능함
// 하지만 실수값은 오차범위가 존재하기에 값의 정밀도는 떨어지는 것은 감안해야함
System.out.println();
float y = 0;
float z = 1;
for(int i=1;i<=10; i++, y+=0.1f, z-=0.1f) {
//for문 증감식에 여러 증감식을 사용할 수 있음
System.out.println(y);
System.out.println(z);
}
}
}
-> 괄호 안의 조건식이 true일 경우 실행문이 계속 실행되는 구문
-> 조건식의 경우 비교 연산자나 boolean 변수나 값이 사용됨
-> boolean 변수가 사용될 경우 구문 내부에 빠져나갈 수 있는 구문을 만들어줘야함 (false)
-> 비교 연산자가 조건식에 사용될 경우 실행문 안에 증감식을 넣어주면 됨!
-> 구조
while(조건식){
실행문
}
-> 실행
1. 조건식의 결과가 true일 경우 실행문이 계속 실행됨
2. 조건식의 결과가 false일 경우 실행이 중지됨
package ch04.sec05;
public class whileExam1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int i = 1;
while(i<=10) { //i가 10이 될때까지 계속 실행
System.out.print(i + " ");
i++; // i에 1씩 더하기
}
}
}
package ch04.sec05;
public class WhileSum1to100 {
public static void main(String[] args) {
int sum = 0; // 합계 구하는 변수, 초기값을 정해줘야 값을 더할 수 있음
int i = 1;
while(i<=100) { //i가 100이 될때까지 실행
sum += i; // sum 변수에 i를 더함
i++; // i에 1을 더함
}
System.out.println(sum);
}
}
package ch04.sec05;
import java.util.*; //Scanner 함수를 불러오기 위해 임포트함
public class WhileExam2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); // Scanner를 사용하기 위한 함수
boolean run = true; // while문 실행을 위한 변수
int speed = 0; // speed 값의 증감을 위해 초기값 설정
while(run) { // run = true이면 실행
System.out.println("1.증속 | 2.감속 | 3.중지");
System.out.print("선택: ");
String strNum = sc.nextLine(); // 문자열 입력
if(strNum.equals("1")) { // 문자열 값이 1이면 실행
speed++; // speed 값 1씩 증가
System.out.println("현재 속도: " + speed);
}
else if(strNum.equals("2")) { // 문자열 값이 2이면 실행
speed--; // speed 값 2씩 증가
System.out.println("현재 속도: " + speed);
}
else if(strNum.equals("3")) { // 문자열 값이 3이면 실행
run = false; // while문의 조건을 false로 바꾸어 실행 중지
}
else {
System.out.println("잘못 입력하셨습니다.");
}
}
System.out.println("프로그램 종료");
}
}
package ch04.sec05;
import java.util.*;
public class whileExam3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int speed = 0;
boolean run = true;
while(run) {
System.out.println("1.증속 | 2.감속 | 3.중지");
System.out.print("선택: ");
int num = sc.nextInt(); // 정수를 입력받음
if(num==1) {
speed++;
System.out.println("현재 속도: " + speed);
}
else if(num==2) {
speed--;
System.out.println("현재 속도: " + speed);
}
else if(num==3) {
run = false;
}
else {
System.out.println("잘못 입력됨");
}
}
System.out.println("프로그램 종료");
}
}
package ch04.sec05;
import java.util.*;
public class WhileBaseballTeam{
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
String team = "";
while(!team.equals("SSG")) {
System.out.print("팀 이름 입력: ");
team = sc.nextLine();
if(team.equals("LG")) {
System.out.println("LG트윈스");
}
else if(team.equals("키움")) {
System.out.println("키움히어로즈");
}
else if(team.equals("KIA")) {
System.out.println("KIA타이거즈");
}
else {
System.out.println("몰라");
}
}
System.out.println("SSG랜더스");
}
}
package ch04.sec05;
import java.util.Scanner;
public class WhileExam3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
String input;
int speed = 0;
boolean run = true;
while(run) {
System.out.println("1.증가 | 2.감소 | U:속도 10증가 | D:속도 10감소 | 3.종료");
System.out.print("선택: ");
input = sc.nextLine();
if(input.equals("1")) {
speed++;
System.out.println("현재 속도: " + speed);
}
else if(input.equals("2")) {
speed--;
System.out.println("현재 속도: " + speed);
}
else if(input.equalsIgnoreCase("u")) {
// .equalsIgnoreCase : 대소문자 상관 x
speed += 10;
System.out.println("현재 속도: " + speed);
}
else if(input.equalsIgnoreCase("d")) {
speed -= 10;
System.out.println("현재 속도: " + speed);
}
else if(input.equals("3")) {
run = false;
}
}
System.out.println("프로그램 종료");
}
}
-> 대/소문자 상관하지 않는 함수
-> 구조 : 문자열변수.equalsIgnoreCase
-> 블록 내부를 실행시키고 실행 결과에 따라 반복 실행을 할지 결정
-> 일단 실행시키고 조건식을 마지막에 판단함
-> 조건이 성립되지 않으면 실행이 되지 않는 while문과 달리 최소 1번 이상은 실행이 가능함
-> 마지막에 while문 뒤에 세미콜론(;) 붙여야함
-> 주로 채팅창 같은 것에 쓰임
-> 구조
do{
실행문
}while(조건식);
package ch04.sec06;
import java.util.*;
public class doWhileExam {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("메세지를 입력하세요");
System.out.println("프로그램을 종료하려면 q를 입력하세요");
Scanner sc = new Scanner(System.in);
String inputString;
do {
System.out.print(">");
inputString = sc.nextLine();
System.out.println(inputString);
} //do에서 구문 실행
while(!inputString.equalsIgnoreCase("q")); // 대문자/소문자 구분없이 q가 나오면 종료. 조건을 나중에 하는 방식
// do~while문의 특징
// 먼저 실행을 하고 계속 실행할지 나중에 판단하는 구문
// do 구문 블록안에 실행문을 넣음
// do의 실행문을 확인하고 계속 실행할지 뒤에있는 while문의 조건식에서 판단함
// 일반 while문과 다르게 do~while문의 while문에는 뒤에 ;를 꼭 붙여줘야함
System.out.println();
System.out.println("프로그램 종료");
}
}
-> for, while, do~while문의 실행을 중지하거나 switch문을 종료할 때
-> 보통 if문과 같이 사용되어 조건식에 따라 반복문을 종료함
-> break문은 해당 구문의 블록 안의 실행만 멈출 수 있음
-> 중첩 for문의 경우 내부 for문에 break 설정 시 내부 for문에만 적용됨
package ch04.sec07;
public class breakExam1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
while(true) { // while문 실행
int num = (int)(Math.random()*6) + 1; // 1~6의 임의의 수 받기
System.out.println(num);
if(num == 6) { // num이 6이라면
break; // 실행을 멈춰라!
}
}
System.out.println("프로그램 종료");
}
}
-> 해당 구문 블록의 바깥의 블록의 반복문까지 중지시키는 법
-> Label 적용!
-> Label : 반복문 앞에 임의로 문구를 붙여 해당 반복문임을 명시하는 것
-> break문에 label 문구와 같이 적어주기
-> 사용법
Label(임의 설정) : for(조건문){
break Label(임의 설정);
package ch04.sec07;
public class BreakLabel {
public static void main(String[] args) {
// TODO Auto-generated method stub
Outter : for(char upper='A';upper<='Z';upper++) { // Outter(Label)의 역할 : 반복문에 임의로 이름을 정하는 것!
for(char lower='a';lower<='z';lower++) {
System.out.println(upper + "," + lower);
if(lower=='k') {
break Outter;
// 내부의 블록 구문에서 바깥 반복문까지 실행을 멈추고 싶을 때 임의로 정해놓은 라벨(바깥 for문의 이름)을 선언하여 멈추게 할 수 있음
// 라벨을 선언하지 않을 경우 내부의 for문에서만 break되고 외부 블록의 구문은 계속 실행됨
}
}
}
System.out.println("실행 종료");
}
}
-> 특정 조건을 건너 뛰고 반복문을 계속 실행하는 것
-> for, while, do~while에서만 적용
package ch04.sec08;
public class ContinueExam {
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i=1;i<=10;i++) {
if(i%2 != 0) { // i를 2로 나누었을 때 나머지가 0이 아닐 때! (2의 배수일때!)
continue; // 위의 조건을 충족할 시 반복문의 조건을 건너뛴다는 개념!
}
System.out.print(i + " ");
}
}
}