도도한 개발자
[Java] #06. 자바의 제어문 (키워드 : 조건) 본문
프로그램의 코드를 작성하는 것은 전부 조건을 따지는 작업을 반복적으로 수행하는 것이다. 먼저 가장 많이 사용하는 if가 있는데, 자바에서 if라는 것을 사용해 조건을 따질 때 공식이 있다.
if
if(boolean값) 처리문장;
if 다음에는 반드시 소괄호를 열고 닫아야 하며 이 소괄호 안에는 boolean 형태의 결과가 있어야 한다. 그 안의 결과가 true일 때, 처리하는 "처리문장"과 세미콜론이 온다.
public class ControlIf {
// main()메소드 생략
public void ifStatement() {
if(true)
if(true) System.out.println("It's true");
if(true) System.out.println("It's also true");
if(false) System.out.println("It's false");
}
}
if 문의 소괄호 뒤에는 기본적으로 어떤 문장이 있는 간에 세미콜론(;)이 하나만 있으면 컴파일/실행이 정상적으로 된다. if 다음에 오는 고솰호 안의 값이 true일 경우에만 처리되므로 정상적으로 코드를 작성했다면 다음과 같은 결과가 출력될 것이다.
It's true
It's also true
더 나아가 if - else
if (boolean값) 처리문장1;
else 처리문장2;
else라는 단어가 두번째 줄에 추가됐다. 이는 if 조건이 true이면 "처리문장1"을, false이면 "처리문장2"를 수행하라는 말이다.
간단하게
int intVal = 10;
if (intVal > 5)
System.out.println("It's bigger than 5");
else
System.out.println("It's smaller or equal than 5");
코드를 보면 intVal이 10인 상황에서의 결과는 첫번째 처리문장이 된다.
더 나아가 if 문에 대한 몇가지 궁금증이 있다.
1. if 다음에는 문장이 하나밖에 올 수 없나?
2. if의 조건이 여러 개일 경우는 어떻게 하지?
3. 값의 범위에 따라 결과를 다르게 할 때도 있을 경우 어떻게 하지?
천천히 살펴보자.
1. if 다음에는 문장이 여러개일 경우
if(boolean값) {
처리문장1;
처리문장2;
........;
}
이와 같이 if 문의 조건이 있는 소괄호 뒤에 중괄호를 열고 닫으면 된다.
2. if의 조건이 여러 개일 경우
int age = 25;
boolean isMarried = false;
if (age > 25 && isMarried)
System.out.println("Age is over 25 and Married");
if (age > 25 || isMarried)
System.out.println("Age is over 25 or Married");
&&는 두 조건이 모두 true여야만 true가 되고, ||는 두 조건 중 하나만 true여도 true가 된다.
3. 값의 범위에 따라 결과를 다르게 할 경우
int point = 77;
if (point > 90) System.out.println("A"); // 90점 초과
else if (point > 80) System.out.println("B"); //80점 초과, 90점 이하
else if (point > 70) System.out.println("C"); //70점 초과, 80점 이하
else if (point > 60) System.out.println("D"); //60점 초과, 70점 이하
else System.out.println("F"); //60점 초과가 아닌 모든 경우
switch
위의 if else는 보통 두가지 이상의 값을 비교하거나 단순히 true, false 여부만 확인하고자 할 때 많이 사용한다. 그러나 하나의 값이 여러 범위에 걸쳐서 비교되어야 할 때는 하나의 값으로 분기하여 비교하는 switch 구문을 사용하는 것이 좋다.
switch(비교대상변수) { // 1
case 점검값1; // 2
처리문장1;
...
break; //3
case 점검값2;
처리문장2;
...
break;
default:
기본처리문장;
...
break;
}
① - 가장 첫 줄에는 switch(비교대상변수)라고 명시한 후 중괄호를 시작한다. 이 괄호 안의 비교대상변수는 long을 제외한 정수형과 몇몇 특별한 타입만이 들어갈 수 있다. 이때 중괄호는 절대 생략할 수 없다.
② - 중괄호 안에는 'case 점검값:' 이 오거나 'default:'이 나와야만 한다.
③ - 각 case를 마무리 하고 싶다면 반드시 'break;'를 추가해야 한다.
코드 하단의 default: 라는것은 앞에 있는 조건에 맞지 않는 경우에 수행된다. 다시말해 case문에서 한번이라도 걸렸으면 default는 실행되지 않고, 모든 case의 조건에 맞지 않는 경우에만 실행된다. 그런데, default:가 조건을 찾지 못했을 경우에만 수행되는 것이 아니다. 선행 case 구문에서 break를 빼먹거나 생략했을 경우 실행되기도 한다.
while 반복문
1부터 10까지 더해야 하는 경우 1부터 10까지 모든 숫자를 작성해 더하는 방법이 있지만 만일 숫자가 39부터 183이라면? 하나하나 적어가며 계산하는 것은 굉장한 시간낭비일 것이다. 이럴 때 사용하는 것이 반복문이고 반복문엔 두가지 종류가 있는데 우선 while부터 살펴보자.
while(boolean조건){
처리문장;
...
}
여기 while 후에 오는 소괄호 안에는 'boolean조건'이 있어야만 한다. 그리고 그 boolean 조건 값이 true일 경우에만 중괄호 안에 있는 내용들이 수행된다. false인 경우엔 while문장에 수행되지 않는다. 지금까지의 과정은 if문과 다를 바 없지만 if문장은 중괄호가 끝나면 그 다음 아래줄로 넘어가는 반면, while과 같은 반복문은 중괄호가 끝난 이후 다시 올라가 boolean 조건을 확인해보고 내용이 계속 실행된다.
한가지, while문을 사용할 때 주의해야 할 점이 있다. 바로 '무한루프(Infinite loop)' 현상이다. 이 무한루프 작업은 자바 프로세스가 멈출 때까지 계속 반복된다. 이렇게 반복문을 사용할 때에는 단지 프로그램 하나만 문제가 생기는 것이 아니라 서비스가 장애로 연결될 수 있기 때문에, 매우 조심해서 해당 반복문이 빠져나올 수 있는지 확인해 봐야 한다.
while문의 변종이 하나 있는데 바로 do-while문이다. do-while문은 적어도 한 번은 반복문장이 실행된다. 이는 '한 번은 꼭 싱핼시키고 싶을 때' 사용하낟. 그리고 while의 소괄호 뒤에 반드시 세미콜론을 입력해주어야 한다.
for 반복문
무한 루프에 빠질 위험이 있는 while 루프보다 안전하고 편한 for 루프가 있다.
for(초기화; 종료조건; 조건 값 증가) {
반복문장;
}
for 루프의 각 문장 사이에는 세미콜론을 적어 주어야만 한다. 1부터 10까지의 숫자를 더해보자.
int sum = 0;
for (int num = 1; num <= 10; num++) {
sum += num;
}
System.out.println(sum);
이와 같이 for 루프를 지정하면 원하는 횟수만큼 for루프를 반복시켜 수행할 수 있다.
* 실습
은행에서 사용할 이율을 구하는 InterestManager라는 클래스를 만들어보자. 매달 내는 적립식이 아닌 한번에 목돈을 입금해 놓는 거치식의 이율을 계산한다.
예치기간이 1일~90일 일 때 이율 0.5%, 91일~180일 일 때 이율 1%, 181일~364일 일 때 이율 2%, 365일~일 때 이율 5.6%이다.
일자를 매개 변수로 받아 이율을 리턴하는 메소드 하나, 예금 거치기간과 예치 금액을 매개 변수로 받아 계산 금액을 리턴하는 메소드 하나를 만들어 1일~365일까지 10일씩 증가하면서 100만원을 예금했을 때 이자를 얼마나 받을 수 있는지 화면에 출력하는 프로그램을 만들어라.
public class InterestManager {
public static void main(String[] args) {
InterestManager manager = new InterestManager();
for(int i = 10; i <= 370; i += 10) {
System.out.print("day " + i + " : ");
System.out.println(manager.calculatorAmout(i, 1000000));
}
}
public double getInterestRate(int day) {
double rate = 0;
if(day >= 1 && day <= 90) {
rate = 0.005;
}
else if(day >= 91 && day <= 180) {
rate = 0.01;
}
else if(day >= 181 && day <= 364) {
rate = 0.02;
}
else if(day >= 365) {
rate = 0.056;
}
return rate;
}
public double calculatorAmout(int day, long amount) {
double rate = getInterestRate(day);
double balance = amount;
balance += amount * rate;
return balance;
}
}
* 정리
if 문장의 소괄호 안에는 어떤 형태의 결과가 제공되어야 하나요?
if 소괄호 안에는 boolean 타입의 결과만 올 수 있다.
if 조건에 맞지 않는 모든 경우를 처리할 때 사용하는 예약어는 뭔가요?
모든 if 조건을 통과할 경우를 처리할 필요가 있으면 "else"라는 예약어를 사용하면 된다.
switch를 사용할 수 있는 기본 자료형의 타입에는 어떤 것들이 있나요?
long을 제외한 정수 및 Enum을 switch에서 사용할 수 있다. JDK 7 부터는 String도 사용 가능하다.
switch 블록 안에서 비교 대상값 앞에 사용하는 예약어는 무엇인가요?
switch문에서 각 경우에 대해서 처리할 경우에는 "case"를 사용한다.
switch 조건을 빠져나가도록 하는 예약어는 무엇인가요?
"break"를 사용하면 대부분의 중괄호로 묶여 있는 문장을 빠져 나간다.
switch 조건들에 맞지 않을 때 기본 처리를 하기 위한 예약어는 무엇인가요?
switch 의 기본 값은 "default"를 사용한다.
while문의 소괄호 안에는 어떤 형태의 결과가 제공되어야 하나요?
if와 마찬가지로 while문의 소괄호에는 boolean 타입의 결과가 위치해야 한다.
while문을 무조건 한번은 실행하게 하려면 어떻게 해야 하나요?
while문은 조건이 맞지 않으면 한번도 실행하지 않지만, do-while문은 무조건 한번은 실행된다.
while문을 마음대로 빠져나가게 하려면 어떤 예약어를 사용하면 되나요?
while문을 빠져 나가기 위해서는 "break"를 사용하면 된다.
while문의 중간에 while문의 소괄호 점검 구문으로 건너뛰도록 할 때 사용하는 예약어는 무엇인가요?
"continue"라는 예약어를 사용하면 while문의 조건 확인 부분으로 돌아간다.
for 루프의 소괄호 안의 가장 첫 구문(첫 세미콜론 앞의 문장)은 for 루프가 수행되는 동안 몇 번 수행되나요?
for루프의 세미콜론 구문 중 가장 앞에 있는 구문은 오직 한번만 수행된다.
for 루프의 소괄호 안의 중간에 있는 구문은 어떤 타입의 결과가 제공되어야 하나요?
for루프의 세미콜론 구문 중 중간에 있는 구문은 boolean 타입의 값이 제공되어야만 한다.
for 루프의 소괄호 안의 마지막에 있는 구문에서는 어던 작업을 수행하나요?
for루프의 세미콜론 구문 중 가장 마지막에 있는 구문은 값을 증가하거나 감소하는 등의 반복적인 작업을 수행한다.
'Backend > Java' 카테고리의 다른 글
[Java] #08. 참조 자료형 (0) | 2022.03.14 |
---|---|
[Java] #07. 배열의 모든 것 (0) | 2022.03.13 |
[Java] #05. 자바의 연산자 (0) | 2022.03.10 |
[Java] #04. 자바의 변수들 (0) | 2022.03.10 |
[Java] #03. 클래스와 객체 (0) | 2022.03.09 |