if, else if, else 정리
기본 문법(Syntax)
if (조건부분 1) {
// 수행 부분 1
} else if (조건 부분 2) {
// 수행 부분 2
} else if (조건 부분 3) {
// 수행 부분 3
} else {
// 수행 부분 4
}
조건문의 기본 구조이다. 조건 부분 1이 true이면 수행 부분 1이 실행되고 수행 부분 2~수행 부분 4는 실행되지 않는다.
조건 부분 1이 false이면 수행 부분 1은 건너뛰고 조건 부분 2를 확인한다. 조건 부분 2가 true이면 수행 부분 2가 수행되고 조건문이 끝나게 된다.
조건 부분 1~조건 부분 3 모두 false이면 수행 부분 4가 실행된다.
예제를 몇 개 살펴보자.
예제 1
int number = 13;
if (number % 2 == 0) {
System.out.println("even number");
} else {
System.out.println("odd number");
}
odd number
13을 2로 나누면 나머지는 1이다. 1은 0과 같지 않으니까 조건 부분은 false가 나온다. 그래서 else 부분으로 넘어가 "odd number"를 출력하는 명령어가 수행되는 것이다.
예제 2
int x = 10;
int y = 1;
if (x != 10 || x % 2 != 0) {
System.out.println(x);
} else if (y == 1) {
System.out.println(y);
} else {
System.out.println(x + y);
}
1
x는 10이 맞기 때문에 x != 10 는 false이다. x는 2로 나누어 떨어지기 때문에 x % 2 != 0 도 false이다. false || false는 false이기 때문에 if문의 조건 부분은 결과적으로 거짓이다.
그러면 이제 else if의 조건 부분을 확인하는데, y == 1은 true이기 때문에 y의 값인 1이 출력된다.
switch 정리
기본 문법(Syntax)
if문의 조건 부분은 불린 결과값을 내는 식이었다. 그런데 switch문의 조건 부분은 숫자, 문자열 등의 결과값을 내는 식이다. 그리고 그 결과값에 따라 실행되는 코드가 정해지는 것이다.
int i = 10;
if (i % 3 == 0) { // i < 20 : 불린 식, 변수, 메소드
System.out.println("C 구역입니다.");
} else if (1 % 3 == 1) {
System.out.println("A 구역입니다.");
} else {
System.out.println("B 구역입니다.");
}
switch (i % 3) { // i : 불린이 아닌 식, 변수, 메소드
case 0:
System.out.println("C 구역입니다.");
break;
case 1:
System.out.println("A 구역입니다.");
break;
default:
System.out.println("B 구역입니다.");
break;
}
합격-불합격, 옳다-그르다 등과 같은 방식으로 흐름을 나누는 것보다 여러 개의 동등한 조건의 나열에는 switch문이 더 편리하다.
예제 1
/*
* A+: 100
* A : 90-99
* B : 80-89
* C : 70-79
* D : 60-69
* F : 0-59
*/
// 시험 점수
int score = 97;
// 성적
String grade;
위의 기준에 따라 점수를 주는 프로그램을 짜보자. 점수 score를 가지고 이 여섯 가지 경우를 잘 표현하려면 어떻게 할 수 있을까?
지난 시간에 정수 나누기 정수는 소수부분이 버려진다고 배웠다. score / 10 하면 9.7이었는데 소수 부분이 버려지고 9가 될 것이다. 이 점을 이용하면 score가 90-99일 때를 score / 10이 9와 같을 때로 얘기할 수 있다. 마찬가지로 score가 80-89일 때 score / 10은 8이고, score가 70-79일 때 score / 10은 7이다.
그럼 스위치 문의 조건부에 score 나누기 10을 넣어보자.
switch (score / 10) {
...
}
그리고 switch문의 내용을 적어야 하는데 score / 10이 각각 10, 9, ..., 6인 경우를 적고, 모두 아닐 경우의 default도 적어 보자.
switch (score / 10) {
case 10:
grade = "A+";
break;
case 9:
grade = "A";
break;
case 8:
grade = "B";
break;
case 7:
grade = "C";
break;
case 6:
grade = "D";
break;
default:
grade = "F";
break;
}
어떻게 진해되는지 살펴보자.
score / 10이 10이면 case 10: 의 수행 부분으로 들어가서 "A+"가 grade에 지정된다. 그리고 break 때문에 바로 switch문은 끝난다.
마찬가지로 score / 10이 9면 case 9: 의 수행 부분으로 들어가서 "A"가 grade에 지정되고, break 때문에 switch문이 끝난다.
이런 식으로 score / 10이 8, 7, 6인 경우도 비슷하게 동작할 것이다. 그런데 만약에 score / 10이 10, 9, 8, 7, 6 중에 해당되는 값이 없으면 default의 수행 부분으로 들어가서 "F"가 grade에 지정되고 switch문은 끝난다.
switch문이 끝나고 grade의 값이 뭔지 출력해보자.
System.out.println("성적: " + grade);
성적: A
정수 97 나누기 정수 10은 정수 9이기 때문에 "A"가 나온다.
score를 75로 바꾸고 실행해보면:
// 시험 점수
int score = 75;
성적: C
"C"가 출력된다.
40으로 바꾸고 실행해보면:
// 시험 점수
int score = 40;
성적: F
default로 들어가서 "F"가 출력된다.
첫 번째 예시를 봤는데, 이렇게 몇 가지 경우로 딱딱 나누어지는 경우에는 if, else if를 쓰는 것보다 switch를 쓰는 게 훨씬 직관적이다.
예시를 하나만 더 보자.
예제 2
이번에는 switch의 조건 변수를 앞에서 사용했던 문자열 변수 grade로 한다.
switch (grade) {
case "A+":
case "A":
case "B":
System.out.println("참 잘했어요!");
break;
case "C":
case "D":
System.out.println("조금만 더 노력해 볼까요?");
break;
case "F":
System.out.println("Fail입니다.");
default:
System.out.println("다시 수강해주세요.");
break;
}
두 번째 예시는 break문을 주의 깊게 보도록 하겠다. case "A", case "B" 사이에 아무런 명령도 없고 break문도 없다. 만약 grade가 "A+"이면 case "A+"로 들어왔다가 바로 case "A"로 넘어가고 또 바로 case "B"로 넘어간다. break가 없기 때문이다.
즉, 이 switch문은 grade가 "A+" 또는 "A" 또는 "B"이면 "참 잘했어요."가 출력되고, "C" 또는 "D"이면 "조금만 더 노력해 볼까요?"가 출력되는 것이다.
만약 "F"면? 여기 case "F"로 들어와서 "Fail 입니다."가 출력되고, break가 없으니 default로 넘어가서 "다시 수강해 주세요" 까지 출력이 된다.
while문 정리
기본 문법(Syntax)
while (조건 부분) {
수행 부분
}
while문은 조건 부분이 true인 동안 계속 반복해서 수행 부분을 실행하는 구문이다. 수행 부분에서 조건이 false가 되도록 바꾸어 주거나 break; 를 통해서 반복문을 종료시킬 수 있다.
while문은 반복 횟수를 정확히 알 수 없는 동작, 혹은 특별한 조건에서만 멈추어야할 경우 등에서 자주 사용한다. 다음 시간에 배울 for문은 반복 횟수를 while문 보다 직관적으로 조절할 수 있다는 점이 차이점이다.
예제
문제: 1, 2, 3, ... 을 하나씩 더한 값이 10,000보다 크거나 같아졌을 때, 마지막으로 더한 값은 무엇일까?
int sum = 0, i = 1;
while (sum < 10000) {
sum += i;
i++;
}
System.out.println(sum);
System.out.println(i - 1);
10011
141
먼저 while문을 수행하기 전에 필요한 변수들을 준비한다. 합을 기록할 sum과 1씩 증가시키며 더해야 할 i이다.
while문의 조건은 sum < 10000으로 준다. sum이 10000보다 작을 동안 i를 1씩 증가시키는 과정을 반복해야하기 때문이다. 즉, sum이 10000보다 크거나 같으면 반복문을 멈춘다고 생각하면 된다.
조건 부분을 통과하면 sum에 i를 더하고, i에 1을 더한다.
반복문이 끝나고 값들을 출력해보면 예상대로 sum은 10000보다 크거나 같고, 우리가 마지막에 더한 값을 알 수 있다.
이 문제를 break를 써서 푸는 방법도 있다.
int sum = 0, i = 1;
while (true) {
if (sum >= 10000) {
break;
}
sum += i;
i++;
}
System.out.println(sum);
System.out.println(i - 1);
10011
141
while (true) 를 써줬기 때문에 모든 경우에 반복문이 들어가는데, 그 대신 sum >= 10000가 true인 경우에 반복문은 끝나게 된다.
실습과제: while문 연습
10000미만의 정수 중에서 153의 배수 중 가장 큰 값을 찾아 출력하세요.
9945
public class Main {
public static void main(String[] args) {
int num = 10000;
int key = 153;
// 여기에 코드를 작성하세요.
while (num % key > 0) {
num--;
}
System.out.println(num);
}
}
for문 정리
기본 문법(Syntax)
for (초기화식; 종결 제어식; 증감 제어식) {
// 수행부분
}
for문의 조건 부분은 세 가지로 나누어 진다.
- 초기화식(initialization)
- 종결 제어식(termination)
- 증감 제어식(increment)
for문을 이용해서 1부터 10까지 출력하려면 이렇게 하면 된다.
for (int i = 1; i <= 10; i++) {
System.out.println(i);
}
1
2
3
4
5
6
7
8
9
10
- 초기화식에서 i라는 정수 변수를 선언해주고 1을 지정해준다.
- i가 10보다 작거나 같을 동안 반복한다.
- 수행 부분이 끝나면 i를 1 늘려준다.
Q. for문은 언제 사용할까?
for문은 while문과 달리 초기화식이 있고 for문 안에서만 쓸 수 있는 변수를 만들 수 있다. 이러한 장점 때문에 for문은,
- 반복의 인덱스가 필요한 경우
- 반복의 최대 횟수가 정해진 경우
- 갯수가 정해진 데이터 셋(배열, 리스트 등)의 내용을 하나씩 봐야할 경우
에 주로 사용합니다. (3)번에 대해서는 배열 강의에서 좀 더 살펴보겠다.
물론 while문으로 작성된 내용을 for문으로, for문으로 작성된 내용을 while문으로 작성할 수 있지만 더 자주 쓰이는, 더 직관적이고 편한 경우들이 있을 것이다.
예제
1부터 100까지의 합을 구하시오.
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
System.out.println(sum);
반복문 밖에서 int 변수 sum을 만들어주고 0으로 초기화 해준다.
그리고 반복문을 작성하는데, 내부에서만 사용할 변수 i를 초기화식에 써주고 i를 하나씩 늘려나가며 더하고 100까지만 더하기로 한다.
for문의 강력한 힘은 배열, 리스트 등의 자료형과 함께 있을 때 더 잘 드러난다. 배열 강의에서 for문을 좀 더 다룬다고 하니 집중해서 듣도록 하자.
실습과제: 구구단
for문으로 구구단을 출력해보자. 아래와 똑같은 결과값이 나와야 한다.
1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
1 * 4 = 4
1 * 5 = 5
1 * 6 = 6
1 * 7 = 7
1 * 8 = 8
1 * 9 = 9
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 10
.
.
.
8 * 6 = 48
8 * 7 = 56
8 * 8 = 64
8 * 9 = 72
9 * 1 = 9
9 * 2 = 18
9 * 3 = 27
9 * 4 = 36
9 * 5 = 45
9 * 6 = 54
9 * 7 = 63
9 * 8 = 72
9 * 9 = 81
public class Main {
public static void main(String[] args) {
// 여기에 코드를 작성하세요.
for (int i=1; i<10; i++) {
for (int j=1; j<10; j++) {
System.out.println(i + " * " + j + " = " + (i*j));
}
}
}
}
'~2023.02 > Java' 카테고리의 다른 글
자바 기초 _ [토픽2] 자바 객체 지향 프로그래밍 _ 객체 설계하기 (0) | 2021.12.30 |
---|---|
자바 기초 _ [토픽2] 자바 객체 지향 프로그래밍 _ 객체 만들기 (0) | 2021.12.29 |
자바 기초 _ [토픽1] 자바 왕기초 _ 배열 (0) | 2021.12.29 |
자바 기초 _ [토픽1] 자바 왕기초 _ 변수와 연산 (0) | 2021.12.26 |
자바 기초 _ [토픽1] 자바 왕기초 _ Hello, Java! (0) | 2021.12.25 |