조건문(Conditional)이란 어떤 조건이 주어질 때 어떤 동작을 수행하도록 하는, 즉 조건에 따라 값이 달라지게 하는 것이다.
- 종류 : if문, if-else문, else-if문, switch문 등
- 조건을 만족하는 경우에만 실행
- 실행문은 중괄호{}로 묶어서 표시
- 실행문이 단일 문장인 경우 중괄호{} 생략 가능
score가 60점 이상일 경우 "합격", 아니라면 "불합격"
public class IF{
public static void main(String[] args) {
int score = 70;
if(score >= 60) {
System.out.println("합격");
System.out.println("축하합니다");
}
if(score < 60){
System.out.println("불합격");
}
}
}
위의 코드는 "합격" "축하합니다"를 출력한다.
이렇게 괄호()안에 조건을 넣고 중괄호{} 안에 실행문을 넣어서 실행시키면 되는 간단한 코드이다.
- 조건을 만족하는 경우와 그렇지 않은 경우 모두 처리한다.
- 위의 if문의 상위버전이라고 할 수 있다.
if문에서 예시를 들었던 예제로 다시 풀어보도록 하겠다.
score가 60점 이상일 경우 "합격", 아니라면 "불합격"
public class IfElse{
public static void main(String[] args) {
int score = 70;
if(score >= 60) {
System.out.println("합격");
System.out.println("축하합니다");
} else {
System.out.println("불합격");
}
}
}
위의 if문으로 두번 작성해야 하는 것을 관련된 것처럼 연결하여 작성하니 훨씬 깔끔 한 것 같다.
가급적이면 if문 보다는 if-else문을 사용하는 것이 좋다.
- 조건문이 많은 경우에 사용
- 실행문은 중괄호{}로 묶어서 표시
- 실행문이 단일 문장인 경우 중괄호{} 생략 가능
- else if는 조건이 있는 만큼 사용가능하다.
나이에 따른 결과를 출력하시오.
- 7세이하 : 미취학아동
- 8세이상 13세이하 : 초등학생
- 14세이상 16세이하 : 중학생
- 17세이상 19세이하 : 고등학생
- 20세 이상 : 성인
public class ElseIfAge{
public static void main(String[] args) {
int age = 5;
if(age < 0 || age > 100) {
System.out.println("잘못된 나이");
} else if(age <= 7) {
System.out.println("미취학 아동");
} else if(age <= 13) {
System.out.println("초등학생");
} else if(age <= 16) {
System.out.println("중학생");
} else if(age <= 19) {
System.out.println("고등학생");
} else {
System.out.println("성인");
}
}
}
월에 따른 계절을 출력하시오.
- 봄 : 3~5월
- 여름 : 6~8월
- 가을 : 9~11월
- 겨울 : 12, 1~2월
이 문제는 두가지방법으로 풀 수 있다.
일반적인 방법
public class ElseIfSeason1{
public static void main(String[] args) {
int month = 3;
if(month < 1 || month > 12) {
System.out.println("잘못된 월");
} else if (month == 12 || month <= 2) {
System.out.println("겨울");
} else if (month <= 6) {
System.out.println("봄");
} else if (month <= 8) {
System.out.println("여름");
} else {
System.out.println("가을");
}
}
}
나머지 연산을 활용한 modular 연산
public class ElseIfSeason2{
public static void main(String[] args) {
int mod = month % 12;
if(mod <= 2) {
System.out.println("겨울");
} else if (mod <= 5) {
System.out.println("봄");
} else if (mod <= 8) {
System.out.println("여름");
} else {
System.out.println("가을");
}
}
}
점수에 따른 학점을 구하시오.
- 100 ~ 90점 : A학점
- 89 ~ 80점 : B학점
- 79 ~ 70점 : C학점
- 69 ~ 60점 : D학점
- 59 ~ : F학점
public class ElseIfScore{
public static void main(String[] args) {
int score = 100;
char grade = 'F';
if(score < 0 || score > 100) {
System.out.println("확인되지 않는 점수입니다.");
} else if (score >= 90) {
System.out.println(grade = 'A');
} else if (score >= 80) {
System.out.println(grade = 'B');
} else if (score >= 70) {
System.out.println(grade = 'C');
} else if (score >= 60) {
System.out.println(grade = 'D');
} else {
System.out.println(grade = 'F');
}
System.out.println("점수는 " + score + "점");
System.out.println("학점은 " + grade + "학점");
//결과 : 점수는 100점
//결과 : 학점은 A학점
}
}
마지막예제!
오직 일 수만 고려하여 1일이 수요일일 경우 n일 후 무슨 요일인지 출력하시오.
public class ElseIfSeason2{
public static void main(String[] args) {
int day = 1;
int n = 1;
String weekName; //목요일
int mod2 = day+n % 7;
if (mod2 == 1) {
weekName = "수";
} else if (mod2 == 2) {
weekName = "목";
} else if (mod2 == 3) {
weekName = "금";
} else if (mod2 == 4) {
weekName = "토";
} else if (mod2 == 5) {
weekName = "일";
} else if (mod2 == 6) {
weekName = "월";
} else {
weekName = "화";
}
System.out.println(weekName + "요일");
}
}
이 문제도 modular연산을 이용한 방법이었다!
- 표현식의 결과 값에 따른 분기를 처리한다.
- 표현식의 결과 값은 double, boolean 데이터 타입일 수 없다.
- break는 switch문을 종료한다는 뜻이다. (break문이 없다면 case를 무시하고 switch문을 끝까지 실행하고 종료)
바로 예제를 풀어보며 switch문을 익혀보자.
각 층별 관리자를 출력하시오.
각 층별 관리자
- 1~2층 : 전지현
- 3~4층 : 한지민
- 5~6층 : 박은빈
- 나머지 : 동그라미
public class Manager{
public static void main(String[] args) {
int floor = 1;
String manager;
switch(floor) {
case 1 :
case 2 : manager = "전지현"; break;
case 3 :
case 4 : manager = "한지민"; break;
case 5 :
case 6 : manager = "박은빈"; break;
default: manager = "동그라미";
}
System.out.println(floor + "층" + " / Manager : " + manager);
// 1층 / Manager : 전지현
}
}
처음에는 case 1 : case 2 : manager = "전지현"; break; 이런식으로 한줄에 다 적었었는데, 풀이는 저렇게 줄바꿈으로 되어있었다. 그래도 이건 개인적인 스타일에 따라 다르기때문에 코드가 깔끔하게만 보이면 될 것 같다.
그 다음은 난이도가 아주 쉬웠던 그냥 일반적인 짝수 홀수 문제다.
숫자 n이 주어지면 짝수인지 홀수인지 알려주시오.
public class Manager{
public static void main(String[] args) {
int n = 3;
switch(n % 2) {
case 0 : System.out.println("짝수"); break;
default: System.out.println("홀수");
}
}
mod변수를 만들어서 풀어도 무관하다.
주어진 월에 따라 분기를 출력하시오.
- 1 ~ 3월 : 1분기
- 4 ~ 6월 : 2분기
- 7 ~ 9월 : 3분기
- 10 ~ 12월 : 4분기
- (추가조건) default생략, 스위치 내부의 case 4개로 제한.
public class Manager{
public static void main(String[] args) {
int month = 6;
switch((month-1) / 3 ) {
case 0: System.out.println("1분기"); break;
case 1: System.out.println("2분기"); break;
case 2: System.out.println("3분기"); break;
case 3: System.out.println("4분기"); break;
}
}
}
month - 1을 해주는 이유는 3,6,9,12가 주어졌을때 3의 배수여서 1,2,3,4를 도출해 내기 때문이다.
점수에 따른 학점을 출력하시오.
- 점수 = score, 학점 = grade
- 100 ~ 90 = A
- 89 ~ 80 = B
- 79 ~ 70 = C
- 69 ~ 60 = D
- 59 ~ = F
public class Manager{
public static void main(String[] args) {
int score = 100;
String grade = "F";
switch (score / 10) {
case 10 :
case 9 : grade = "A"; break;
case 8 : grade = "B"; break;
case 7 : grade = "C"; break;
case 6 : grade = "D"; break;
default : grade = "F";
System.out.println(score + "점은 " + grade + "학점입니다.");
}
// 100점은 A학점입니다.
}
}
몫(/)연산을 활용하여 풀 수 있는 문제다.
등급(1, 2, 3)에 따른 권한 출력
- 1등급 : 쓰기 실행 읽기
- 2등급 : 실행 읽기
- 3등급 : 읽기
public class Manager{
public static void main(String[] args) {
int level = 1;
String right = ""; //권한
switch(level) {
case 1 : right = "쓰기 실행 읽기"; break;
case 2 : right = "실행 읽기"; break;
case 3 : right = "읽기"; break;
default : right = "잘못된 권한";
}
System.out.println("당신의 등급은 " + level + "등급입니다.");
System.out.println("당신의 권한은 " + right + "입니다.");
//당신의 등급은 1등급입니다.
//당신의 권한은 쓰기 실행 읽기입니다.
}
}
이 방법 말고 break를 활용하는 방법이 있다.
(조건 추가 ++)
나머지 : 없음
public class Manager{
public static void main(String[] args) {
int level = 0;
String right = ""; //권한
switch(level) {
case 1 : right += "쓰기 ";
case 2 : right += "실행 ";
case 3 : right += "읽기"; break;
//default : System.out.println("없음");
default : right += "없음";
}
System.out.println(right);
}
}
이렇게 풀게 되면 1등급이면 case1부터 case3까지 실행되어 '쓰기 실행 읽기'가 출력될 것이고, 3등급이면 case3부터 break; 까지 실행되어 '읽기'만 출력될 것이다.
위의 방법은 우리가 자주 사용하는 웹툰들이나 목록
페이지수가 여러개 필요할 때 자주 쓰이는 알고리즘이니 기억해두자! 중요중요!