수업내용/Java

[2022.09.06.화] 제어문과 반복문 (if문, for문)

주니어주니 2022. 9. 6. 20:33

제어문과 반복문

 

제어문

- 특정 조건에 따라서 수행문의 실행 여부를 변경하는 것

- 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