제어문과 반복문
제어문
- 특정 조건에 따라서 수행문의 실행 여부를 변경하는 것
- if문, switch문
반복문
- 특정 수행문을 반복해서 여러 번 수행하는 것
- for문, while문, do-while문
1-1. if문
package day4;
import utils.KeyboardReader;
public class IfDemo1 {
public static void main(String[] args) {
/*
* if문
* 형식
* if (조건식) {
* 수행문1;
* 수행문2;
* 수행문3;
* }
* * 조건식이 true로 판정되면 블록({})내부의 수행문들이 실행된다.
* * 조건식의 연산결과는 반드시 boolean값이어야 한다.
* * 조건식은 주로 비교연산자, 논리연산자를 사용하는 연산식이 사용된다.
*/
/*
* 국어점수, 영어점수, 수학점수를 입력받는다.
* 과목평균이 60점 이상이면 "합격입니다." 메세지를 화면에 출력한다.
*
* 조건식: 과목평균이 60점 이상일 때 true로 판정하는 조건
* 수행문: "합격입니다." 메세지 출력
*/
KeyboardReader reader = new KeyboardReader();
System.out.print("국어점수: ");
int korScore = reader.getInt(); //정수로 받아서 korScore변수에 저장할거야
System.out.print("영어점수: ");
int engScore = reader.getInt();
System.out.print("수학점수: ");
int mathScore = reader.getInt();
int average = (korScore + engScore + mathScore)/3;
if(average>=60) {
System.out.println("합격입니다.");
}
}
}
국어점수: 100
영어점수: 80
수학점수: 90
합격입니다.
1-2. if, else
package day4;
import utils.KeyboardReader;
public class IfDemo2 {
public static void main(String[] args) {
/*
* if ~ else문
* 형식
* if(조건식) {
* 수행문1;
* 수행문2;
* } else {
* 수행문3;
* 수행문4;
* }
* * 수행문1, 수행문2는 조건식이 true일 때,
* 수행문3, 수행문4는 조건식이 false일 때 수행
* * else 블록은 if 블록없이 단독으로 사용할 수 없다.
*/
/*
* 고객명, 상품명, 가격, 구매수량을 입력받는다.
* 구매금액이 10만원 이상이면 "1만원권" 상품권을 지급한다.
* 그 외는 "무료커피쿠폰"을 지급한다.
*
* 조건식: 구매금액이 10만원 이상일 때 true로 판정하는 조건식
* 수행문 - 조건식이 true일 때: "1만원권" 지급
* - 조건식이 false일 때: "무료커피쿠폰" 지급
*/
KeyboardReader reader = new KeyboardReader();
System.out.print("고객명을 입력하세요: ");
String name = reader.getString();
System.out.print("상품명을 입력하세요: ");
String productName = reader.getString();
System.out.print("가격을 입력하세요: ");
int price = reader.getInt();
System.out.print("구매수량을 입력하세요: ");
int amount = reader.getInt();
int orderPrice = price*amount;
System.out.println("===================================");
System.out.println("고객명: "+name);
System.out.println("상품명: "+productName);
System.out.println("가격: "+price);
System.out.println("구매수량: "+amount);
System.out.println("총 구매가격: "+orderPrice);
if (orderPrice>=100000) {
System.out.println("사은품: 1만원권");
} else {
System.out.println("사은품: 무료커피쿠폰");
}
System.out.println("===================================");
}
}
고객명을 입력하세요: 김준희
상품명을 입력하세요: 책
가격을 입력하세요: 50000
구매수량을 입력하세요: 2
===================================
고객명: 김준희
상품명: 책
가격: 50000
구매수량: 2
총 구매가격: 100000
사은품: 1만원권
===================================
1-3. if ~ else if ~ else if ~ else 문
package day4;
import utils.KeyboardReader;
public class IfDemo3 {
public static void main(String[] args) {
/*
* if ~ else if ~ else if ~ else문
* 형식
* if (조건식1) {
* 수행문1;
* } else if (조건식2) {
* 수행문2;
* } else if (조건식3) {
* 수행문3;
* } else {
* 수행문4;
* }
* * 검사할 조건이 여러 개일 때 사용하는 제어문이다.
* * 조건식1이 true이면 수행문1을 수행하고, 나머지 부분은 전부 skip
* * 조건식1이 false이면 첫번째 else if의 조건식2로 넘어간 뒤,
* 조건식2가 true이면 수행문2를 수행하고, 나머지 부분은 전부 skip
* * else 블록은 필요없으면 생략 가능
* * else 블록의 수행문은 제시된 모든 조건식이 false일 때 실행된다.
* * 따라서, 수행문은 절대로 동시에 실행될 수 없다.
*/
/*
* 고객의 등급에 따라서 구매금액에 대한 적립포인트를 계산하기
* 고객등급은 'G', 'S', 'B'중에 하나
* 'G'등급인 경우 구매금액의 3%를 적립
* 'S'등급인 경우 구매금액의 2%를 적립
* 'B'등급인 경우 구매금액의 1%를 적립
*
* 고객명, 고객등급, 구매금액을 입력받아서 고객명, 고객등급, 구매금액, 적립포인트를 출력하기
*/
KeyboardReader reader = new KeyboardReader();
System.out.print("고객명: ");
String name = reader.getString();
System.out.print("고객등급: ");
char grade = reader.getChar();
System.out.print("구매금액: ");
int orderPrice = reader.getInt();
System.out.println("=====================================");
System.out.println("고객명: "+name);
System.out.println("고객등급: "+grade);
System.out.println("구매금액: "+orderPrice);
if(grade=='G') {
int point = (int)(orderPrice*0.03);
System.out.println("적립포인트: "+point);
} else if (grade == 'S') {
int point = (int)(orderPrice*0.02);
System.out.println("적립포인트: "+point);
} else if (grade == 'B') {
int point = (int)(orderPrice*0.01);
System.out.println("적립포인트: "+point);
}
System.out.println("=====================================");
}
}
고객명: 김준희
고객등급: S
구매금액: 50000
=====================================
고객명: 김준희
고객등급: S
구매금액: 50000
적립포인트: 1000
=====================================
1-4. 내포된 if문 (나쁜예)
- 평균점수 60점 이상이면 합격, 97점 이상은 장학금 지급대상 (나쁜 예)
package day4;
public class IfDemo4 {
public static void main(String[] args) {
/*
* 내포된 if문
* 형식
* if (조건식1) {
* 수행문1;
*
* // 내포된 if문
* if (조건식2) {
* 수행문2;
* }
* } else {
* 수행문3;
* }
* * 내포된 if문은 if블록, else블록 내부에 정의된 if문이다.
* * 내포된 if문은 조건식1이 true이면 조건식2를 검사해서 수행문2의 실행을 제어하는 if문
*/
/*
* 평균점수가 60점 이상이면 합격이고, 그 외는 불합격이다.
* 평균점수가 97점 이상이면 장학금 지급대상이다.
*/
int average = 97;
if (average>=60) {
System.out.println("합격입니다.");
// 내포된 if문. 장학금 지급대상 여부는 합격자에 한해서만 검사.
if (average>=97) {
System.out.println("장학금 지급대상입니다.");
}
} else {
System.out.println("불합격입니다.");
}
}
}
합격입니다.
장학금 지급대상입니다.
- 평균점수 60점 이상이면 합격, 97점 이상이면 장학금 지급대상
한 과목이라도 40점 미만이면 과락으로 불합격 (나쁜 예)
// 국어, 영어, 수학점수를 입력받아서 평균을 구한다.
// 평균이 60점 이상이면 합격, 97점 이상이면 장학금지급대상이다.
// 한 과목이라도 40점 미만이면 과목과락으로 불합격이다.
if (kor >= 40 && eng >= 40 && math >= 40) {
if (average >= 60) {
System.out.println("합격입니다.");
if (average >= 97) {
System.out.println("장학금 지급대상입니다.");
}
} else {
System.out.println("평균점수 미달로 불합격입니다.");
}
} else {
System.out.println("과목 과락으로 불합격입니다.");
}
1-5. 빠른종료 사용하기!!!!!! (좋은예)
계속계속 if를 내포하면 가독성이 떨어짐 -> 빠른 종료 사용하기
빠른 종료 - 나쁜 경우를 찾아서 그 경우에 해당하는 경우 프로그램을 종료시킨다.
- 빠른 종료
package day4;
import utils.KeyboardReader;
public class IfDemo5 {
public static void main(String[] args) {
/*
* 빠른 종료 사용하기
*
* - 나쁜 조건을 먼저 찾아서 그 조건에 해당하는 경우(true인 경우) 메소드의 실행을 종료시키는 것
* - 수행문이 실행될 수록 나쁜 조건을 모두 피해간 좋은 조건에 만족하는 경우만 자연스럽게 남게 된다.
* - if문의 구조가 단순해지고, 로직을 이해하기가 더 쉬워지고, 새로운 조건을 추가하는 것도 쉬워진다.
* - 코드의 가독성이 향상되고, 유지보수가 쉬워진다.
*
* 메소드 빠르게 종료시키기
* - return 키워드로 종료시키기
* return문을 만나면 실행중인 메소드는 즉시 종료된다.
* - throw 키워드로 예외(오류)던지기
* throw문을 만나면 실행중인 메소드가 즉시 종료되고, 그 메소드를 호출한 측에 예외객체가 전달된다.
*/
/*
* 국어, 영어, 수학점수를 입력받아서 합격여부, 장학금 지급여부를 출력하기
* 평균점수가 60점 이상이면 합격, 97점 이상이면 장학금 지급대상
* 단, 한 과목이라도 40점 미만이면 과목낙제 불합격
*
* 위 조건을 나쁜 내용을 먼저 찾아내는 조건으로 전환!
* 한 과목이라도 40점 미만이면 과목 낙제로 불합격
* 평균이 60점 미만이면 불합격
* 평균이 97점 이상이면 장학금 지급대상
*/
KeyboardReader reader = new KeyboardReader();
System.out.print("국어점수 입력: ");
int kor = reader.getInt();
System.out.print("영어점수 입력: ");
int eng = reader.getInt();
System.out.print("수학점수 입력: ");
int math = reader.getInt();
//과목낙제가 있는 경우 메시지를 출력하고 main 메소드의 실행을 즉시 종료시킨다.
if(kor<40 || eng<40 || math<40) {
System.out.println("과목낙제로 불합격입니다.");
return;
}
//평균계산(과목낙제의 경우는 평균계산이 필요 없으므로 이 단계에서 평균계산)
int average = (kor + eng + math) /3;
//평균점수가 미달되는 경우 메시지를 출력하고 main 메소드의 실행을 즉시 종료시킨다.
if(average<60) {
System.out.println("평균점수 미달로 불합격입니다.");
return;
}
System.out.println("합격입니다.");
if(average>=97) {
System.out.println("장학금 지급대상입니다.");
}
}
}
국어점수 입력: 100
영어점수 입력: 100
수학점수 입력: 30
과목낙제로 불합격입니다.
- 평균점수 60점 이상이면 합격, 97점 이상은 장학금 지급대상 (좋은 예)
if (average < 60) {
System.out.println("불합격입니다.");
return; // 메소드의 실행을 종료시킨다.
}
System.out.println("합격입니다.");
if (average >= 97) {
System.out.println("장학금 지급대상입니다.")
}
- 평균점수 60점 이상이면 합격, 97점 이상이면 장학금 지급대상
한 과목이라도 40점 미만이면 과락으로 불합격 (좋은 예)
if (kor<40 || eng<40 || math<40) {
System.out.println("과락으로 인한 불합격입니다.");
return;
}
if (average<60) {
System.out.prinln("평균점수 미달로 불합격입니다.");
return;
}
System.out.println("합격입니다.");
if (average>=97) {
System.out.println("장학금 지급대상입니다.");
}
* 변수의 스코프 (Variable Scope) : 변수의 생존범위
- 자바에서 변수의 생존범위: 그 변수가 선언된 블록
package day4;
import utils.KeyboardReader;
public class IfDemo6 {
public static void main(String[] args) {
/*
과세표준과 산출세액
-------------------------------------------------------------------
1,200만원 이하 과세표준의 6%
4,600만원 이하 72만원 + (1,200만원 초과금액의 15%)
8,800만원 이하 582만원 + (4,600만원 초과금액의 24%)
1억5천만원 이하 1,590만원 + (8,800만원 초과금액의 35%)
3억원 이하 3,760만원 + (1억5천만원 초과금액의 38%)
5억원 이하 9,460만원 + (3억원 초과금액의 40%)
10억원 이하 17,460만원 + (5억원 초과금액의 42%)
그 외 38,460만원 + (10억원 초과금액의 45%)
-------------------------------------------------------------------
*/
/*
* 이름과 연봉을 입력받아서
* 이름, 연봉, 급여, 공제액, 실수령액 출력하기
* (급여, 공제액, 실수령액은 한 달 기준)
*
* 연봉 1200만원
* 급여 연봉/12 100만원
* 공제액 연봉에 대한 산출세액/12 6만원
* 실수령액 급여-공제액 94만원
*
* 1. keyboardreader 객체를 생성해서 reader 변수에 대입한다.
* 2. 키보드로 연봉을 입력받아서 변수에 저장한다.
* 3. 변수에 저장된 연봉으로 위에 제시된 조건 중 어느 조건에 해당하는지 검사하고, 산출세액을 계산한다.
* 4. 산출세액을 이용해서 공제액, 실수령액을 계산하고 화면에 출력한다.
*
* -이 문제에서는 빠른 종료는 사용할 필요가 없음
* -이 문제에서는 조건이 여러 개인 경우기 때문에 if ~ else if ~ else if ~ else 구문 사용
*/
KeyboardReader reader = new KeyboardReader();
System.out.print("연봉: ");
int salary = reader.getInt();
//산출세액 변수를 생성
int 산출세액 = 0;
if (salary<=1200) {
산출세액 = (int)(1200*0.06); //변수를 초기화, 조건에 맞는 세액을 계산해서 대입한다.
} else if (salary<=4600) {
산출세액 = 72 + (int)((salary-1200)*0.15);
} else if (salary<=8800) {
산출세액 = 582 + (int)((salary-4600)*0.24);
} else if (salary<=15000) {
산출세액 = 1590 + (int)((salary-8800)*0.35);
} else if (salary<=30000) {
산출세액 = 3760 + (int)((salary-15000)*0.38);
} else if (salary<=50000) {
산출세액 = 9460 + (int)((salary-30000)*0.40);
} else if (salary<100000) {
산출세액 = 17460 + (int)((salary-50000)*0.42);
} else {
산출세액 = 38460 + (int)((salary-100000)*0.45);
}
int 급여 = salary/12;
int 공제액 = 산출세액/12;
int 실수령액 = 급여 - 공제액;
System.out.println("연봉: "+salary+"만원");
System.out.println("급여: "+급여+"만원");
System.out.println("공제액: "+공제액+"만원");
System.out.println("실수령액: "+실수령액+"만원");
}
}
연봉: 3000
연봉: 3000만원
급여: 250만원
공제액: 28만원
실수령액: 222만원
* 문자열 비교 연산자
참조변수.equals("문자열"); ( == (x) )
- grade == "골드"; 이 비교는 grade객체와 "골드"객체의 주소값을 비교하는 식이 되어버려서 false가 나옴
- 참조변수.equals() ; 이거는 참조변수가 가리키는 객체 안에 있는 문자열의 내용과 참조변수로 전달받은 문자열의 내용을 비교하는 거
- public boolean equals(Object other) {
자신이 가지고 있는 문자열의 내용과 other로 전달받은 문자열의 내용을 비교하는 수행문
return boolean값 ;
}
public : 접근제한자. 공개된 메소드임을 나타낸다.
boolean: 반환타입. 이 메소드를 호출한 측에게 제공하는 값의 타입을 나타낸다.
equals: 메소드이름.
Object other: 매개변수. Object는 타입, other는 변수명이다. 이 메소드를 호출(실행)할 때 전달된 값을 저장하는 변수.
package day4;
import utils.KeyboardReader;
public class IfDemo7 {
public static void main(String[] args) {
/*
* 고객의 등급, 구매금액을 입력받아서 적립포인트를 계산하기
* 고객의 등급은 "골드", "실버", "브론즈" 중 하나
*
* "골드" 등급인 경우 구매금액의 3%를 적립
* "실버" 등급인 경우 구매금액의 2%를 적립
* "브론즈" 등급인 경우 구매금액의 1%를 적립
*/
KeyboardReader reader = new KeyboardReader();
System.out.print("등급을 입력하세요: ");
String grade = reader.getString();
System.out.print("구매금액을 입력하세요: ");
int amount = reader.getInt();
int point = 0;
if(grade.equals("골드")) { //grade 객체의 문자열과 "골드"객체의 문자열 내용 비교
point = (int)(amount*0.03);
} else if (grade.equals("실버")) {
point = (int)(amount*0.02);
} else if (grade.equals("브론즈")) {
point = (int)(amount*0.01);
}
System.out.println("고객등급: "+grade);
System.out.println("구매금액: "+amount);
System.out.println("적립포인트: "+point);
}
}
등급을 입력하세요: 골드
구매금액을 입력하세요: 30000
고객등급: 골드
구매금액: 30000
적립포인트: 900
'수업내용 > Java' 카테고리의 다른 글
[2022.09.08.목] 배열 (0) | 2022.09.08 |
---|---|
[2022.09.07.수] switch문, 반복문 (0) | 2022.09.07 |
[2022.09.05.월] 연산자 (0) | 2022.09.05 |
[2022.09.02. 금] 변수 (0) | 2022.09.02 |
[2022.09.01.목] 오티 (1) | 2022.09.01 |