반응형
*제어문
-switch~case
*반복문
-for
*분기문
-break, continue
*제어문
-
프로그램의 순차적인 흐름 변경(조건문-if/switch~case/반복문/분기문)
-switch~case
switch(변수명){
case 상수 : 실행될 코드 ; [break;]
...
default : 상수와 같은 값이 아닐때 실행될 코드;
}
-
=>일치하는 수를 찾아 그전까지의 코드를 건너뛰고 그아래로 내려온다.
-
=>상수에는 음수도 포함되는데, 변수의 데이터형에 크기와 타입에 따라 달라지게된다. (int로 음수까지 생각했을때 42억여개까지)
-
=>수는 섞어사용해도 상관없으나 작은값~큰값순인 오름차순이 보기에 좋다. 아니면 특정수를 뛴다면 (규칙을 가진 증가값) 그것도 좋음
-
=>Flow chart는 다중if 형태를 띄지, 다 같은층을 가진 플로우차트로 그리지 않는다..
-
=>break를 만나면 switch를 나감
-
ex) 성적에 대한 학점
===>100~90 - A / 89 ~ 80 - B / 79 ~ 70 - C / 69 ~ 60 - D / 59 ~0 - F
switch (변수명){
caes 100 : garde = 'A'; break;
caes 99: garde = 'A'; break;
caes 98: garde = 'A'; break;
caes 97: garde = 'A'; break;
caes 96: garde = 'A'; break;
...
default : |
========>
이렇게
가능 |
//바꾸는게 좋겠다 주석만
//바꾸면 내 일..ㅠ
switch (변수명){
caes 100 :
caes 99:
caes 98:
caes 97:
caes 96: garde = 'A'; break;
... |
정수/정수=정수이므로 변수O
switch (변수명/10){
caes 10 :
caes 9: garde = 'A'; break;
caes 8: garde = 'B'; break;
caes 7: garde = 'C'; break;
...
default : grade = 'F'; break;
} |
===>해당문제의 flow chart)
<패키지명은 원래는 역주소도메인..우리는 편의상.. 나중에 여러일 해야하면..
===>해당문제 소스코드
package day1120;
/**
* switch~case를 사용한 학점 구하기
* @author owner
*/
public class TestSwitchCase2 {
public static final int GRADE_A_PLUS=10;
public static final int GRADE_A=9;
public static final int GRADE_B=8;
public static final int GRADE_C=7;
public static final int GRADE_D=6;
public static void main(String[] args) {
int score = 109; //<score/10의 문제는 101~109까지 10이 나온다는것
//<ㄸㄹㅇ 가 쓴다고 생각하고 유효성 검증..
// char grade = ' '; //char는 문자를 저장한다. ''는 문자가 없다 라는것으로
//' '공백문자(white space)- unicode \u0000(~\uFFFF)
//<코드셋에 존재하지 않아 들어가지 않는다.Error
//<(int)Character.MIN_VALUE = \u0000 MAX_VALUE = \uFFFF
//<System.out.println((int)Character.MIN_VALUE+"/"+Character.MIN_VALUE)
char grade=64;
//case의 상수는 가독성이 떨어지기 때문에 Constant를 사용하려 한다..
if(0<=score && score<=100) {
switch(score/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'; */
//break; default는 아랫줄에 실행될 코드가 없으므로 분기문을 사용하지않는다. 줄일수있닷
case TestSwitchCase2.GRADE_D: grade++; //64->65
case TestSwitchCase2.GRADE_C: grade++; //65->67
case TestSwitchCase2.GRADE_B: grade++;
case TestSwitchCase2.GRADE_A:
case TestSwitchCase2.GRADE_A_PLUS: grade++;break; //<이렇게 해야 가독성이 좋은 코드
default : grade+=6;
//<a=65,b=66 ~ F=70
//<break 있는 위의 코드가 이경우에서는 더 좋다. 한줄하고 나가니깐, 여러줄수행 안해서
//<case i 는 변수라 안돼고 상수를 쓰면 가독성이 떨어진다. constant를 넣어주는게 좋다.
//<6이 무언지 7이 무언지 알수 없어서?=>나쁜코드
}//end switch
System.out.println(score +" 점의 학점은 "+grade);
} else {
System.out.println("점수는 0~100점 사이만 입력 가능!!! 입력점수["+score+"]");
}
}//main
}//class
=>스위치 자체가 가독성이 떨어져 상수의 좋은 사용이 중요
*반복문
-
<사람이 하기 번거로운걸 하기에 얘만한게 없당
-
코드의 실행을 여러번 반복해야 할때
-
for, while, do~while (looping문이라고도..)
-
<조건을 잘못주엇을때 무한루프 주의=> 인터럭트interuct
-
for : 시작과 끝을 알때
-
while(do~while) : 시작과 끝을 모를때 (do는 꼭 한번은 실행해서 PL/SQL 의 loop와 동일)
-
조건을 잘못 부여하면 무한루프에 빠지게 된다.
-
<일부러 주는 경우도 있다 ex)시계, 서버, (가용성,신뢰도 문제)
-
반복문을 빠져 나갈때는 분기문인 break를 사용
-
반복문의 수행을 건너뛸때에는 분기문인 continue 사용.
-for
-
시작과 끝을 알때
-
<단일 for, 다중 for를 쓰기도 한다.
-
문법)
for(초기값; 조건식; 증/감소식) {
반복수행 문장;
}
-
{}생략도 가능한데, 반복수행 문장이 1문장이라면 생략가능
-
-
초기값-조건식-반복수행-증감소식-조건식-반복수행-증감소식-조건식 순서로 반복=> 조건이 맞지않으면 for문 나감
-
ex)
-
for (int i=0; i<5; i++){
-
System.out.println(i);
-
}
-
< =>0부터 5까지 어떻게 가야하지 하는게 for
-
<index놀음, 잘관리하기 위해 사용..
-
ex) for 문의 flow chart
|
=>정보처리에서의 switch의 flow chart
|
-
ex)문제와 for문 flow chart 설명
=>flow chart
|
=>설명
|
-
ex)
package day1120;
/**
* for : 시작과 끝을 알 때 사용하는 반복문
* 문법 : for(시작값; 끝값; 증가|감소식)
* 반복 수행 문장;
* }
* @author owner
*/
public class TestFor {
public static void main(String[] args) {
//0~에서부터 10보다 작을 때까지 반복수행하는 for
for(int i=0; i<10; i++) {
System.out.println(i+"번 안녕 ");
}//end for
//1에서 부터 1씩 증가하며 100까지 반복수행 하는 for
//<반복문에서 i<=100쓰면 작은지1번 같은지2번 더 하게되어서 가급적이면 i<101이 좋다.요즘HDD가 좋아져서..별차이가 없김함..
for(int i=1; i<101; i++ ) {
System.out.println(i);
}//end for
//1에서 부터 1씩 증가하며 100까지 짝수만 옆으로 출력 for
for(int i=1; i<101; i++ ) {
if(i%2==0)
System.out.print(i+" ");
}//end for
System.out.println(); //<위에서 줄안건너서 그냥 건너,아무것도 없이도 가능 맞았당~
//1에서 부터 100까지 홀수만 옆으로 출력
int cnt = 0;
for(int i=1; i<101; i++ ) {
cnt++;
if(i%2==1)
System.out.print(i+" ");
}//end for
System.out.println("\n"+cnt+"번");
//1에서 부터 100까지 홀수만 옆으로 출력
int cnt1 = 0;
//증/감소식은 변수에 값을 변화시키고 유지시킬수 있는 모든 연산자를 다 사용할 수 있다.
//< i++ 후위연산 = i+=1 = i=i+1 => 이렇게 사용함으로 절반으로 줄었다.
//<i&=2 i^=2 도 다 상관은 없다. 단지 돌뿐..가장 적합한걸 쓰면된다.
for(int i=1; i<101; i+=2 ) {
cnt1++;
System.out.print(i+" ");
}//end for
System.out.println("\n"+cnt1+"번");
//1~100까지 출력하기 3의 배수 마다 숫자대신 "짝"을 출력
for(int i=1; i<101; i++) {
if(i%3==0) {
System.out.println("짝");
}else {
System.out.println(i);
}//end if
}//end for
//1~100까지의 합 출력 : 1에서 부터 100까지의 합은 5050
int sum=0;
for(int i=1; i<101; i++) {
sum=i+sum;
}//end for
System.out.println("1에서 부터 100까지의 합은 "+sum);
//A~Z까지 출력
for(char i=65; i<91; i++) {
//for(char c ='A'; c<='Z'; c++) 도 가능
//for(int i=65; i<91; i++) => (char)c로 출력
System.out.println(i);
}//end for
//for 에서 1~9까지 구구단2단
for(int i=1; i<10; i++) {
System.out.println("2*"+i+" = "+ 2*i);
}//end for
}//main
}//class
-다중for
-
for문 안에 for문 정의
-
문법)
for(초기값; 조건식; 증,감소식){
//단일 for 영역
for(초기값; 조건식; 증,감소식){
//다중 for 영역-밖의 인덱스와 있는곳의 인덱스를 다 쓸수 있다.
}
//단일 for 영역
}
-
ex)
for (int i=0; i<2; i++){
for (int j=0; j<3; j++){
system.out.println(i + " " +j);
}
} |
|
|
i j
0 0
0 1 밖에서 들어오면 안에for 가 여러번 돈다
0 2 한번돌떄 안이 얼마나 도는지 잘세면 된다.
1 0
1 1
1 2 |
<flow chart에서 길때>
-
ex)
package day1120;
/**
* 다중 for : 인덱스를 여러개 사용해야하는 경우
* 문법) for(시작값; 끝값; 증가,감소식){
* for(시작값; 끝값; 증가,감소식){
* 반복수행문장들;
* }
* }
*
* @author owner
*/
public class TestFor1 {
public static void main(String[] args) { //<실행해서 결과볼꺼니까 메인
for(int i=0; i<6; i++) {
//<단일for의 영역으로 안의 for문 돌기 전에 출력할 것 적는다.
for(int j=0; j<7; j++) {//다중for <쓸떄 안쪽 변수는 밖의 인덱스 변수명과 달라야 한다.
System.out.println("i : "+i+", j : "+j);
}//end for
//<단일 for 영역
System.out.println("==============");
}//end for
//구구단 전단 출력
for(int i=2; i<10; i++) { //단
System.out.println(i+"단 시작");
for(int j=1;j<10; j++) {
System.out.println(i+"*"+j+" = "+i*j);
}
System.out.println(i+"단 끝");
}//end for
// ijijijij
// 00
// 1011
// 202122
// 30313233
for(int i=0; i<4; i++) {
for(int j=0; j<i+1; j++) {
System.out.print(i+""+j);
}
System.out.println();
}//end for
System.out.println("============");
// ijijijij
// 121314
// 2324
// 34
for(int i=1; i<4; i++) {
for(int j=i+1; j<5; j++) {
System.out.print(i+""+j);
}
System.out.println();
}//end for
}//main
}//class
-다양한for
-무한 loop
-
종료되지 않아야하는 program 작성(시계, 서버)
-
<증가하는 수를 세거나 그냥 루프
-
무한 loop 문법
for( ; ; ){
반복 수행 문장;
}
-증가하는 수를 세는 무한 loop
for (초기값; ; 증,감소식) {
}
//여기에 코드가 있어도 실행될수없다=>Error
-
무한 loop 아래쪽의 코드는 정상적으로 실행될 수 없기때문에 코드 작성하면 Error발생
-
<분기문이 있으면 무한루프라 할수 없다.
-초기값을 여러개 설정 하는 for
for(초기값, 초기값; 조건식; 증감소식,,,){
}
ex)
for(int i=0; j=0; k=10; i<10; i++, j--,k+=2){
}
-
이떄 처음나오는쪽에만 데이터형을 적고 뒤엔 적지않는다.Error
-
변수중 하나로만 조건식, 그리고 조건식은 단 하나만 갖는다
-개선된, 향상된 for loop
-
<여태까지는 처음에 나왔던 for / JDK1.5버전부터는 향상된 for 문이 있다.
-
JDK 1.5에서 추가된 문법
-
이전엔 인덱스를 얻기위해 사용했으나 얘는 인덱스를 사용할수 없다.
-
<배열(=PL/SQL의 table_순차적으로 나열하여 쓰기위해서(자바는 동일데이터를))
-
Array, Collection(List, Set) 의 모든방(0~끝방)의 값을 출력하기 위해 제공되는 for
-
많은 양의 데이터를 출력할때, 기존의 for보다 느리다.
-
문법)
for(데이터형의 변수명 : 배열명|collection명 ){
변수명; //배열,collection의 방의 값이 저장된다.
}
for (int i: arr){ //i는 방
system.out.println(i);
}
for (int i=0; i<arr.length; i++){ //i는 인덱스
system.out.println(i);
}
-
i arr)
10 |
20 |
300 |
15 |
-
i arr 배열
-
=>이 하나하나 방을 방,요소, Element
-
=>속도는 훨씬 느리나 훨신 간단해서 많이 사용
<JDK 1.5에서 추가된 문법이라 컴파일러를 하위버전으로 변경한 뒤에 실행하면 이런 설명이 뜬다.(Error)
-
ex)다양한 for
package day1120;
/**
* 다양한 for의 형태
* @author owner
*/
public class TestFor2 {
public static void main(String[] args) {
//무한 loop
// for( ; ; ) {
// System.out.println("무한 loop");
// //자원이 고갈될때까지
// }//end for
// System.out.println("");//Error
//증가하는 수를 세는 무한loop
// for(int i=0;;i++){
// System.out.println("무한 loop" + i);
// }//end for
// //마찬가지로 여기에 코드오면 Error
//증가하는 수를 세는 무한loop일때 break
for(int i=0; ;i++) {
System.out.println("무한 loop" + i);
if(i==50) {
break; //가장 인근에 존재하는 반복문을 빠져 나간다.
}//end if
}//end for
System.out.println(""); //여기는와도 에러나지 않는다.
//break를 쓸떄는 if문이 붙어 있지 않으면 그냥 막 나가 버려서 => break는 꼭 조건문과 함께 사용!!
//특정 조건을 만족하면 나가라~~그런,
//증가하는 수를 세는 무한loop일때, if위치 바꾸어 보고, i변수가 밖으로 나가지 않는걸 봄..
//int i=0;
for(int i=0; ;i++) {
System.out.println("무한 loop" + i);
//}//end for
if(i==50) {
break; //가장 인근에 존재하는 반복문을 빠져 나간다.=>Error if만이면 반복문없어서?
}//end if
System.out.println("");
}//end for
//for 에 i를 쓸때는 선언하지 않는다. HDD가 워낙에 빨라 ???
//여러개의 초기값을 사용하는 for
for(int i=0,j=10,k=30; i<10 && j==30; i++,j++,k--) {
//<그냥은(컴마로는) 쓸수없고 &&연산자로 i<10 && j==30 붙여줄수 있다.
System.out.println(i+" "+j+" "+k);
}//end for
//조건식을 잘못 설정하면 무한loop
// for(int i=0; i<10; i--) {
// System.out.println(i);
// }//end for 조건은 주었으나 조건에 맞는 코드가 아니라 무한루프.
int i=0;
for(i=0;i<10;i++);{ //<세미콜론이 들어있어 가장 마지막 값을 보긴한다.(지역변수라 가능한듯)
System.out.println("반복문 " +i);//이렇게 세미콜론을 잘못 쓰는 경우가 발생하기도 한다.
}//<중괄호가 인스턴스 영역이라는걸 나중에 알게된다.
}//main
}//class
-
ex) 향상된 for 문
package day1120;
import java.util.ArrayList;
import java.util.List;
/**
* 개선된/향상된 for : 배열이나 Collection들의 모든 방의 값을 처음부터 끝까지 순차적으로 출력하기 위해 제공되는 for.
* 개선된 for문은 JDK1.5에서부터 사용가능, 그때 나왔다
* 문법) for(데이터형 변수명 : 배열명(Collection명)) {
* 변수명;(배열(Collection)방의 값을 사용할수 있다.)
* }
* // 인덱스는 쓸수 없다.
* @author owner
*/
public class ImprovementFor {
public static void main(String[] args) {
int[] tempArr= {2018,11,20,16,5}; //05는 8진수
//이전의 for로 모든 방의 값을 출력
for(int i=0; i<tempArr.length; i++) {
System.out.println(tempArr[i]);
}//end for
System.out.println("--------------개선된 for---------------");
//개선된 for 로 모든 방의 값 출력
for(int value : tempArr) {
System.out.println(value);
}//end for 끝방부터 찍어라 이런거 못함 짝수번째 이런것도 ㄴㄴ무조건 처음부터 끝까지
//Collection인데 list? <나중에 JCF할때??
List<Integer> list = new ArrayList<>(); //<1.7이상..
list.add(10);
list.add(20);
list.add(110);
list.add(1);
list.add(1000);
System.out.println("==============List 이전 for==============");
for(int i=0; i<list.size(); i++) {
System.out.println(list.get(i));
}//end for
System.out.println("==============List 향상된 for==============");
for(int i : list) {
System.out.println(i);
}//end for
//<이전의 기본 for와 향상for문은 결과는 같다. 코드의 간편함이 다름
}//main
}//class
*분기문
-
break
-
continue : 반복문의 실행을 건너 뛸때 사용
-Continue
-
반복문의 실행을 건너 뛸떄 사용
-
ex)
for(int i=0; i<10; i++){
//if()
continue;
system.out.println(i);
//continue;
}//=>Error
-
<항상 if랑 함께쓰고 물어서 그조건을 만족할때 건너뛰어야하고
-
<아래쪽에 적을시에는 건너뛸게 없어서 아무소용이 없게된다.
-
조건문으로 묶어서 사용
-
반복수행코드 위에 정의한다. (아래면 쓰나마나 아무런 역할 못함)
-
break는 빠져나가고 , continue는 건너뜀
-
ex)
package day1120;
/**
* continue : 반복문내의 반복 실행 코드의 수행을 건너 뛰는 일.
*
* @author owner
*/
public class TestContinue {
public static void main(String[] args) {
//0~100까지 홀수만 출력하고 싶을때
for(int i=0; i<100; i++) {
//System.out.println("i ="+i); <반복수행코드 사이에 들어갈수도 있다.가능..
if(i%2==0){
continue;
}//end if
//continue;//<이것만 있으면 아래코드를 무조건 건너 뛰어서 Error
System.out.println("i ="+i);
//continue;//아래쪽에 코드가 없어서 건너뛸게 없어 실행시 똑같이 나온다.
}//end for
}//main
}//class
<<<숙제>>>
package day1120;
/**
*
* @author owner
*/
public class Work18 {
public static void main(String[] args) {
// 숙제 1.
// 구구단 출력 (flowchart 그리고 )
// 2x1=2 3x1=3 4x1=4 ... 9x1=9
// .
// .
// .
// 2x9=18 9x9=81
for(int i=2; i<3; i++) {
for(int j=1; j<10; j++) {
System.out.println(i+"x"+j+" = "+(i*j)+" "+
(i+1)+"x"+j+" = "+((i+1)*j)+" "+
(i+2)+"x"+j+" = "+((i+2)*j)+" "+
(i+3)+"x"+j+" = "+((i+3)*j)+" "+
(i+4)+"x"+j+" = "+((i+4)*j)+" "+
(i+5)+"x"+j+" = "+((i+5)*j)+" "+
(i+6)+"x"+j+" = "+((i+6)*j)+" "+
(i+7)+"x"+j+" = "+((i+7)*j)+" " );
}
}
System.out.println("=====================2번=============================");
// 숙제2.
// 0 0
// 1 0 1 1
// 2 0 2 1 2 2
// 3 0 3 1 3 2 3 3
for(int i=0; i<4; i++) {
for(int j=0;j<=i;j++) {
System.out.print(i+" "+j+" ");
}
System.out.println();
for(int j=0;j<=i;j++) {
System.out.print(" ");
}
}
}//main
}//class
반응형