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분 걸림;; 머리가 나쁘다고는 생각하지 않았는데ㅋㅋ 자만이었다.. 후
'개발자로 가는 길(국비지원과정) > 1. Java' 카테고리의 다른 글
[210421수] 배열 Array (0) | 2021.04.21 |
---|---|
[210420화] for문 (0) | 2021.04.20 |
[210405목] 조건연산자, IF문, Switch-case문 (0) | 2021.04.15 |
[210414수] 복습 + 연산자 연습문제 (0) | 2021.04.14 |
[210413화] 자바 연산자 + 연습문제 (0) | 2021.04.13 |