제어문
- 기본적으로 프로그램의 진행은 순차적으로 진행되지만 순차적인 흐름을 바꾸고자 한다면 제어문을 이용해서 제어 가능
- 종류 : 조건문, 반복문, 분기문
조건문
- 조건식을 통해 참, 거짓 이냐를 판단해서 그에 해당하는 코드 실행
- 조건식의 결과는 항상 true/false여야함.
- 보통 조건식에서는 비교연산자(대소,동등), 논리연산자(&&,||)을 주로사용한다
- 조건문은 크게 if문( 단독if, if~else, if ~else if, 중복 if)과 switch문으로 나뉨
단독 IF문
- 조건식의 결과가 참(true)일 경우 중괄호 블럭 안의 코드가 실행
- 조건식의 결과가 거짓(false)일 경우 중괄호 블럭은 무시하고 넘어감
- 실행문이 하나라면 중괄호 생략 가능하지만 쓰는 걸 권장
- 표현법
if(조건식) {
// 조건식이 true일때 실행문
}
IF~ELSE문
if(조건식) {
// 조건식이 true라면 실행될 코드
} else {
// if문의 조건식이 false라면 실행될 코드
}
IF~ELSE IF문
- 같은 비교대상으로 여러개의 조건을 제시해야할 경우 사용
if(조건식1) { // 조건식1이 트루라면 실행코드1을 실행시키고 if블록 종료
//실행코드1
} else if (조건식 2){ // 조건식2이 트루라면 실행코드2을 실행시키고 if블록 종료
//실행코드2
} else if (조건식 3) { // 조건식3이 트루라면 실행코드3을 실행시키고 if블록 종료
//실행코드3
} else { // 위 모든 조건이 false인 경우 자동으로 실행.
//실행코드4
}
String result = "";
// 박스를 먼저 만둘어두고 값을 대입하기(초기화 과정 필수)
// if문 안에서는 바깥에 있는 변수에 접근 가능하고 외부에서는 if문 안에 있는 변수 접근 불가
// else문은 초기화 안 해줘도 되지만 아래와 같이 else if로 끝나면
// 모두 false가 될 수 있으므로 초기화가 안 될 수 있어 초기화 필수
if( age <= 13) {
result = "어린이";
} else if(age <= 19) {
result = "청소년";
} else if( age > 19) {
result = "성인";
} else {
return; // 현재 호출된 일반메소드를 빠져나가는 역할을 한다. (아래 출력문이 실행되지 않음)
}
// 해당블럭안에서 선언된 변수는 해당블럭이 끝나면 자동으로 사라진다.
System.out.println(result);
public void practice9() {
// 중간고사, 기말고사, 과제점수, 출석회수를 입력하고 Pass 또는 Fail을 출력하세요.
// 평가 비율은 중간고사 20%, 기말고사 30%, 과제 30%, 출석 20%로 이루어져 있고
// 이 때, 출석 비율은 출석 회수의 총 강의 회수 20회 중에서 출석한 날만 따진 값으로 계산하세요.
// 70점 이상일 경우 Pass, 70점 미만이거나 전체 강의에 30% 이상 결석 시 Fail을 출력하세요.
// 중간 고사 점수 : 80
// 기말 고사 점수 : 90
// 과제 점수 : 50
// 출석 회수 : 15
Scanner sc = new Scanner(System.in);
System.out.print("중간 고사 점수 :");
int middle_test = sc.nextInt();
System.out.print("기말 고사 점수 :");
int final_test = sc.nextInt();
System.out.print("과제 점수 :");
int exam = sc.nextInt();
System.out.print("출석 점수 :");
int attend = sc.nextInt();
System.out.println("================= 결과 =================");
if(attend > 14 ) {
System.out.println("중간 고사 점수(20) : "+ (middle_test*0.2));
System.out.println("기말 고사 점수(30) : "+ (final_test*0.3));
System.out.println("과제 점수(30) : "+ (exam*0.3));
System.out.println("출석 점수(20) : "+ (attend));
double total = (middle_test*0.2 + final_test*0.3 +
exam*0.3 + attend);
System.out.println("총점 : "+ total);
if(total >= 70) {
System.out.println("PASS");
}else {
System.out.println("FAIL");
}
}else {
System.out.printf("FAIL [출석 회수 부족(%d/20)]",attend);
}
public void practice11() {
// 정수를 이용해서 4자리 비밀번호를 만들려고 하는데
// 이 때 4자리 정수를 입력 받아 각 자리 수에 중복되는 값이 없을 경우 ‘생성 성공’
// 중복 값이 있으면 ‘중복 값 있음‘
// 자리수가 안 맞으면 ‘자리 수 안 맞음‘ 출력
// 단, 제일 앞자리 수의 값은 1~9 사이 정수
Scanner sc = new Scanner(System.in);
System.out.print("비밀번호 입력(1000~9999) : ");
int num = sc.nextInt(); // 1 2 3 4
int thousand = num / 1000; // 1234 -> 1 (1000의자리수)
int hundred = (num % 1000) / 100 ; // 1234 -> 234 -> 2(100의 자릿수)
int ten = ((num % 1000) % 100) / 10; // 1234 % 1000 -> 234 % 100 -> 34 / 10 -> 3; (10의 자리)
int one = ((num % 1000) % 100) % 10;// 1234 -> 234 -> 34 -> 4
System.out.println(""+thousand+hundred+ten+one);
if(num <1000 || num > 9999) {
System.out.println("자리수 안맞음");
} else if( !(one == ten || one == hundred || one == thousand || ten == hundred || ten == thousand || hundred == thousand)) {
// 중복값이 없는 케이스
System.out.println("생성 성공");
}else {
System.out.println("중복 값 있음");
}
SWITCH문
- switch문 괄호에는 실수 타입 변수를 사용할 수 없음
- if문과의 차이점
- if(조건식) : 조건식을 복잡하게 기술가능. 비교범위(대소비교) 제시할수 있음
- switch 조건식x : 확실한 값만 조건으로 기술할수 있음, 동등비교만 수행 가능
- 장점 : case에 기록된 값을 통해 내가 원하는 코드위치로 프리패스 가능
- if~else문의 경우 if의 조건식 결과가 true가 나오기전까지 조건식검사를 계속 실행하므로 , switch문보다 연산효율이 떨어짐
- 자주 사용되지 않지만 동일한 연산결과가 수행되어야하는 경우 사용됨
- 키보드 a를 누르는 입력시간과 p를 누를대의 입력시간이 다르면 이상하다 -> 게임 할 때 q키는 빨리눌리고 r키는 늦게 눌린다.
- 표현법
switch(동등비교를 수행할 값) {
case 값1 : 실행할 코드1; // 앞으로 동등비교를할 대상자 == 값1 일경우 실행할코드1을 실행함.
break; // 실행할코드1을 실행하고 switch문을 빠져나갈수 있게 break;를 걸어준다.
// 브레이크문이 없다면 아래내용이 순차적으로 실행됨.
case 값2 : 실행할 코드2;
break;
case 값n : 실행할 코드n;
break;
default : 실행할 코드; // if - else if문에서 else문과 같은 역할을 함.
// 위의 값1, 값2, ... 값n까지 앞으로 동등비교를할 대상자와 일치하지 않다면
// default 내의 실행할코드가 실행된다.
// 마지막은 break문을 작성하지 않음.
}
public void method4() {
// 사용자에게 1월 ~ 12월 사이의 월을 입력받아 해당 달의 마지막 날짜를 출력하는 프로그램
// 1, 3, 5, 7,8,10,12 -> 해당 달은 31일 까지 입니다.
// 4, 6, 9, 11 => 해당 달은 30일 까지 입니다.
// 2 => 해당 달은 28일 또는 29일까지입니다.
// 그외 => 1월부터 12월까지의 숫자를 입력해주세요.
// switch문으로 만들기, break은 딱 3개만 사용
Scanner sc = new Scanner(System.in);
System.out.print("1월 ~ 12월 사이의 월 입력 :");
int month = sc.nextInt();
switch(month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: System.out.println("해당 달은 31일 까지 입니다."); break;
case 6:
case 4:
case 9:
case 11: System.out.println("해당 달은 30일 까지 입니다."); break;
case 2: System.out.println("해당 달은 28일 또는 29일까지입니다."); break;
default: System.out.println("1월부터 12월까지의 숫자를 입력해주세요.");
}