Java - 다중 조건식 및 반복문(if~else if, swich~case)

2020. 6. 13. 18:03Java

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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
public class Ex {
 
    public static void main(String[] args) {
        /*
         * 다중 if ~ else if 문
         * - 두 가지 이상의 조건식을 사용하여 세 가지 이상의 경우의 수를 판별하는 if문
         * - 모든 조건이 만족하지 않을 때 실행할 문장을 작성하려면 else 문을 사용
         * - 주의! if문 비교는 위에서 아래로 차례대로 판별을 수행하므로
         *   범위가 좁은 문장부터 넓은 문장 순으로 비교해야함
         * 
         * < 기본 문법 >
         * if(조건식1) {
         *         // 조건식1 의 결과가 true 일 때 실행할 문장들...
         * } else if(조건식2) {
         *         // 조건식1 의 결과가 false 이고, 조건식2 의 결과가 true 일 때 실행할 문장들...
         * } else if(조건식n) {
         *         // 조건식1 ~ n-1 의 결과가 false 이고, 조건식n 의 결과가 true 일 때 실행
         * } else {
         *         // 조건식n 까지의 모든 결과가 false 일 때 실행할 문장들...
         *      // else 문은 생략 가능
         * }
         */
        
        // 홀수, 짝수, 0에 대한 판별
        int num = 0;
        
        if(num % 2 == 1) {
            System.out.println(num + " = 홀수!");
        } else if(num % 2 == 0) {
            System.out.println(num + " = 짝수!");
        } else {
            System.out.println(num + " = 0");
        }
        // => 0을 판별하는 문장이 짝수 판별 문장보다 아래쪽에 위치할 경우
        //    짝수 판별 부분에 0도 포함되므로 else 문이 실행되지 못한다!
        // => 따라서, 0을 판별하는 문장이 최소한 짝수 판별 문장보다 윗쪽에 위치해야함
        
        if(num % 2 == 1) {
            System.out.println(num + " = 홀수!");
        } else if(num == 0) { // 짝수 판별 문장보다 0 판별 문장이 위에 위치해야함
            System.out.println(num + " = 0");
        } else {
            System.out.println(num + " = 짝수!");
        }
        
        System.out.println("================================");
        
        num = 8;
        
        if(num > 5) { // num 이 5보다 클 경우
            System.out.println("num 이 5보다 크다!");
        } else if(num > 10) { // num 이 10보다 클 경우
            System.out.println("num 이 10보다 크다!");
            // => num > 5 조건식에 포함되는 조건이므로 실행될 수 없다!
        } else {
            System.out.println("num 이 5보다 크지 않고, 10보다 크지 않다.");
        }
        
        // => 위의 문장에서 10보다 큰 경우의 판별이 수행되게 할 경우
        if(num > 10) { // num 이 10보다 클 경우
            System.out.println("num 이 10보다 크다!");
        } else if(num > 5) { // num 이 5보다 클 경우
            System.out.println("num 이 5보다 크다!");
        } else {
            System.out.println("num 이 5보다 크지 않고, 10보다 크지 않다.");
        }
        
/*
         * 중첩 if문
         * - if문 등의 블록 내에서 또 다른 if문을 사용하여 조건식을 판별하기 위해
         *   if문을 여러번 중첩시키는 것
         * 
         * < 기본 문법 >
         * if(조건식1) {
         *         if(조건식2) {
         *             // 조건식1 이 true 고 조건식2 도 true 일 때 실행
         *         } else {
         *             // 조건식1 이 true 고 조건식2 가 false 일 때 실행
         *         }
         * } else {
         *         if(조건식3) {
         *             // 조건식1 이 false 이고, 조건식3 이 true 일 때 실행
         *         }
         * }
         */
        
        /*
         * if문을 사용하여 점수에 따른 학점 판별 => 점수에 대한 학점을 문자열로 저장
         * "A"학점 : 점수가 90 ~ 100
         * "B"학점 : 점수가 80 ~ 89
         * "C"학점 : 점수가 70 ~ 79
         * "D"학점 : 점수가 60 ~ 69
         * "F"학점 : 그 외의 점수
         * 단, 점수(score)가 0 ~ 100 사이가 아닐 경우 "점수 입력 오류!" 출력하고 학점 계산 중단
         */
        
        int score = 108// 점수를 저장할 변수
        String grade = ""// 학점을 저장할 변수
        
        if(score >= 0 && score <= 100) { // 점수가 0 ~ 100 사이인지 판별
            if(score >= 90 && score <= 100) {
                grade = "A";
            } else if(score >= 80 && score <= 89) {
                grade = "B";
            } else if(score >= 70 && score <= 79) {
                grade = "C";
            } else if(score >= 60 && score <= 69) {
                grade = "D";
            } else {
                grade = "F";
            }
            
            System.out.println(score + " 점의 학점 : " + grade);
        } else {
            // 점수가 0 ~ 100 사이가 아닐 때(= 잘못된 점수가 입력됐을 때)
            System.out.println(score + " : 점수 입력 오류!");
        }
        
        
        // --------------------------------------
        // Dangling Else issue
        // else 문은 가장 가까운 윗쪽의 if문과 쌍을 이룬다.
        
        int num1 = 128, num2 = 256;            
        
//        if (num1 > num2) 
//            if (num1 > 100) 
//                System.out.println("num1은 " + num1);
//            
//        else  
//            if (num2 > 100) 
//                System.out.println("num2는 " + num2);
        
        // 위의 코드를 실행하면 아래와 같은 코드 형태로 실행됨
        // => else 문은 바로 위에 있는 if(num > 100) 의 if문과 쌍을 이루기 때문에
        //    첫번째 if(num1 > num2) 조건 판별 결과가 false 일 경우 아무것도 실행되지 않음
//        if (num1 > num2) {
//            if (num1 > 100) { 
//                System.out.println("num1은 " + num1);
//            } else {  
//                if (num2 > 100) { 
//                    System.out.println("num2는 " + num2);
//                }
//            }
//        }
//            
//        System.out.println("Done");
        
        
        // 중괄호를 생략하지 않고 명확한 형태로 작성해야 논리적 오류를 막을 수 있다!
        if (num1 > num2) {
            if (num1 > 100) { 
                System.out.println("num1은 " + num1);
            }
        } else {  
            if (num2 > 100) { 
                System.out.println("num2는 " + num2);
            }
        }
 
/*
         * switch ~ case 문
         * - if문처럼 특정 조건에 대해 여러가지 판별을 수행하여 각각 다른 문장을 수행하는 조건문
         *   => 단, if문과 달리 범위에 대한 판별 등이 불가능하고, 동등 비교만 가능
         * - switch 문의 조건식에는 연산식 또는 변수 또는 리터럴이 올 수 있으나
         *   반드시 정수 또는 문자열(또는 Enum 상수) 이어야만 사용 가능
         * - case 문의 값은 조건식 결과와 비교할 리터럴 1개만 명시 가능
         * - 일치하는 case 문이 없을 때에는 default 문을 찾아서 실행함
         * - break 문을 만나면 switch ~ case 문을 빠져나감
         *   => break 문이 없을 경우 다음 break 문을 만나거나 switch 문이 종료될 때 까지
         *      현재 문장 아래쪽의 문장들을 조건식 결과와 관계없이 차례대로 실행함
         * - if문과 달리 case 문끼리의 순서는 상관없이 값만 나열하면 된다.
         * - if문은 프로그램 실행 시점에서 실행할 위치가 결정되지만,
         *   switch ~ case 문은 프로그램 컴파일(번역) 시점에서 실행 위치가 결정되므로 
         *   실행 속도가 빠름
         * 
         * 
         * < 기본 문법 >
         * switch(조건식) {
         *         case 값1 : 
         *             // 조건식 결과가 값1 과 일치하는 경우 실행할 문장들...
         *             [break;]
         *         case 값2 : 
         *            // 조건식 결과가 값2 와 일치하는 경우 실행할 문장들...
         *             [break;]
         *         case 값n : 
         *            // 조건식 결과가 값n 과 일치하는 경우 실행할 문장들...
         *             [break;]
         *         default : 
         *             // case 문 중 일치하는 값이 없을 경우 실행할 문장들...
         * }
         */
        
        int num = 3;
        
        switch(num) { // switch 문의 조건식 부분에는 정수 또는 문자열만 올 수 있다!
            case 1 : 
                System.out.println("num = 1");
                break// switch ~ case 문을 빠져나감
            case 2 : 
                System.out.println("num = 2");
                break// switch ~ case 문을 빠져나감
            case 3 : 
                System.out.println("num = 3");
                break// switch ~ case 문을 빠져나감
            default :
                // 모든 case 문에서 일치하는 값이 없을 경우 실행할 문장들...
                System.out.println("num = 기타");
//                break; // 마지막 default 문(default 가 없을 경우 마지막 case 문)에는 break 생략 가능
        }
        
        System.out.println("switch ~ case 문 종료!");
        
        System.out.println("------------------------");
        
        num = 2;
        
        switch(num) { // switch 문의 조건식 부분에는 정수 또는 문자열만 올 수 있다!
            case 1 : 
                System.out.println("num = 1");
            case 2 : 
                System.out.println("num = 2");
            case 3 : 
                System.out.println("num = 3");
            default :
                System.out.println("num = 기타");
        }
        
        System.out.println("switch ~ case 문 종료!");
        
        // => num = 2 일 때 case 2 의 문장을 실행한 후 break 문이 없으므로
        //    다음 break 문을 만나거나 switch 문이 끝날 때 까지
        //    아래쪽의 문장들을 조건과 관계없이 실행하게 된다.
        // => 따라서, num = 2 가 출력된 후 num = 3 출력, num = 기타 문장도 출력됨
        
        System.out.println("==================================");
        
        int score = 88;
        
        switch(score) {
            case 100 : System.out.println("A학점"); break;
            case 99 : System.out.println("A학점"); break;
            case 98 : System.out.println("A학점"); break;
            // .... 생략 ....
            case 89 : System.out.println("B학점"); break;
            case 88 : System.out.println("B학점"); break;
        }
        
        // switch ~ case 문으로 학점 계산 시 범위 지정이 불가능하므로 점수 각각의 비교 필요
        // 단, 위의 코드를 짧게 줄이기 위해 연산식을 사용할 수 있음
        switch(score / 10) {
            case 10 : // 결과값이 10일 때 break 문이 없으므로 case 9 문장을 실행
            case 9 : System.out.println("A학점"); break;
            case 8 : System.out.println("B학점"); break;
            case 7 : System.out.println("C학점"); break;
            case 6 : System.out.println("D학점"); break;
            case 5 : // 결과값이 1 ~ 5 일 때
            case 4 : // 실행할 문장이 0과 동일하므로
            case 3 : // break 문 없이 빈 문장으로 놔둔 후
            case 2 : // 마지막 case 0 에 실행할 문장 작성 시
            case 1 : // case 0 ~ 5 까지 하나의 문장으로 처리됨
            case 0 : System.out.println("F학점");
        }
        // => 문제점 101 ~ 109 점까지의 점수가 A 학점으로 취급됨
        // => switch ~ case 문 판별 전 if문을 사용하여 0 ~ 100 사이의 점수만 계산에 사용
        System.out.println("=====================");
        
        score = 108;
        
        if(score >= 0 && score <= 100) {
            // 점수가 0 ~ 100 사이일 때만 switch 문을 실행
            switch(score / 10) {
                case 10 : // 결과값이 10일 때 break 문이 없으므로 case 9 문장을 실행
                case 9 : System.out.println("A학점"); break;
                case 8 : System.out.println("B학점"); break;
                case 7 : System.out.println("C학점"); break;
                case 6 : System.out.println("D학점"); break;
                default : System.out.println("F학점");
                // => F 학점은 정상 범위 내에서 D 학점보다 점수가 작은 모든 점수는 F 학점이므로
                //    default 문을 사용하면 F 학점에 대한 모든 판별이 가능함
            }
        } else {
            System.out.println(score + " : 점수 입력 오류!");
        }
 
/*
         * 반복문
         * - 특정 조건에 따라 문장들을 반복 실행하는 문
         * 
         * 1. for문
         * - 가장 기본적인 반복문
         * - 반복 횟수가 정해져 있는 경우 주로 사용
         * - 초기식, 조건식, 증감식의 위치가 정해져 있어, 초보자가 익히기에 쉬움
         * - 초기식에서는 반복 횟수를 판별하기 위한 조건식에서 사용될 
         *   제어변수를 선언하거나 초기화하는 문장을 기술
         * - 조건식에서는 반복 여부를 결정하기 위한 조건식을 결과가 true/false 가 되도록 기술
         * - 증감식에서는 반복을 위한 조건식에 맞춰 제어변수가 변하도록 증가/감소시키는 문장 기술  
         * 
         * < 기본 문법 >
         * for(초기식; 조건식; 증감식) {
         *         // 조건식의 결과가 true 일 때 반복 실행할 문장들...
         * }
         */
        
        System.out.println("1 : Hello, World!");
        System.out.println("2 : Hello, World!");
        System.out.println("3 : Hello, World!");
        System.out.println("4 : Hello, World!");
        System.out.println("5 : Hello, World!");
        System.out.println("6 : Hello, World!");
        System.out.println("7 : Hello, World!");
        System.out.println("8 : Hello, World!");
        System.out.println("9 : Hello, World!");
        System.out.println("10 : Hello, World!");
        
        System.out.println("------------------");
        
        // 위의 문장 10개를 반복문을 사용하여 압축
        // => 제어변수 i가 1부터 10보다 작거나 같을 동안 1씩 증가하면서 반복
        //    "Hello, World!" 문자열을 출력
        // => 초기식 : 제어변수 i를 1로 초기화
        //    조건식 : 제어변수 i가 10보다 작거나 같다
        //    증감식 : 제어변수 i를 1씩 증가
        for(int i = 1; i <= 10; i++) {
            System.out.println(i + " : Hello, World!");
        }
        
        /*
         * 위의 for문에 대한 디버깅(Debugging) 과정
         * --------------------------------------------------------------------------
         * 초기식(i)  조건식(i <= 10)   실행결과(i + " : Hello, World!")  증감식(i++)
         * --------------------------------------------------------------------------
         *     1           true            "1 : Hello, World!" 출력            2
         *     2           true            "2 : Hello, World!" 출력            3
         *     3           true            "3 : Hello, World!" 출력            4
         *     4           true            "4 : Hello, World!" 출력            5
         *     5           true            "5 : Hello, World!" 출력            6
         *     6           true            "6 : Hello, World!" 출력            7
         *     7           true            "7 : Hello, World!" 출력            8
         *     8           true            "8 : Hello, World!" 출력            9
         *     9           true            "9 : Hello, World!" 출력           10
         *    10           true           "10 : Hello, World!" 출력           11
         *    11           false          for문을 종료하고 빠져나감
         */
        
        System.out.println("=====================================================");
        
        // i가 1 ~ 10 까지 1씩 증가하면서 출력 => 1 2 3 4 5 6 7 8 9 10
        for(int i = 1; i <= 10; i++) {
            System.out.print(i + " ");
        }
        
        System.out.println(); // 줄바꿈 역할
        
        System.out.println("------------------------");
        
        // i가 1 ~ 10 까지 2씩 증가하면서 출력(홀수 출력) => 1 3 5 7 9
        for(int i = 1; i <= 10; i += 2) {
            System.out.print(i + " ");
        }
        
        System.out.println(); // 줄바꿈 역할
        
        System.out.println("------------------------");
        
        // i가 2 ~ 10 까지 2씩 증가하면서 출력(짝수 출력) => 2 4 6 8 10
        for(int i = 2; i <= 10; i += 2) {
            System.out.print(i + " ");
        }
        
        System.out.println(); // 줄바꿈 역할
        
        System.out.println("------------------------");
        
        // i가 10 ~ 1 까지 1씩 감소하면서 출력 => 10 9 8 7 6 5 4 3 2 1
        for(int i = 10; i >= 1; i--) {
            System.out.print(i + " ");
        }
        
char ch = '!';
        System.out.println("문자 ch = " + ch);
        
        // 문자 ch 에 대한 대소문자 상호 변환
        // 문자 ch 가 대문자일 경우 소문자로 변환하여 출력하고,
        // 소문자일 경우 대문자로 변환하여 출력하고,
        // 그 외에는 그대로 출력
        if(ch >= 'A' && ch <= 'Z') { // 대문자 판별
            System.out.println("대문자를 소문자로 변환!");
            ch += 32;
        } else if(ch >= 'a' && ch <= 'z') { // 소문자 판별
            System.out.println("소문자를 대문자로 변환!");
            ch -= 32;
        } else {
            System.out.println("기타 문자이므로 변환 없음!");
        }
        
        System.out.println(ch);
        
        System.out.println("===============================");
        
        int score = 108// 점수를 저장할 변수
        String grade = ""// 학점을 저장할 변수
        
        /*
         * if문을 사용하여 점수에 따른 학점 판별 => 점수에 대한 학점을 문자열로 저장
         * "A"학점 : 점수가 90 ~ 100
         * "B"학점 : 점수가 80 ~ 89
         * "C"학점 : 점수가 70 ~ 79
         * "D"학점 : 점수가 60 ~ 69
         * "F"학점 : 그 외의 점수
         */
        if(score >= 90 && score <= 100) {
            grade = "A";
        } else if(score >= 80 && score <= 89) {
            grade = "B";
        } else if(score >= 70 && score <= 79) {
            grade = "C";
        } else if(score >= 60 && score <= 69) {
            grade = "D";
        } else {
            grade = "F";
        }
        
        System.out.println(score + " 점의 학점 : " + grade);
 
        
    }
 
}
 
 
cs

다중 if 문을 활용하여 조건식도 앞서 배웠던 다양한 사칙 연산자들과 관계 연산자들을 활용하여서 조건식을 작성해보고 if문 안에 실행할 문장들도 작성해 보았다. 그리고 중첩 if문도 활용해보았는데 큰 틀을 먼저 정하고 그 안에서 활용할 작은 틀에서 활동하는 문장들도 작성해 보았다. 프로그래밍 언어의 연산과정을 좀 더 이해하게 되었고 컴퓨터란 친구를 잘 다루기 위해서는 개발자 입장에서 좀 더 세세하게 계획을 정해서 정해주어야 한다는 것도 느끼게 되었다. 반복문 같은 경우에는 처음에 for() 괄호 안에 적을 식이 세 가지 되는데 조금 헷갈렸지만 금방 적응해서 어려움은 없었다. swich ~case 문 같은 경우에는 조금 어렵게 생각이 들었는데 조건식을 정해주는 게 for 문에 비하면 좁은 범위이기 때문에 응용력이 딸려서 그런지 처음엔 조금 어렵게 느껴졌었다. 하지만 활용되는 부분이 좀 적다고 해주셔서 가벼운 마음으로 배웠다. 하지만 조금 어렵게 느껴졌던 조건식 정해주는 부분에 대해서는 복습을 통해 계속 봐서 나의 머리를 발전시켜야겠다고 느꼈다. 간단한 문제를 받아서 배운 것들을 토대로 풀어 보았는데 너무 재미있었다. 좀 막히더라도 생각을 해서 풀려고 하는 과정이 너무 재미있었다. 같은 수업을 듣는 다른 사람들도 다들 열심히 하셔서 나도 더 열정적으로 배워가고 있는 것 같다. 앞으로 남은 기간이 더욱 기대가 된다.