04_ 제어문(조건문 - if문, switch문)
문법이 다른 언어와도 거의 똑같음! 매우 중요!
제어문: 프로그램 수행 흐름을 바꾸는 역할을 함
위에서 아래로 실행되는 코드 중에서 제어문을 만나면 중간을 건너뛰거나(퐁당퐁당) 한 코드를 반복하는 등 순서를 뒤집음
선택적으로 실행하는 선택문 => 조건문(if문, if-else문, if-else if문, switch문)
반복적으로 실행하는 실행문 => 반복문(for문, while문, do-while문)
그 이외의 흐름을 제어하는 구문 => 분기문(brake문, continue문)
*조건문
"조건식"을 통해 참이냐 거짓이냐를 판단해서 해당 조건이 참일 경우 그에 해당하는 구문만 실행 가능
(== 조건에 따라 다른 문장이 수행되도록 함)
=> 조건식의 결과는 true / false 라는 논리값이 나와야 함
=> 조건식에서는 보통 비교 연산자, 논리 연산자 등 주로 결과가 논리값으로 나오는 연산자를 사용한다.
[ 종류 ]
조건문은 크게 if문 계열과 switch문으로 나뉜다.
1. if문 계열
- 단독 if문: 표현하고자 하는 경우의 수가 한 개일 경우
=> 만약에 해당 조건을 만족한다면 이것만 실행시켜 줘! (많이 쓰임)
- if-else문: 표현하고자 하는 경우의 수가 두 개일 경우
=> 만약 이 조건을 만족하면 if문 수행, 만족하지 않으면 else문 수행
- if-else if문: 표현하고자 하는 경우의 수가 세 개 이상일 경우
=> 내가 판별하고 싶은 경우의 수가 3개 이상일 때
2. switch문: 조건식 중에서도 "동등 비교"에 대하여 편리하게 사용 가능하도록 고안된 문법
- 조건이 아닌 동등 비교로만 조건을 수행함
*단독 if문: 표현하고자 하는 경우의 수가 한 개일 때
[ 표현법 ]
if(조건식) {
조건식이 true일 경우 실행하고자 하는 코드;
}
=> 조건식의 결과가 true일 때는 중괄호 블록 안의 코드 실행
=> 조건식의 결과가 false일 경우 중괄호 블록 안의 코드를 건너 뛰고 실행
import 구문을 추가할 수 있는 단축키: Ctrl + Shift + o
// 삼항 연산자를 조건문으로 바꿔 보자
public void method1() {
// 사용자로부터 정수값을 입력받은 후 양수, 0, 음수에 따른 결과 출력
Scanner sc = new Scanner(System.in);
System.out.print("정수를 입력하세요: ");
int num = sc.nextInt();
sc.nextLine();
// 삼항 연산자 버전
// String result = (num > 0) ? "양수입니다." : ((num == 0) ? "0입니다." : "음수입니다.");
// 단독 if문 버전
if (num > 0) { // num이 양수일 경우
System.out.println("양수입니다.");
}
if (num == 0) { // num이 0일 경우
System.out.println("0입니다.");
}
if (num < 0) { // num이 음수일 경우
System.out.println("음수입니다.");
}
System.out.println("메소드 영역 종료");
}
public void method2() {
// 사용자가 입력한 정수값이 짝수인지 홀수인지 판별하여 결과를 출력
Scanner sc = new Scanner(System.in);
System.out.print("정수를 입력하세요: ");
int num = sc.nextInt();
sc.nextLine();
// 삼항연산자 버전
// String result = (num % 2 == 0) ? "짝수입니다." : "홀수입니다.";
// 단독 if문 버전
/*
if ((num % 2 == 0) && (num > 0)) { // 짝수이면서 양수일 경우
System.out.println("짝수입니다.");
}
// 어떤 수이든 간에 2로 나눴을 때의 나머지는 0 또는 1만 나옴
if ((num % 2 != 0) && (num > 0)) { //홀수이면서 양수인 경우
System.out.println("홀수입니다.");
}
*/
// 중첩 if문
if (num > 0) { // 양수일 경우
// 한 번 더 검사
if (num % 2 == 0) { // 짝수일 경우
System.out.println("짝수입니다.");
}
if(num % 2 != 0) { // 홀수일 경우
System.out.println("홀수입니다.");
}
}
}
public void method3() {
// 사용자로부터 나이를 입력받곡 입력한 나이값을 가지고 어린이 청소년, 성인 출력
// 어린이 (13세 이하), 청소년 (19세 미만), 성인 (19세 이상)
Scanner sc = new Scanner(System.in);
System.out.print("나이 입력: ");
int age = sc.nextInt();
sc.nextLine();
if(age <= 13) { // 어린이일 경우
System.out.println("어린이입니다.");
}
if ((age > 13) && (age < 19)) { // 청소년일 경우 (13세 초과 조건을 추가해야 함)
System.out.println("청소년입니다.");
}
if (age >= 19) { // 성인일 경우
System.out.println("성인입니다.");
}
}
// 난이도 up
public void method4() {
// 사용자로부터 주민등록번호 입력받은 후
// 남자, 여자 판별 후 결과 출력
// 숫자라도 사칙연산(산술연산)을 하지 않으면 문자열로 취급
// 참고: 주민번호 포맷 (생년월일6자-성별자리1자리xxxxxx)
// (xxxxxx-*xxxxxx)
// 1단계: 주민번호 입력받아서 변수에 담기
Scanner sc = new Scanner(System.in);
System.out.print("주민번호를 입력하세요 (-포함): ");
String personId = sc.nextLine();
// 2단계: 입력받은 주민번호로부터 성별에 해당하는 자리만 추출
char gender = personId.charAt(7);
// 3단계: 뽑힌 값에 따라 서로 다른 결과를 출력 => 조건문 이용
// 남자일 경우 '1', '3'
// 여자일 경우 '2', '4'
if ((gender == '1') || (gender == '3')) { // 남자일 경우
System.out.println("남자입니다.");
}
if ((gender == '2') || (gender == '4')) { // 여자일 경우
System.out.println("여자입니다.");
}
if ((gender != '1') && (gender != '2')
&& (gender != '3') && (gender != '4')) { // 번호를 잘못 입력한 경우
System.out.println("잘못된 주민등록번호를 입력했습니다.");
}
}
}
*if-else문: 표현하고 싶은 경우의 수가 두 개일 경우 사용하는 조건문
[ 표현법 ]
if(조건식) {
해당 조건식이 true일 경우 실행하고자 하는 코드;
}
else {
해당 조건식이 false일 경우 실행하고자 하는 코드;
}
=> 조건식의 결과가 true일 경우 if 블럭 안을 실행하고 if-else문 자체를 빠져나감
public void method1() {
// 사용자에게 정수값을 입력받은 후 짝수, 홀수 판별 후 결과 출력
Scanner sc = new Scanner(System.in);
System.out.print("정수를 입력하세요: ");
int num = sc.nextInt();
sc.nextLine();
// 양수일 경우만 판별 가능하게끔 중첩 if문 사용
if (num > 0) {
// 짝수일 경우 또는 홀수일 경
if (num % 2 == 0) { // 짝수일 경우
System.out.println("짝수입니다. ");
}
else { // 짝수가 아닐 경우
System.out.println("홀수입니다.");
}
// else 블럭에서는 별도의 조건을 내세울 필요가 없음!!
// 조건식 결과가 true이면 else 블럭을 건너뛰기 때문에
// 단독 if문 두 개로 표현하는 것보다 효율적임
}
else { // 양수가 아닙니
System.out.println("양수만 입력해야 합니다.");
}
}
/*
* if-else if문: 동일한 비교 대상을 가지고 3개 이상의 조건을 제시해 두고자 할 때 사용되는 조건문
*
* [ 표현법 ]
* if (조건식1) {
* 조건식1이 true일 경우 실행할 코드;
* }
* else if (조건식2) {
* 조건식2가 true일 경우 실행할 코드;
* }
* else if (조건식3) {
* 조건식3이 true일 경우 실행할 코드;
* }
* else {
* 앞에서 제시한 모든 조건식들이 모두 false일 경우 실행할 코드;
* }
*
*/
public void method2() {
// 사용자로부터 정수 입력 후 양수, 0, 음수 판별 후 출력
Scanner sc = new Scanner(System.in);
System.out.print("정수를 입력하세요: ");
int num = sc.nextInt();
sc.nextLine();
if (num > 1) { // 양수일 경우
System.out.println("양수입니다.");
}
else if (num == 0) {
System.out.println("0입니다.");
}
else {
System.out.println("음수입니다.");
}
}
// 실습 문제
public void method3() {
/*
* 사용자로부터 나이를 입력받고
* 13세 이하까지 어린이, 14세부터 18세까지 청소년, 19세 이상부터는 성
* 판별 후 출력
*
* 경우의 수
* 우선적으로 고려해야 할 것: 나이는 0살부터 셀 수 있게끔(0보다 작을 경우 판별 불가)
* 나이가 0살부터라면 판별
*/
Scanner sc = new Scanner(System.in);
System.out.print("나이를 입력하시오: ");
int age = sc.nextInt();
sc.nextLine();
if ((age >= 0) && (age < 14)) {
System.out.println("어린이입니다.");
}
else if (age < 19) {
System.out.println("청소년입니다.");
}
else if (age >= 19) {
System.out.println("어른입니다.");
}
else {
System.out.println("잘못 입력했습니다.");
}
/* 선생님 풀이
*
* if (age < 0) { // 나이를 음수로 입력했을 경우
*
* System.out.println("잘못 입력했습니다.");
*
* }
* else {
*
* if (age <= 13) { // 나이가 13 이하라면 (+ 나이가 0살 이상이라면)
*
* System.out.println("어린이입니다.");
*
* }
* else if (age < 19) {
*
* System.out.println("청소년입니다.");
* }
* else {
*
* System.out.println("성인입니다.");
*
* }
* }
*
*/
}
// 숙제
public void method4() {
/*
* 사용자에게 정수를 입력받아
* 90점 이상일 경우 "A등급"
* 90점 미만 80점 이상일 경우 "B등급"
* 80점 미만 70점 이상일 경우 "C등급"
* 70점 미만일 경우 "D등급"
*
* "당신의 점수는 xx점이고, 등급은 xxx입니다." 출력(printf)
*/
Scanner sc = new Scanner(System.in);
System.out.print("점수를 입력하시오: ");
int score = sc.nextInt();
sc.nextLine();
String result = "";
if (score >= 90) {
result = "A등급";
}
else if (score >= 80) {
result = "B등급";
}
else if (score >= 70) {
result = "C등급";
}
else {
result = "D등급";
}
System.out.printf("당신의 점수는 %d점이고, 등급은 %s입니다.", score, result);
}
}
Switch문: 조건문이 없는 조건문
내부적으로 동등비교 연산에 대해서만 조건식이 적용되는 구조
[ 표현법 ]
switch(앞으로내가동등비교를하고싶은대상자) {
case 값1 : 실행할코드; // 앞으로내가동등비교를하고싶은대상자 == 값1 << 일 경우에만 실행됨
break; // switch 중괄호 영역을 빠져나
case 값2 : 실행할코드; // 앞으로내가동등비교를하고싶은대상자 == 값2 << 일 경우에만 실행됨
brake; // switch 중괄호 영역을 빠져나감
...
case 값n : 실행할코드;
break;
default : 실행할코드; // 값1 ~ 값n까지 내가 동등비교를 하고 싶은 대상자와 단 하나도 일치하지 않을 경우 실행됨
// else 블럭에 해당됨
// 어차피 가장 마지막으로 실행되는 코드이기 때문에 break;를 쓰지 않음
}
*if문과 switch문의 차이점
if(조건식) => 조건식을 복잡하게도 기술 가능(자유도 높음), 값의 범위 제시 가능
switch(동등비교대상자) => 동등 비교만 수행됨, 확실한 값의 조건만 기술 가능
public void method1() {
// 1 ~ 3 사이의 정수를 입력받아
// 1인 경우 "빨간불입니다" 출력
// 2인 경우 "파란불입니다" 출력
// 3인 경우 "초록불입니다" 출력
// 그 이외의 숫자를 입력한 경우 "잘못 입력했습니다" 출력
Scanner sc = new Scanner(System.in);
System.out.print("1 ~ 3 사이의 정수 입력: ");
int num = sc.nextInt();
sc.nextLine();
// 기존의 if문 계열 버전
/* if (num == 1) { // num == 1
System.out.println("빨간불입니다.");
}
else if (num == 2) { // num == 2
System.out.println("파란불입니다.");
}
else if (num == 3) { // num == 3
System.out.println("초록불입니다.");
}
else {
System.out.println("잘못 입력했습니다.");
} */
// => 모든 조건식이 num이라는 변수에 들은 값 기준으로 동등비교만 수행하고 있음
// switch문 버전
/*
switch(num) {
case 1 : System.out.println("빨간불입니다");
break;
case 2 : System.out.println("파란불입니다");
break;
case 3 : System.out.println("초록불입니다");
break;
default : System.out.println("잘못 입력했습니다");
}
*/
String result = "";
switch (num) {
case 1 : result = "빨간불";
break;
case 2 : result = "파란불";
break;
case 3 : result = "초록불";
break;
default : System.out.println("잘못 입력했습니다");
return; // return문은 현재 실행 중인 메소드를 빠져나가
// 나를 호출했던 부분으로 돌아가는 역할
}
System.out.println(result + "입니다");
}
// 숙제
public void method2() {
/*
* 사용자에게 구매할 과일명(사과, 바나나, 복숭아) 을 입력받아
* 각 과일마다의 가격을 출력 (사과 1000원, 바나나 2000원,복숭아 5000원)
* xx의 가격은 xxxx원입니다. 출력(printf)
* 만약에 다른 과일명을 입력받은 경우 "저희 가게에서 판매하는 과일이 아닙니다" 출력
*/
Scanner sc = new Scanner(System.in);
System.out.print("구매할 과일명을 입력하세요: ");
String fruit = sc.nextLine();
int result = 0;
switch (fruit) {
case "사과" : result = 1000;
break;
case "바나나" : result = 2000;
break;
case "복숭아" : result = 5000;
break;
default : System.out.print("저희 가게에서 판매하는 과일이 아닙니다");
return;
}
System.out.printf("%s의 가격은 %d원입니다.", fruit, result);
}
}
// if문 계열 버전 (선생님 추가 풀이)
// => 제대로 된 문자열을 입력받았음에도 불구하고 잘못된 결과가 나오는 이슈 발생(무조건 else 출력문 나옴)
// 기본 자료형 (boolean, int, byte, short, long, float, double, char)들끼리
// 동등 비교(==, !=) 가 잘 이루어짐
// 참조 자료형 (String)을 동등비교 하고자 할 경우 동등 비교(==, !=)가 잘 이루어지지 않음
// => stack 영역에 주소값이 담기기 때문에 주소값 기준으로 비교가 이루어짐!!
// 문자열 내용물을 동등 비교 하고자 할 경우에는 equals 메소드를 활용해야 함
// [ 표현법 ] 문자열.equals(동등비교하고자하는문자열);
// => 내용물이 일치할 경우 true, 아닐 경우 false를 내보내 줌
Scanner sc = new Scanner(System.in);
System.out.print("구매할 과일명을 입력하세요: ");
String fruit = sc.nextLine();
int price = 0;
if (fruit.equals("사과")) { // fruit == "사과" 는 알게 모르게 주소값을 비교한 거였다!!
price = 1000;
}
else if (fruit.equals("바나나")) {
price = 2000;
}
else if (fruit.equals("복숭아")) {
price = 5000;
}
else {
System.out.println("저희 가게에서 판매하는 과일이 아닙니다.");
return;
}
System.out.printf("%s의 가격은 %d원입니다.", fruit, price);
}
// break를 안 쓰는 경우
public void method3() {
// 사용자로부터 키보드로 등급을 입력받아 해당 등급별로 권한 출력하기
// 1등급: 관리 권한, 쓰기 권한, 읽기 권한
// 2등급: 쓰기 권한, 읽기 권한
// 3등급: 읽기 권한
Scanner sc = new Scanner(System.in);
System.out.print("등급을 입력하세요: ");
int grade = sc.nextInt();
sc.nextLine();
switch (grade) {
case 1 : System.out.println("관리 권한 부여");
case 2 : System.out.println("쓰기 권한 부여");
case 3 : System.out.println("읽기 권한 부여");
}
// 내가 동등비교 후에 true가 나오는 시점에서 코드가 시작되지만
// break 구문이 나타날 때까지는 계속 실행이 되는 구조
}
public void method4() {
// 사용자로부터 주민번호를 입력받은 후 성별 판별
// xxxxxx-*xxxxxx => * 부분이 성별을 나타내는 자리(1, 3: 남자 / 2, 4 : 여자)
Scanner sc = new Scanner(System.in);
System.out.print("주민번호 입력 (-포함): ");
String personId = sc.nextLine();
// 성별 자리 추출
char gender = personId.charAt(7);
// 성별 값을 담을 수 있는 문자열 변수 세팅
String result = "";
switch (gender) {
case '1' : result = "남자"; break;
case '2' : result = "여자"; break;
case '3' : result = "남자"; break;
case '4' : result = "여자"; break;
default : System.out.println("잘못된 주민번호를 입력했습니다."); return;
/* break문을 만나기 전까지는 빠져나가지 못하는 점을 이용해 이런 식으로 코드를 줄일 수도 있다
* case '1' :
* case '3' : result = "남자"; break; // gender == '1' || gender == '3'
* case '2' :
* case '4' : result = "여자"; break; // gender == '2' || gender == '4'
* default : System.out.println("잘못된 주민번호를 입력했습니다."); return;
*/
}
System.out.println(result + "입니다.");
}
public void method5() {
// 사용자로부터 1 ~ 12 사이의 월을 입력받아
// 해당 달의 마지막 날짜를 출력하는 프로그램
// 1, 3, 5, 7, 8, 10, 12월 => 31일까지입니다.
// 4, 6, 9, 11 => 30일입니다.
// 2 => 28일 또는 29일까지입니다.
// 그 이외의 => 반드시 1 ~ 12월 사이를 입력해야 합니다.
Scanner sc = new Scanner(System.in);
System.out.print("월을 입력하세요(1~12): ");
int month = sc.nextInt();
sc.nextLine();
switch (month) {
case 1 :
case 3 :
case 5 :
case 7 :
case 8 :
case 10 :
case 12 : System.out.println("31일까지입니다."); break;
case 4 :
case 6 :
case 9 :
case 11 : System.out.println("30일입니다."); break;
case 2 : System.out.println("28일 또는 29일까지입니다."); break;
default : System.out.println("반드시 1 ~ 12월 사이를 입력해야 합니다."); return;
}
}
}