반복문 / 제어문 생각할 점
1.조건을 지정한다. 어떻게 조건을 지정해야할까?
2.인덱스를 쓸거냐 안쓸거냐에 따라 while문을 쓸지 for문을 쓸지 결정한다. 그리고 인덱스의 범위에 주의한다.
3.상태유지를 할거냐 안할거냐(저장변수필요)를 결정한다.
4.제어의 흐름을 어떻게 제어 할 것인가
1.while문과 for문
while:반복 제한 개수 제한 없음.
for:반복 제한 개수 제한. 인덱스 활용가능. 반복 위치와 횟수를 알고 싶을 때 for문을 활용, 인덱스가 있다면 for문을 사용한다. while문에서 인덱스를 활용하기 위해 변수를 사용하면 새로 생성한 변수가 다른 코드에 영향을 끼칠 수 있다.
문제 ) 파일에서 성적을 5번째 '까지'만 읽어서 다음처럼 화면에 출력하시오.
30,49,38,49,50
public class breakAndcontinue {
public static void main(String[] args) throws IOException {
// 문제 1 ) 파일에서 성적을 5번째 까지만 읽어서 다음처럼 화면에 출력하시오.
// 30,49,38,49,50
FileInputStream fis = new FileInputStream("res/exam.list");
Scanner fscan = new Scanner(fis);
---------------------------while 문-----------------------------
int index = 0; // while문 횟수 제한을 위해 인덱스 변수를 선언한다.
while(fscan.hasNext()) {
String word = fscan.next(); //next는 문자열의 공백을 기준으로 한 단어 한 문자를 읽는다.
int kor = Integer.parseInt(word);//word의 데이터 값이 문자열이기 때문에 String -> Int로 바꾸는 Integer.parseInt()를 사용한다.
if(index==5)
break;
index++;
System.out.printf("%d,",kor);
}
--------------------------------for문-----------------------------------------
for(int i=0; fscan.hasNext(); i++) {
String word = fscan.next(); //next는 문자열의 공백을 기준으로 한 단어 한 문자를 읽는다.
int kor = Integer.parseInt(word); //word의 데이터 값이 문자열이기 때문에 String -> Int로 바꾸는 Integer.parseInt()를 사용한다.
System.out.printf("%d,",kor);
}
fscan.close();
fis.close();
}
}
while문과 for문 둘의 차이를 이해하기 좋은 문제다. while문과 for문 둘다 반복 횟수에 제한을 둘 수 있다. 하지만 while문은 변수를 하나 더 설정해야한다는 번거로움이 있다. 그래서 반복의 제한을 걸 때는 while문 보다 for문을 활용하자.
2.인덱스를 변경 하지말라. 인덱스 사용방법 이해하기
for문의 인덱스를 변경하지 않는다. 인덱스는 0부터 시작하는데 인덱스를 변경하기 시작하면 인덱스의 의미가 사라지고 문제가 발생한다.
문제) 다음 수를 for문을 이용해 출력해보자.
1 2 3 4 5 6 7 8 9 10
public class ForTestProgram {
public static void main(String[] args) {
for(int i=1; i<=10; i++)
System.out.printf("%d ", i);
System.out.println();
}
}
위와 같은 코드로 작성해도 결과물이 출력되지만, '인덱스를 건들지 않는다'는 원칙을 어겼다. 인덱스를 고치지 않으면 코드는 아래와 같다.
public class ForTestProgram {
public static void main(String[] args) {
for(int i=0; i<10; i++)
System.out.printf("%d ", i+1);
System.out.println();
}
}
인덱스를 변경하지 말고 문제를 또 하나 풀어보자.
10 9 8 7 6 5 4 3 2 1을 표현해보자.
public class ForTestProgram {
public static void main(String[] args) {
for(int i=10; i<0; --)
System.out.printf("%d ", 10-i);
System.out.println();
}
}
인덱스를 건드니 출력값이 안나온다.
public class ForTestProgram {
public static void main(String[] args) {
for(int i=0; i<10; i++)
System.out.printf("%d ", 10-i);
System.out.println();
}
}
인덱스를 바꾸지 않고 출력문의 식 '10-i'를 써주니 출력이 됐다. 인덱스를 바꾸지 않고 출력한다는 개념이 생소하다. 인덱스는 변하지 않으므로 인덱스가 '0,1,2,3,4...' 를 기준으로 값을 어떻게 만들 수 있을지 생각하면 문제가 풀린다.
더 심화된 문제를 풀어보자. for문을 이용해
3 4 5 6 7
숫자를 출력해보자.
public class ForTestProgram {
public static void main(String[] args) {
for(int i=0; i<5; i++)
System.out.printf("%d ", i+3);
System.out.println();
}
}
인덱스에서 5개의 숫자 '0,1,2,3,4'를 어떻게하면 '3,4,5,6,7'을 만들 수 있을지 고민하면 쉽게 풀 수 있다. 각 숫자에 '+3'을 해주면 문제가 해결된다. 즉, 인덱스를 기준으로 결과값을 어떻게 만들지 생각하면 문제를 풀 수 있다.
for 문을 이용해 1부터 9까지 5개의 숫자를 출력하는 코드를 짜보자.
1 3 5 7 9
인덱스에 추가되는 값이 1씩 증가된다는 단서를 찾았다. 이 단서에 가장 잘 맞는 코드는 짝꿍이 쓴 코든데 코드는 다음과 같다.
public class ForTestProgram {
public static void main(String[] args) {
for(int i=0; i<5; i++)
System.out.printf("%d ", i+(i+1));
System.out.println();
}
}
그런데 선생님은 인덱스에 연연하지 않고 n이라는 변수를 for문에 사용하여 문제를 풀이하셨는데, for문안에 변수를 사용할 수 있고 출력값을 만드는 방식이 특이해서 코드를 올려놓는다.
public class ForTestProgram {
public static void main(String[] args) {
for(int i=0, n=1; i<5; i++, n+=2)
System.out.printf("%d ", n);
System.out.println();
}
}
인덱스 대신 변수를 활용하면, 코드를 보다 간편하게 쓸 수 있다.
인덱스와 변수를 동시에 써야하는 문제를 하나 풀어보자.
for문을 이용해서 다음처럼 10개의 숫자를 출력하는 코드를 작성해보자
6 10 14 18 22 26 30 34 38 42
public class ForTestProgram {
public static void main(String[] args) {
// 문제 3) for문을 이용해서 다음처럼 10개의 숫자를 출력하는 코드를 작성하시오
// 6 10 14 18 22 26 30 34 38 42
for(int i=0, n=1; i<10; i++, n+=4)
System.out.printf("%d ", n+5);
System.out.println();
}
}
코드를 단순하게 풀 때는 위의 식대로 풀 수 있지만, 숫자의 규칙성을 보면 4씩 증가하는 '등차수열'인걸 알 수 있다. 수학을 알고 등차수열의 일반항을 알면, 위의 식은 다음과 같이 보다 알기 쉽게 표현할 수 있다.
public class ForTestProgram {
public static void main(String[] args) {
for(int i=0, n=1, an=6; i<10; i++, n++, an=6+(n-1)*4)
System.out.printf("%d ", an);
System.out.println();
}
}
3.N번 반복하는 for문의 두 가지 인덱스
인덱스를 사용하거나 변수를 사용하거나 아니면 둘 다 사용하는 표현 방식을 보여준다.
4.Continue / break
4.1 break와 continue문제
문제1)
res/exam.list 파일에 국어 성적을 다음처럼 저장한다.
30 49 38 49 50 80 90 100 70 50 60 74 50 33 50 65 76 69
exam.list파일의 데이터를 읽어들여 콘솔에 다음과 같이 출력한다.
30, 49, 38, 49, 50, 80, 90, 100, 70, 50, 60, 74, 50, 33, 50, 65, 76, 69,
public class breakAndcontinue {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("res/exam.list");
Scanner fscan = new Scanner(fis);
while(fscan.hasNext()) {
String word = fscan.next(); //next는 문자열의 공백을 기준으로 데이터를 구분하여 읽는다.
int kor = Integer.parseInt(word); //word의 데이터 값이 문자열이기 때문에 String -> Int로 바꾸는 Integer.parseInt()를 사용한다.
System.out.printf("%d, ",kor);
}
fscan.close();
fis.close();
}
}
'뉴렉처 > 자바' 카테고리의 다른 글
[뉴렉처/자바] ★배열 2023.06.21 (0) | 2023.06.21 |
---|---|
[뉴렉처/자바] ★반복문과 제어문 2023.06.20 (0) | 2023.06.20 |
[뉴렉처/자바]★반복문과 제어문 2023.06.19 (1) | 2023.06.19 |
[뉴렉처/자바] ★반복문과 제어문 2023.06.16 (0) | 2023.06.16 |
[뉴렉처/자바] ★반복문과 제어문 2023.06.15 (0) | 2023.06.15 |