반응형
[Java] 9. for문
자바 반복문에는 for문, while문, do-while문이 있고, 그 중 for문이 가장 많이 사용된다.
for문은 반복문으로 특정 명령들을 원하는 만큼 반복처리할 때 사용하는 제어문이다. 조건을 만족할 때 실행 명령문을 처리하고 그렇지 않으면(조건을 만족하지 못하면) for문을 빠져나가게 되어있다.
for(초기식; 조건식; 증감식){ 실행문1; 실행문2; ... } |
초기식은 가장 먼저 실행하는 부분이고, 두 번 다시 실행되지 않는다(다중 for문에서는 실행될 수 있다).
조건식은 초기식 다음으로 실행하는 부분이고, 루프(loop)가 돌 때마다 한 번찍 비교해 반복을 실행할 지 벗어날 지를 결정한다.
증감식은 루프를 실행할 때마다 조건식에서 비교하기 전 항상 실행하고 조건식에 사용되는 변수값을 증가하거나 감소하게 해 루프를 원활하게 실행하거나 무한루프를 피하게 한다.
*루프는 프로그램의 실행흐름을 뜻한다.
*주의할 점은 C언어처럼 초기식, 조건식, 증감식 사이에 콤마(,)를 써서 구분할 수 없고, 세미콜론(;)을 써야 한다.
다음은 for문을 이용해 문자를 여러번 출력하고, 1부터 10까지의 합을 구하는 프로그램이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
package mymain;
public class _3_for문1 {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
for(int i=0;i<3;i++) //0, 1, ... , n-1(n개)
{
//i는 지역변수({}안에서만 사용됨, block안에서만 사용가능, 바깥에서 정의되면 block바깥에서도 사용가능)
System.out.println("나는 수학 연구가:"+i);
}
int s = 0; //값을 누적시킬 변수
for (int i = 1; i <= 10; i++) {
System.out.print(i);
if (i != 10)
System.out.print('+');
else
System.out.print('=');
s = s + i; //i값을 누적
Thread.sleep(1000); // 1초씩 대기
}
System.out.printf("%d\n", s);
//다른 방법(순서를 거꾸로함)
s=0;
int n=10;
for(int i=n; i>=0; i--) { //i=10, 9, 8, 7,..., 0
s=s+i;
}
System.out.println(s);
}
}
|
cs |
이 프로그램의 실행결과는 다음과 같다.
나는 수학 연구가:0 나는 수학 연구가:1 나는 수학 연구가:2 1+2+3+4+5+6+7+8+9+10=55 55 |
문자 출력 부분에서
for(int i=0;i<3;i++) //0, 1, ... , n-1(n개) { //i는 지역변수({}안에서만 사용됨, block안에서만 사용가능, 바깥에서 정의되면 block바깥에서도 사용가능) System.out.println("나는 수학 연구가:"+i); } |
초기식 부분은 i=0, 조건식 부분은 i<3, 증감식 부분은 i++(1씩 증가)로 되어있다.
각각 i=0, i=1, i=2(총 3회)일 때 실행되어 문자열이 총 3번 출력된다.
1부터 10까지의 합 부분에서
int s = 0; //값을 누적시킬 변수 for (int i = 1; i <= 10; i++) { System.out.print(i); if (i != 10) System.out.print('+'); else System.out.print('='); s = s + i; //i값을 누적 Thread.sleep(1000); // 1초씩 대기 } System.out.printf("%d\n", s); //다른 방법(순서를 거꾸로함) s=0; int n=10; for(int i=n; i>=0; i--) { //i=10, 9, 8, 7,..., 0 s=s+i; } System.out.println(s); |
위의 for문은 초기식이 i=1, 조건식이 i<=10, 증감식이 i++(1씩 증가)로 되어있고, 실행문은 i를 출력(엔터치지 않음)하는데 i를 출력한 다음에 i가 10이 아니면 +를 출력하게 하고, 그렇지 않으면(10이면) =를 출력하게 하는 if문이 있다.
또한 s=s+i라고 되어있는데 이 부분은 s=0이고 i=1이므로 0+1을 s에 대입한다,
그 다음으로 s=1이고 i=2이므로 1+2=3을 s에 대입한다.
그 다음으로 s=3이고 i=3이므로 3+3=6을 s에 대입한다.
그 다음으로 s=6이고 i=4이므로 6+4=10을 s에 대입한다.
...
마지막으로 s=45이고 i=10이므로 45+10=55를 s에 대입한다.
그러면 s=55이고, 이것이 1부터 10까지의 합이다.
=이 나온 다음에는 s를 출력하라는 명령이 있으므로 1+2+...+9+10=55가 출력된다.
다른 방법을 보면 s=0이고 n=10으로 설정한 후 for문 초기식에 i=n, 조건식에 i>=0, 증감식에 i--(1씩 감소)로 되어있다. 이 방법은 10부터 1까지 거꾸로 더하는 방법이다.
여기서 Thread.sleep(1000)이라고 입력했는데 이것은 1초씩 대기하라는 명령어이다. 참고로 Thread.sleep(1)은 1/1000초 대기하라는 명령어이고 이 명령어를 입력하면 에러가 뜨는데 다음과 같이 조치하면 된다.
에러가 난 상태에서 원인이 된 코드인 Thread.sleep(10)에 마우스를 갖다대면 위 그림처럼 창이 뜨는데 왼쪽에
Add throws declaration(위)과 Surround with try/catch(아래)가 뜰 것이다. 위에 있는 throws를 클릭한다.
클릭했다면 InterruptedException이 뜨는데 중간에 있는 Exception을 클릭한다. 그러면 끝이다.
*Thread.sleep(1000)부분은 주석처리해도 무난하다.
다음은 각각 1부터 11까지의 홀수만의 합, 짝수만의 합을 구하는 프로그램이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
package mymain;
public class _3_for문2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
// n까지 홀수의 합 구하기
int s = 0; // 값을 누적시킬 변수
int n = 11;
for (int i = 1; i <= n; i++) {
// i<=n 만족하면 실행
//i값을 누적
if(i%2==1) //홀수면 누적
s = s + i;
}
System.out.printf("1부터 %d까지의 홀수들의 합: %d\n",n, s);
//n까지 짝수의 합 구하기
s = 0; // 값을 누적시킬 변수
n = 11;
for (int i = 1; i <= n; i++) {
// i<=n 만족하면 실행
//i값을 누적
if(i%2==0) //짝수면 누적
s = s + i;
}
System.out.printf("1부터 %d까지의 짝수들의 합: %d\n",n, s);
System.out.println("참고: 1부터 10까지의 합은 55이다");
}
}
|
cs |
이 프로그램의 실행결과는 다음과 같다.
1부터 11까지의 홀수들의 합: 36 1부터 11까지의 짝수들의 합: 30 참고: 1부터 10까지의 합은 55이다 |
홀수를 2로 나누면 그 나머지가 1이고, 짝수는 2로 나누어 떨어진다(나머지가 0). 이 성질을 이용해서 for문 안에
if문을 설정하고, 그 조건문에 2로 나눈 나머지가 1이면 홀수가 됨을 이용하고, 나머지가 0이면 짝수가 됨을 이용했다.
마지막으로 다음은 알파벳에 특정한 규칙을 주어 순서대로 출력하는 프로그램이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
package mymain;
public class _3_for문3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//A-Z까지 출력
System.out.println("ABCD....XYZ");
//A B C D E ...
//65 66 67 68 69...
//방법 1
for(int i=65; i<91 ;i++) {// i=65, 66, ..., 90
System.out.printf("%c", i);
}
System.out.println();
//방법 2
for(int i='A'; i<='Z' ;i++) {// i='A', 'B', ..., 'Z'
System.out.printf("%c", i);
}
System.out.println();
// 방법 3
for (int i = 0; i < 26; i++) {// i=0, 1, 2, 3, ..., 25
System.out.printf("%c", 'A' + i);
}
System.out.println();
//대소대소대소
//AbCdEfGh...
for (int i = 65; i < 91; i++) {// i=65(A), 66(B), ..., 90(Z), 97(a), 98(b)
if (i % 2 == 1)// 홀수
System.out.printf("%c", i);// 대문자
else
System.out.printf("%c", i + 32);// 소문자
}
System.out.println();
//0123456789012
//AbcDefGhiJklM....(대소소대소소대소소)
for (int i = 0; i < 26; i++) {// i=0, 1, 2, 3, ..., 25
if(i%3==0)
System.out.printf("%c", 'A' + i);
else
System.out.printf("%c", 'A' + i+32);
}
System.out.println();
//012-345-678-901-
//ABC-DEF-GHI-JKL-...
for (int i = 0; i < 26; i++) {// i=0, 1, 2, 3, ..., 25
if(i%3==2 && i!=0)
System.out.printf("%c-", 'A' + i);
else
System.out.printf("%c", 'A' + i);
}
System.out.println();
}
}
|
cs |
이 프로그램을 실행하면 다음과 같이 출력된다.
ABCD....XYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ AbCdEfGhIjKlMnOpQrStUvWxYz AbcDefGhiJklMnoPqrStuVwxYz ABC-DEF-GHI-JKL-MNO-PQR-STU-VWX-YZ |
위 코드에서 방법 1은 for문으로부터 알파벳의 아스키코드를 입력받아 문자로 출력하는 방법이 이용되었고, 방법 2는 for문에 알파벳 문자를 초기값과 조건값에 설정하는 방법이, 방법 3은 A문자에 0부터 25까지 더하는 방법이 이용되었다.
그 밑에서 3개의 줄에는 알파벳이 A부터 Z까지 다음의 규칙에 따라 출력되었는데
1. 홀수번째 알파벳은 대문자, 짝수번째 알파벳은 소문자
2. 3의 배수번째 알파벳(초기식은 i=0이다.)은 대문자, 그 나머지는 모두 소문자
3. 3으로 나눈 나머지가 2가 되는번째 알파벳(초기식은 i=0이다.) 뒤에 하이픈(-) 문자넣기
모두 for문 안에 if문을 넣어 나누기 연산의 성질(어떤 수를 어떤 수로 나누면 몫과 나머지가 존재)을 이용해서 if문의 조건문을 만들었다.
반응형
'Coding(Java) > Java(이론)' 카테고리의 다른 글
[Java] 11. do-while문, continue문 (0) | 2021.08.30 |
---|---|
[Java] 10.while문 (0) | 2021.08.25 |
[Java] 8. switch문 (0) | 2021.08.23 |
[Java] 7. if문 (0) | 2021.08.23 |
[Java] 6. 시프트, 관계, 이진논리, 일반논리, 3항, 대입연산자 (0) | 2021.08.20 |