본문 바로가기
개발자로 가는 길(국비지원과정)/1. Java

[210419월] 반복문

by 레아Leah 2021. 4. 19.
반응형

Scanner 선언 시  keyin이라는 변수명 바뀌어도 상관없다.

Scanner keyin = new Scanner(System.in); 

Scanner scanner = new Scanner(System.in);

 

 

[반복문]

1) while문

- 반복횟수를 제어할 변수 필요: i, j와 같은 변수를 많이 사용

- 몇 번 반복하게 될 지 모를때 사용하면 좋다 

더보기

int i = 0;

while(조건문 ex: i < 10) {

        //참일 경우 실행할 문장;

        ++i;

 

끝나지 않는 while 반복문: 무한반복문  ex) while(true) 

while 반복문을 끝내기 위해 변수 i의 값을 변경을 준다. 

i의 값이 변경되어 거짓이 되면  while문 바깥으로 나간다. 

 

i가 10이기 때문에 while문을 실행할 수 없음. 

 

i = 0; 

i += 2; 

i + (i + 2) + (i + 2 +2) + ....  

0 + (2+ 2) + (2+2) + ... 

 

i의 값을  while문 조건에 맞게 변경하면  실행! 

 

 

[연습문제: 입력받은 데이터가 음수이면 while문을 탈출할 것]

<내가 한 거>

while(data > 0) 조건식이 잘못되어 출력값이 End! 만 나옴.

data를 0으로 초기화했기때문.

  

 

실행시키기 위해서는 이 조건식을 어떻게 바꾸어 할 것인지 고민해보기

data < 10의 범위 안에 드는 정수 3은 실행하지만 범위를 넘은 11은 while(data < 10)과 맞지 않기 때문에 반복을 종료하고, while문 밖에 있는 System.out.println("END");을 실행한다. 

i는 입력받을 수이기 때문에 선언만 하고 초기화를 하지 않음. while( i < 0)이라는 음수일 경우 "양수를 입력"하라는 메시지를 남기고 return ;으로 빠져나갈 생각을 함. return;을 하지 않으면 음수를 입력한 경우 무한루프로 사진처럼 출력됨. 

==> 내 착각이었음.

while문에서는 "i의 값이 변경되어 거짓이 되면  while문 바깥으로 나감"을 이용해 int i =0;으로 초기화 후, while문 조건인 while(i >=0)의 조건인 양수라면 "입력 데이터: i"라고 출력하고 아닐 경우엔 while문 바깥으로 나가 "END"를 출력해주면 된다. 

while문에서 i를 사용하려면 초기화해야하는 것! 잊지말기! 

 

 

<깔끔한 코드>

 

[while(true) 무조건 반복하는 경우 = 무한루프] 

while(true)는 모든 조건이 맞다고 판단해 전부 출력함. while(true)는 무한루프이기때문에 while문 밖으로 나갈 수 없다.

그렇기 때문에 while문 밖에 있는 코드(System.out.println("END");)사용하지 않을 죽은 코드, 데드코드라고 한다.

 

 

[while(true) 무한루프에서도 나갈 방법]

바로 break; 사용! 

while문 안에 쓰는 break;는 한번만 사용 가능

 

 

[무한루프 while문에서 break를 쓰면서 반복문을 사용할 경우]

early stopping : 키보드로부터 입력하자마자 탈출할 조건인지 확인해 불필요한 처리를 막아주는 것 

ex) if(data < 0) break;

 

 

[문제 while을 이용해 1~9까지 출력]

 

 

[문제 키보드로부터 정수를 입력받아  (data) ==> data와 i가 곱해진 값을 출력]

<내가 짠 코드> 

변수 i와 data를 몇으로 초기화시켜야할지 고민.. 

 

<깔끔한 코드>

 

키보드로부터 입력받은 값은 초기화를 하지 않아도 사용가능한가?   사용 가능! 

기존에 알고 있던 int i = 0; 또한 값 0이 들어가있는 것이 아니라 컴퓨터가 헷갈리지 않게 널값(NULL)으로 둔 것!  

 

<나름 응용해 본 거>

 

 

<컴공과 학생분에게 물어본 내용>

초기화에 대해 잘 알지 못하고 그냥 사용하고 있었는데..

 

int i; 선언만 한 상황에서 while(i<10)이 에러가 뜨는 이유는 i가 정수인지 아닌지 알 수 없기때문이다. 그렇기 때문에 조건문이 있는 while문에서 변수 선언 후 초기화를 반드시 해야 한다. 

 

 

 

 

 

 

 

 

 

 

int i = 0;을 초기화함으로 에러 제거! 

컴공과 만세! 감사합니다ㅎㅎ 

 

 

 

 

 

 

 

 

 

 

출력 결과: 

 

 

 

[연습 1~10까지의 합계만 나타내기 

 

1~10 모든 정수의 합을 구하여 출력하세요. 

int total; <==누적시킬 변수 

1 + 2 + 3+ 4 + ..... 

total = total + i; 

 

<내가 짠 코드> 

 

<깔끔한 코드>

total += i ;total total + i;는 같다. 

total += i 

total total + i;

 

int total=0;  0으로 초기화 했기때문에 i가 증가함에 따라 (0+i) + ((0+i) +i) + .... 이런식으로 while의 조건에 해당하는 값을  누적하므로 총 합계를 구할 수 있다. 

 

+ while문과 다른 반복문을 사용할 때 주의할 점.

반복되어야할 부분이  어디인지 정확히 알아야 한다. 

총 합계는 1번만 나오면 되지만,

어디를 반복해야하는지 모를 경우, 이렇게 출력되는 것을 확인할 수 있다. 

 

 

 

[문제 팩토리얼]

5! = 5*4*3*2*1

10! = 10*9*8*7*6*5*4*3*2*1

 

product *= i; // product = product * i; 

이걸 이해를 못하는듯

 

<내가 쓴 코드> 단단히 잘못씀;; 

 

<깔끔한 코드>

내가 자꾸 헷갈리는 표현 중 하나인 " total += i "  나 " product *= i " 

 

<① total += i >

더보기

public static void main(String[] args) {

       int i =1; 

       int total = 0;

 

       while(i <=3){

              total += i; 

              ++1;

       }

       System.out.println(total); 

}

total += i; / total = total + i;
i가 1일때 total = 0(int total=0) + 1(i) =1  total = 1 
i가 2일때 total(1) = total(1) + i(2) total= 3  
i가 3일때 total(3) = total(3) +i(3) total = 6

while(i <n)의 조건에 맞을 때까지의 값을 연속적으로 더하는 셈이 된다. 

total += i;는 total = total + i와 같은 표현이고 total 과 total + i 값이 같다는 표현이 아니라 우변에 있는 값을 좌변에 대입한다는 의미이다. 

 

 

<② product *= i >

더보기

public static void main(String[] args) {

       int i =1; 

       int product = 1;

 

       while(i <=3){

              product *= i; 

              ++1;

       }

       System.out.println(product); 

}

product *= i; / product = product *i;
i가 1일때 product= product(1) * i(1) product= 1
i가 2일때 product(1)= product(1) * i(2) product= 2
i가 3일때 product(2)= product(2) * i(2) product= 4

product *= i;는 product = product *i;와 같은 표현이고 product 과 product *i의 값이 같다는 표현이 아니라 우변에 있는 값을 좌변에 대입한다는 의미이다. 

 

절대 어렵고 복잡한 부분이 아닌데 이해하기가 이렇게 오래 걸린다니 ... 

 

 

 

[혼자 해보는 문제: 정수 n의 n!의 값을 출력해라]

일단 이게 가능한지 물어봐야할 듯. 

-while문에서 조건이 주어지기 때문에 변수의 초기화를 꼭 해야하는데 이런 조건이( i < 10) 이런 식으로 정수만 가능한건지? 아니면 변수 자체가 와도 되는지..? 만약  정수인 값 n 키보드로부터 입력받고 정수 n 팩토리얼을 구하고 싶다할 , (i < n) 이런 식으로는 없는지 ..   궁금 

 

 

[ while문의 기본: ++i로 증가 후]

 

 

 

[break와 continue의 비교]

[break]

while문에 if절과 break를 달아 if절에 조건에 맞지 않으면 while절을 나가버림. 

 

 

[continue]

if( i == 5) continue;  조건에 해당되는 값을 그냥 건너뛰고 넘겨버림. 

더보기

while(i < 10) {
     ++i;
     if(i % 2 == 0) continue; 

// 내가 건너뛰어야하는 문장, 해당하는 내용을 출력하지 않겠다. continue는 반복문과 항상 함께~!

 

     System.out.println(i);

 

break : switch와 반복문에서 탈출을 도와줌  

continue : 특정문장을 거른 후 계속 진행 

 

 

 

 

[문제] Packing 프로그램의 작성

 

-달걀의 무게를 입력받는다. (5~7g)

-만약 5g 미만이면 "달걀이 너무 작아 포장 불가" 

-만약 7g 초과하면 "달걀이 너무 커서 포장 불가" 

 

[실행] 결과로 

 

무게 입력: 6

1개 포장

무게 입력: 5

2개 포장

무게입력 : 4 

달걀이 너무 작아 포장불가 

현재 포장된 갯수는 2개 

무게입력 : 10

달걀이 너무 커서 포장불가 

현재 포장된 갯수는 2개 

...

무게 입력: 6

9개 포장

무게 입력: 5

10개 포장

 

 

<내가 짠 코드> 

뭐랄까... 시도는 해보았달까? 

흠.. return;에 대한 의문.. 왜 main메소드로 가서 다시 재실행하지 않고 끝나버리지? 

해답은 밑에 있어요! 

 

 

입력받는 변수, 몇 개인지 세는 변수가 필요함 

아!  return을 쓸 필요가 없구나.. 

그럼 도대체 리턴은 언제쓰는거지? 

while문에서 반복해야할 부분이 어디이고, 조건이 무엇인지 생각해 보는 것이 좋음. 

누가 미리 해놓은거 보면 나도 할 수 있을 것 같고, 쉬운 것 같은데 내가 직접하면 바로 백지상태 ㅠㅠ 

 

 

 

[while(true) + switch의 활용] 

숫자 0을 누르면 진짜 프로그램이 종료가 되도록 하기 위한 2가지 방법

 

 

return; : main 함수를 종료시키는 함수 

return; //되돌아가라 어디로? 자신을 호출했던 쪽으로 즉, main 메소드

 

<깔끔한 코드>

<따라해 본 거>

 

②System.exit(0);

<깔끔 코드>

<따라해 본거>

 

[Exception 추적]

 

 

[문자열을 키보드로 입력받기]

[문자열을 키보드로 입력받는 방법]

더보기

String name; 

 

System.out.println("이름을 입력 : ");

name = scanner.next();

 

-name = scanner.next();는 한 단어만 가능. 그러므로 띄어쓰기 불가능! 

 

2) for문 

3) do~while문

 

 

 

◆복습

- 4월 24일 토요일 3시간 35분 걸림;; 머리가 나쁘다고는 생각하지 않았는데ㅋㅋ 자만이었다.. 후 

 

 

 

 

 

 

반응형