6장 제가 조건을 좀 따져요
도대체 얼마나 조건을 따지길래...
이 장에서는 조건에 따라 처리하는 문장들을 배우고,
반복적으로 작업을 수행하는 방법을 알아본다.
가장 먼저 가장 많이 사용하는 "if'에 대해서 알아보자.
java에서 if라는 것을 사용해서 조건을 따질 때 공식이 있다.
기본 공식은 다음과 같다.
if(boolean값) 처리 문장;
if 다음에는 반드시 소괄호를 열고 닫아야 하며,
이 소괄호 안에는 boolean 형태의 결과가 있어야 한다.
소괄호 안의 결과가 true일 때 처리하는 "처리문장"과 세미콜론이 온다.
직접 만들어보자.
클래스에 다음과 같이 ifStatement()라는 메소드를 만들자.
첫번째 문장을 보자. 이렇게 하면 아무런 작업은 이루어지지 않는다.
네번째 문장을 보자. 결과가 어떻게 될까?-> 아무것도 찍히지 않는다.
p.132
이제 if문에 대한 어느 정도 감이 올 것이다.
그럼 조금 더 어려운 사용법의 정의를 보자.
if(boolean값) 처리문장1;
else 처리문장2;
else라는 단어가 두번째 줄에 나왔다.
자바에서 else는 if의 문장의 결과가 false일 때 처리하라는 용도로 사용된다.
즉 if 조건이 true이면 "처리문장1"을, false이면 "처리문장2"를 수행하라는 말이다.
public void ifElseStatement(){
int intValue=10;
if(intValue > 5) System.out.println("It's bigger than 5");
else System.out.println("It's smaller or equal than 5.");
if(intValue <= 5)
System.out.println("It's smaller or equal than 5.");
else System.out.println("It's bigger than 5");
}
결과가 어떻게 나왔을 까?
if를 조금 더 다양하게 사용해보자
몇가지 궁금증을 가질 수 있다.
1. if다음에는 문장이 하나밖에 올 수 없나?
2. if의 조건이 하나만 있지는 않을 텐데 말이지... 여러 개일 때는 어떻게 하지?
3. 값의 범위에 따라서 결과를 다르게 할 때도 있을 텐데, 그럴 때는 어떻게 해야하지?
1. if다음에는 문장이 하나밖에 올 수 없나?
대부분의 if문장은 다음과 같이 사용한다.
if(boolean값){
처리문장1;
처리문장2;
....;
}
이와 같이 if문의 조건이 있는 소괄호 뒤에 중괄호를 열고 닫으면 된다.
여러분들이 앞으로 if문장을 사용할 때에는 중괄호를 열고 닫는 습관을 들이는 것이 좋다.
-> 코드 가독성 좋아집니다.
2. if의 조건이 하나만 있지는 않을 텐데 말이지... 여러 개일 때는 어떻게 하지?
if문의 조건 안에 &&와 ||을 활용하면 여러가지 조건을 한 번에 따질 수 있다.
메소드를 만들어서 예를 들어보자.
public class ControlIfAndOr{
public void main(String args[]){
ControlIfAndOr control = new ControlIfAndOr();
control.ifAndOr();
}
public void ifAndOr(){
int age = 25;
boolean isMarried = true;
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");
}
}
}
&&를 사용할 때 앞에 있는 조건의 결과가 false라면 두번째에 있는 isMarried라는 조건을 점검할까?
-> 두번째 조건은 묻지도 따지지도 않는다.
3. 값의 범위에 따라서 결과를 다르게 할 때도 있을 텐데, 그럴 때는 어떻게 해야하지?
우리는 지금까지 if-else만 배웠다. 그런데 else뒤에 또 if를 붙여서 조건을 따질 수 있다.
else if구문을 쓰면 지금까지의 고전에 맞지 않는 다른 조건을 찾는 데 유용하다.
하지만 더 예쁘게 코딩하는 법은 없을까?
아주 간단하지만 가독성 떨어지는 코드를 만들고자 한다면,
? : 연산자를 사용하는 방법도 있다.
System.out.println(point>90 ? "A" : point >80 ? "B" : point>70 ? "C" : point > 60 ? "D" : "F");
보다 깔끔하고 가독성이 좋은 코드를 제공하기 위해서 나온 것이
다음 절에서 알아보는 switch문이다.
자바의 switch와 불켜는 스위치는 별 상관 없다
학점이나 이자 계산 같이 하나의 값이 여러 범위에 걸쳐서 비교되어야 할 때에는,
하나의 값으로 분기하여 비교하는 switch 구문을 사용하는 것이 좋다.
switch(비교 대상 변수){
case 점검값1:
처리문장1;
..
break;
case 점검값2:
처리문장2;
...
break;
...
default:
기본 처리 문장;
...
break;
}
반복문이라구요?
자바에는 for 루프와 while문, 두 개의 반복문이 있다.
가장 확실한 for루프
직접해 봅시다
이 장에서는 은행에서 사용할 이율을 구하는 InterestManager라는 클래스를 만들어 보자.
이 프로그램은 매달내는 적립식이 아닌 한번에 목돈을 입금해놓는 거치식의 이율을 계산한다.
1. InterestManager라는 클래스를 만들고, main() 메소드도 만들자.
2. 일자(int day)를 매개변수로 받아서, double 타입의 이율(%)이 얼마나 되는지를 리턴하는 public double getInterestRate(int day)라는 메소드를 만들자.
3. getInterestRate() 메소드에서는 거치 기간이 90일 이내일 경우에는 0.5%, 91~180일 경우에는 1%, 181~364일 경우에는 2%, 365일에는 5.6%의 이율을 제공한다. 이러한 이율을 제공받을 수 있도록 메소드 내용을 채우자(if를 사용해서 이율을 얻어내자.)
4. public double calculateAmount(int day, long amount)라는 메소드를 만들자. 이 메소드는 예금 거치 기간(int day)과 예치 금액(long amount)를 매개변수로 받는다. double 타입의 계산 금액을 리턴한다.(메소드 선언부만 일단 만들자.)
5. 2~3에서 만든 getInterestRate() 메소드를 calculateAmount() 메소드에서 호출하여 이자를 얻어 내고, double 타입의 계산된 금액(예치금 + 이자)을 리턴할 수 있도록 메소드 내용을 채우자.
6. 1일 ~ 365일까지 하루씩 증가하면서 100만원을 예금했을 때 이자를 얼마나 받을 수 있는지 화면에 출력할 수 있도록 main() 메소드에서 getInterestRate() 메소드를 호출하자.
7. 6에서 만든 main()메소드를 약간 수정하여 1일 단위가 아닌 10일 간격으로 결과를 출력하자.
package com.example.godofjava;
public class InterestManager {
public void main(String args[]){ //String..이거 빼먹음
double interest;
InterestManager interestManager = new InterestManager();
for(int day=1 ;day<366;day++) {
interest=interestManager.calculateAmount(day,1000000);
System.out.println(day+"날에 받을 수 있는 이자 : "+ interest);
}
for(int i=10 ;i<=370;i=i+10) { //10단위면 10부터 시작 370까지, i=i+10으로 표현
double amount=interestManager.calculateAmount(i,1000000);
System.out.println(i+"날에 받을 수 있는 이자 : " + amount);
}
}
public double getInterestRate(int day){
double interest = 0;
if(day<=90){
interest=0.5;
}else if(day<=180){
interest=1;
}else if(day<=364){
interest=2;
}else{
interest=5.6;
}
return interest;
}
public double calculateAmount(int day, long amount){
double interest = 0;
interest = getInterestRate(day);
double account = amount + (amount*interest/100.0); //100.0으로 나눈다는 것
return account;
}
}
정리해봅시다
1. if 문장의 소괄호 안에는 어떤 형태의 결과가 제공되어야 하나요?
boolean, 참 혹은 거짓으로 결과가 나오게
2. if 조건에 맞지 않는 모든 경우를 처리할 때 사용하는 예약어는 뭔가요?
else
3. switch를 사용할 수 있는 기본 자료형의 타입에는 어떤 것들이 있나요?
Java 6까지는 switch문에서는 long을 제외한 정수와 Enum, Java7부터는 String도 가능
4. switch 블록 안에서 비교 대상값 앞에 사용하는 예약어는 무엇인가요?
case:
5. switch 조건을 빠져나가도록 하는 예약어는 무엇인가요?
break;
6. switch 조건들에 맞지 않을 때 기본 처리를 하기 위한 예약어는 무엇인가요?
default:
7. while문의 소괄호 안에는 어떤 형태의 결과가 제공되어야 하나요?
boolean 조건
8. while문을 무조건 한번은 실행하게 하려면 어떻게 해야 하나요?
do while문을 사용한다.
9. while문을 마음대로 빠져나가게 하려면 어떤 예약어를 사용하면 되나요?
break
10. while문의 중간에 while문의 소괄호 점검 구문으로 건너뛰도록 할 때 사용하는 예약어는 무엇일까요?
continue
11. for루프의 소괄호 안의 가장 첫 구문(첫 세미 콜론 앞의 문장)은 for 루프가 수행되는 동안 몇 번 수행되나요?
한번
12. for루프의 소괄호 안의 중간에 있는 구문은 어떤 타입의 결과가 제공되어야 하나요?
boolean 타입
13. for루프의 소괄호 안의 마지막에 있는 구문에서는 어떤 작업을 수행하나요?
조건 값 증가