[JAVA]7일차(switch/while/예시코드)

정효진·2021년 7월 21일
0

Developer Study

목록 보기
7/47
post-thumbnail

7월22일(목)

반복문.. 헷갈린다요...😵
Test034~Test044

◼ switch

  • 제어문 : 조건문(분기문)
  • 다중 선택문이라 하며, switch 문 다음의 수식 값에 따라 실행 순서를 여러 방향으로 분기할 때 사용하는 문장이다.
  • case문 쓸때 띄어쓰기 중요!!!!! case 띄고 상수, :이거는 붙여도 상관없음!!
    형식 및 구조
    switch(수식)
    {
    case 상수1 : 문자1; [break;]
    case 상수2 : 문자2; [break;]
    :
    [default : 문장n+1; [break;]]
    }
  • switch 문의 『수식』과 case의 『상수』는 byte, short, int, long 이어야 한다.
  • case 문 뒤에 『break;』가 없는 형태인 경우 다음 case 문의 문장을 계속해서(이어서) 수행하게 된다. (->기본 모델)
//if 구조
if() //-> true / false
{
}

// switch 기본구조
switch(n) //-> 상수
{	
	//case는 여기서 부터 끝까지 읽는 것
	case1 : ...;  //n이 1일 때 case1, case2, case3실행
   	case2 : ...;  //n이 2일 때 case2, case3실행
   	case3 : ...;  //n이 3일 때 case3실행  
    	default : ...;  //n이 1,2,3이 아닐때 시작하는 지점 
     	
        //케이스, 디폴트의 위치 어디있든 상관없음
        default : ...;
        case3 : ...;
        case1 : ...;
        case2 : ...;
}
// switch 일반적인 구조
switch
{
	default : ...;
    		break;
        case3 : ...; //break안써도됨!
        case1 : ...;
            	break;
        case2 : ...;
           	break;
}
// >>>break만나면 여기로 빠져나온다!

무한 루프 케이스

//-----------case1
while(true)
{
	...
}
//-----------case2
do
{
	...
}while(true);

//-----------case3
for( ; ; )
{
	...
}
  • break; : 멈춘다.(그리고 빠져나간다.)
  • continue; : (뒷부분 무시하고...) 계속한다.
  • break 레이블
    : break문은 자신을 감싸는 반복문을 하나밖에 벗어나지 못한다.
    때문에 둘 이상의 반복문을 벗어날 때는 break 레이블을 사용을 고려할 수 있다. 하지만 빈번한 사용은 바람직하지 않다.
//이렇게도 쓸수있음!! 케이스1하고 브레이크 케이스2하고 브레이크...
switch(n) 
{
	case1 : case2 : case3 :
  	System.out.println("SIMPLE JAVA");
  	break;
	case1 : case2 :
	System.out.println("FUNNY JAVA");
	break;
}

👩‍💻 switch를 이용해서 등급 구하기

//Test036
switch (avg/10)
{
	case 10: case 9: grade = 'A';break;
	case 8: grade = 'B';break;
	case 7: grade = 'C';break;
	case 6: grade = 'D';break;
	default :grade = 'F'; 
        //char grade = 'F';로 했다면 default안써도됨!!
}

👩‍💻 switch를 이용해서 별 찍기

  1. swich 문의 일반 모델을 사용하여 해결한다.
  2. swich 문의 기본 모델을 사용하되, break;를 딱 한 번만 사용할 수 있도록 구성한다.
/*실행 예)
임의의 정수 입력(1~3) : 3
★★★
계속하려면...

임의의 정수 입력(1~3) : 7
입력 오류~!!
계속하려면...
*/
//Test037
System.out.print("\n<일반모델>\n");
switch (n)
{
	case 1 : System.out.println("★"); break;
	case 2 : System.out.println("★★"); break;
	case 3 : System.out.println("★★★"); break;
	default : System.out.println("입력 오류~!!!"); break;
}

//기본모델  print()사용 //---check~!! print()사용
System.out.print("\n<기본모델>\n");
switch (n)
{
	case 3 : System.out.print("★");
	case 2 : System.out.print("★");
	case 1 : System.out.print("★\n"); 
	break;
	default : System.out.println("입력 오류~!!!");			
}
/* 실행 결과
임의의 정수 입력(1~3) : 2

<일반모델>
★★

<기본모델>
★★
계속하려면 아무 키나 누르십시오 . . .


임의의 정수 입력(1~3) : 5

<일반모델>
입력 오류~!!!

<기본모델>
입력 오류~!!!
계속하려면 아무 키나 누르십시오 . . .
*/

👩‍💻 switch를 이용해서 사칙연산

/*
실행 예)
첫 번째 정수 입력 : 20
두 번째 정수 입력 : 14
연산자 입력[+ - * /] : +

>> 20 + 14 = 34
계속하려면 아무 키나 누르세요...
*/
//Test038
op = (char)System.in.read();

switch (op)
{
	case '+': result = a + b; break;
	case '-': result = a - b; break;
	case '*': result = a * b; break;
	case '/': result = a / b; break;
	default: System.out.println("[+ - * /]만 입력해주세요!!!"); break;
			
}
		
System.out.printf("\n>> %d %c %d = %d\n",a,op,b,result);

/*
첫 번째 정수 입력 : 5
두 번째 정수 입력 : 2
연산자 입력[+ - * /] : 5
[+ - * /]만 입력해주세요!!!

>> 5 5 2 = 0
계속하려면 아무 키나 누르십시오 . . .
*/

❌ 위의 코드처럼 하니까 default값을 입력하면 마지막에 결과오류까지 같이 출력이 됨..

🚀 해결

  1. case 상수에는 숫자를 입력해야함!! -> int op; 사용!
    사칙연산 아스키코드값 : '+' : 43 / '-' : 45 / '*' : 42 / '/' : 47
  2. return; 사용 (만약 디폴트 안쓸꺼면 result 초기값 0으로 설정)
    • return 키워드가 지니는 두 가지 의미
      1. 값의 반환
      2. 메소드의 종료 -> main()메소드 종료 -> 프로그램 끝
      (return을 발견하면 어느 메소드에 들어있는지 꼭 확인!! 지금은 main)
int a, b, result;
int op;
//(..생략..)        
switch (op)
{
	case 43: result = a + b; break;
	case 45: result = a - b; break;
	case 42: result = a * b; break;
	case 47: result = a / b; break;
	default: return; //check~!!
			
}
// ※ return 키워드가 지니는 두 가지 의미
// 1. 값의 반환
// 2. 메소드의 종료 -> main()메소드 종료 -> 프로그램 끝
// (return을 발견하면 **어느 메소드**에 들어있는지 꼭 확인!! 지금은 main)
		
System.out.printf("\n>> %d %c %d = %d\n",a,op,b,result);
System.out.printf("\n>> %d %d %d = %d\n",a,op,b,result); //이렇게 하면 연산자 값 아스키코드 값이 출력됨!!

/*
첫 번째 정수 입력 : 2
두 번째 정수 입력 : 5
연산자 입력[+ - * /] : +

>> 2 + 5 = 7

>> 2 43 5 = 7
계속하려면 아무 키나 누르십시오 . . .

첫 번째 정수 입력 : 2
두 번째 정수 입력 : 2
연산자 입력[+ - * /] : 2
계속하려면 아무 키나 누르십시오 . . .
*/

JDK 1.5부터 가능한 문법 switch에 char'+'

switch (op)
{
	//JDK 1.5부터 가능한 문법
	case '+': result = a + b; break;
	case '-': result = a - b; break;
	case '*': result = a * b; break;
	case '/': result = a / b; break;
	default: return;
			
}
		
System.out.printf("\n>> %d %c %d = %d\n",a,op,b,result); //% check~!!
System.out.printf("\n>> %d %d %d = %d\n",a,op,b,result); //이렇게 하면 연산자 값 아스키코드 값이 출력됨!!
		

JDK 1.7부터 가능한 문법 switch에 String "+"

switch (op)
{
	//JDK 1.7부터 가능한 문법
	case "+": result = a + b; break;
	case "-": result = a - b; break;
	case "*": result = a * b; break;
	case "/": result = a / b; break;
	default: return;
			
}
		
System.out.printf("\n>> %d %s %d = %d\n",a,op,b,result); //-------check~!!! %s
		

◼ 반복문 : for, while, do-while

▪ 반복문의 개요

: 주어진 조건이 참인 경우 일정 영역의 문장들을 반복 수행하다가
조건식이 거짓이 되는 순간이 오면, 반복 수행을 중단하는 문장이다.

◼ while 반복문

<while의 구조>

while(조건식) -> true / false 
{
	// ①반복 실행 영역(참일 때 실행)
}(거짓일 때 실행)
//실행 후 조건이 참이면 ①실행하고 또 확인하고 조건참이 또 ①실행 또 실행했는데 거짓이면 ②으로 내려옴
  • while은 조건에 맞으면 실행하는 반복문!
  • while 문은 조건이 맞지 않은 경우 반복은 커녕 단 한번도 실행되지 않을 수 있다.(조건식이 거짓이면 바로 ②)
  • 조건식을 먼저 비교하여 조건식의 처리 결과가 참인 경우, 특정 영역을 반복 수행하는 문장으로 반복횟수가 정해져 있지 않은 경우나 반복 횟수가 많은 경우 주로 사용한다.

👩‍💻 while을 이용해서 1~10 출력

//Test039
/* 1-------------------------------------
		int n = 0;
		while (n<10)
		{
			System.out.println("n = " + n);
			n++;
		}
		//실행결과
		n = 0
		n = 1
		n = 2
		n = 3
		n = 4
		n = 5
		n = 6
		n = 7
		n = 8
		n = 9
		계속하려면 아무 키나 누르십시오 . . .
		------------------------------------------*/

		
		/*---------------------------------------
		//2 n++;위치 변경
		int n = 0;
		while (n<10)
		{
			n++;
			System.out.println("n = " + n);
			
		}
		//실행 결과
		n = 1
		n = 2
		n = 3
		n = 4
		n = 5
		n = 6
		n = 7
		n = 8
		n = 9
		n = 10
		계속하려면 아무 키나 누르십시오 . . .
		------------------------------------------*/

		
		/*---------------------------------------
		//3  n++<10로 조건식 변경
		int n = 0;
		while (n++<=10)
		{
			
			System.out.println("n = " + n);
			
		}
		//실행 결과
		n = 1
		n = 2
		n = 3
		n = 4
		n = 5
		n = 6
		n = 7
		n = 8
		n = 9
		n = 10
		n = 11
		계속하려면 아무 키나 누르십시오 . . .
		------------------------------------------*/

👩‍💻 while을 이용해서 1~10 짝수 출력

//Test039
int n = 0;
while (n++<=10)
{
			
	System.out.println("n = " + ++n);
			
}
/*
//실행 결과
n = 2
n = 4
n = 6
n = 8
n = 10
n = 12
계속하려면 아무 키나 누르십시오 . . .
*/

👩‍💻 while을 이용해서 1~100 누적합구하기

  • 출력 구문이 반복문의 영역 밖에 위치해야 한다.
  • 1부터 1씩 증가할 변수누적합을 담을 변수 (두개의 변수가 필요하다.)
//Test039
// 1부터 차례로 담아 1씩 증가하는 변수 선언 및 초기화
int n=1;
		
//누적합을 계산하여 담아낼 변수 선언 및 초기화
int sum=0; //누적합은 0으로 초기화 / 누적곱은 1로 초기화 ------------ check~!!!
		
//연산 및 처리(반복문 구성)
while (n<=100)
{
	//sum을 n만큼 증가시켜라~!!!(누적합)
	sum += n; 

	//n이 1씩 증가해 나가는 연산 필요~!!!(증가 변수)
	n++; 
}

System.out.println("1 부터 100 까지의 합 : " + sum);

❌ 에러나는 while문

int n=1;
		
	
while (n<=100)
{
	int sum=0;
	//sum을 n만큼 증가시켜라~!!!(누적합)
	sum += n; 

	//n이 1씩 증가해 나가는 연산 필요~!!!(증가 변수)
	n++; 
}

System.out.println("1 부터 100 까지의 합 : " + sum);

//에러남!!!

❔ 왜 에러나?

  • sum은 계속 초기화되고
  • sum이 밖에있는게 아니고 while문 안에 sum이 있으니까 sum출력못함 !!

👩‍💻 while을 이용해서 1~100 짝수 누적합구하기

/*----------------------------------------------------------------------	
//Test040
//방법1  n=0 일 때
int n = 0;
int sum = 0;

while (n<100)
{
	n += 2;
	sum  += n;
			

}
System.out.println("1 부터 100 까지 수 중 짝수의 합 : " + sum);
-------------------------------------------------------------------*/

/* 실행 결과
1 부터 100 까지 수 중 짝수의 합 : 2550
계속하려면 아무 키나 누르십시오 . . .
*/

		
//방법2  n=2 일 때
int n = 2;
int sum = 0;

while (n<=100)
{
			
	sum  += n;
	n += 2;
			

}
System.out.println("1 부터 100 까지 수 중 짝수의 합 : " + sum);

/*
1 부터 100 까지 수 중 짝수의 합 : 2550
계속하려면 아무 키나 누르십시오 . . .
*/

👩‍💻 while 과 if 를 이용해서 1~100까지 누적합, 짝수합, 홀수합

/*
실행 예)
1 부터 100 까지의 정수 중
짝수의 합 : 2550
홀수의 합 : 2500
계속하려면 아무 키나...
*/
//Test042
		int n = 1,sum ,even , odd ;
				sum=even=odd=0;

		while (n<=100)
		{
			
			//정수합 처리
			sum += n;      //----check~!!!				

			//짝수합 / 홀수합 처리
			if (n%2==0)
			{
				even += n;
			}else if (n%2!=0)
			{
				odd += n;
			}else
			{
				System.out.println("판별 불가 데이터");
				return;
			}
			n++;
		}

		System.out.println("1 부터 100 까지 정수의 합 : " + sum);
		System.out.println("1 부터 100 까지 짝수의 합 : " + even);
		System.out.println("1 부터 100 까지 홀수의 합 : " + odd);

/*
1 부터 100 까지 정수의 합 : 5050
1 부터 100 까지 짝수의 합 : 2550
1 부터 100 까지 홀수의 합 : 2500
계속하려면 아무 키나 누르십시오 . . .
*/

❔ while문 안에 삼항연산자 사용?

while(n<=100)
{
 even +=(n%2==0? n:0);
}

헷갈려...

👩‍💻 while 과 if 를 이용해서 1~100까지 10의 배수마다 출력

public class Test043
{
	public static void main(String[] args)
	{
		
		//n이 0일 때
		int n=0, sum=0;

		while (n<=100)
		{
			n++;
			sum += n;
			
			
			if(n%10==0)
			{
				System.out.printf("1 ~%d 까지의 합 : %d\n", n,sum);
			}			
			
		}
		
		//n이 0으로 초기화되었을때는 while (n<=100) 와 while (n<100) 의 결과값이 같게나오는데..왤까?
		//그거는 출력같을 10의 배수로만 해서 그럼!! 저거 없으면 값 다르게 나옴!!
        ////n<100 이면 100까지 합 출력되고, n<=100 하면 101까지의 합 출력됨

/*
1 ~10 까지의 합 : 55
1 ~20 까지의 합 : 210
1 ~30 까지의 합 : 465
1 ~40 까지의 합 : 820
1 ~50 까지의 합 : 1275
1 ~60 까지의 합 : 1830
1 ~70 까지의 합 : 2485
1 ~80 까지의 합 : 3240
1 ~90 까지의 합 : 4095
1 ~100 까지의 합 : 5050
계속하려면 아무 키나 누르십시오 . . .
*/

👩‍💻 while 이용해서 n/(n+1)출력

//Test044
// 1/2 + 2/3 + 3/5 + .... +9/10
public static void main(String[] args)
{
	double n = 1, sum = 0;
	while(n<10)
 	{
    	sum += n/(n+1.0);
        n++
	}
    System.out.println(""연산 결과 : " + sum);
    
    /*----------------------------------------
	//(n-1)/n 으로 하면 n 은 2부터 시작하면 됨
	//이런 규칙 찾는거 중요~!!!
	//n = 2 일때
	double n=2,sum=0;

	while (n<=10)
	{
		sum += (n-1.0)/n;
		n++;
			
	}
		
		
	System.out.println("연산 결과 : " + sum);

반복문은 계속 쳐보고 반복해서 연습만이 살길!!💪⚡

profile
개발새발

0개의 댓글