열심히 끝까지
Java1 day03 본문
[3일차 수업 내용] 22.04.16
제어문 ( 조건문, 반복문 )
*정올(정보올림피아드) - 문제 - language coder ==> 코딩문제
문제를 풀면서 기초가 다져졌는지 확인하는 것도 중요
============================================================================
* 지금까지 코드의 실행 흐름이 무조건 위에서 아래로 한 문장씩 순차적으로 진행
-> 때로는 조건에 다라 문장을 건너뛰거나 같은 문장을 반복해서 수행해야 할 때가 있음
==> 프로그램의 흐름(flow)를 바꾸는 역할을 해야하는 문장을 제어문이라고 함
* 조건문은 조건에 다른 다른 문장이 수행되도록 하고, 반복문은 특정 문장들을 반복해서 수행
1. 조건문 if( if, if-else, if-else if- else), switch
- 조건문은 조건식과 문장을 포함하는 블록{ }으로 구성
- 연산결과데 따라 실행할 문장이 달라져 프로그램의 실행 흐름을 변경할 수 있음
- 종류 : if문, switch문 - 주로 if문 사용
1-1 ) if문
- 가장 기본적인 조건문
- 조건식과 괄호{ } 구성
if(조건식){
// 조건식이 참(true)일 때 수행될 문장들
}
==> 만일 if 조건식이 참이면 괄호{ }안의 문장들을 수행
1. 조건식
- 조건식 : 참과 거짓을 판명할 수 있는 식
- if문에 사용되는 조건식은 일반적으로 비교연산자와 논리연산자로 구성
2. 블록 { }
- 블록 : 괄호 { }를 이용해서 여러 문장을 하나의 단위로 묶을 수 있는 것
- 블록은 { 시작 } 끝, 끝나는 괄호에 ;(세미콜론)을 붙히지 않음.
if문 예시
package example01;
public class FlowEx01 {
public static void main(String[] args) {
int x = 0;
if( x == 0 ) { // true
System.out.println("x == 0");
}
if( x != 0 ) { // false
System.out.println("x != 0");
}
if( !( x == 0) ) { // false
System.out.println("!(x == 0)");
}
if( !( x != 0) ) { // true
System.out.println("!(x != 0)");
}
}
}
1-2 ) if-else
if(조건식) {
// 조건식이 참(true)일 때 수행될 문장들
} else {
// 조건식이 거짓(false)일 때 수행될 문장들
}
if-else문 예시 + *문자열 값 비교 및 문자열->정수 변환법*
Package example01;
import java.util.Scanner;
public class FlowEx02 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("숫자를 하나 입력하세요 > ");
String num = sc.nextLine();
System.out.println("입력받은 숫자 : " + num);
// equals() : 문자열 값 비교를 위한 메소드(함수
// " " 포함하여 인식 ==> 10(x) "10"(o)
if ( num.equals("0")) {
System.out.println("입력하신 숫자는 0입니다.");
} else {
System.out.println("입력하신 숫자는 0이 아닙니다.");
}
// Integer.parseInt() 로 " " 제거하여 문자열이 아닌 정수로 표시
// "10" ==> 10 그 정수를 변수 number에 포함
int number = Integer.parseInt(num); // " " <- 제거하여 정수로 남김
if ( number == 0 ) {
System.out.println("입력하신 숫자는 0입니다.");
} else {
System.out.println("입력하신 숫자는 0이 아닙니다.");
}
// 조건식에 그대로 Integer.parseInt()를 넣어 숫자로 비교
if ( Integer.parseInt(num) == 0) {
System.out.println("입력하신 숫자는 0입니다.");
} else {
System.out.println("입력하신 숫자는 0이 아닙니다.");
}
}
}
1-3 ) if-else if
if(조건식1) {
// 조건식1이 참(true)일 때 수행될 문장들
} else if(조건식2) {
// 조건식1이 거짓(false)이고 조건식2가 참(true)일 때 수행될 문장들
} else if(조건식3) {
// 조건식1, 2가 거짓(false)이고 조건식3이 참(true)일 때 수행될 문장들
} else {
// 조건식1, 2, 3이 모두 거짓(false)일 때 수행될 문장들
}
if-else if문 예시
Package example01;
import java.util.Scanner;
public class FlowEx03 {
public static void main(String[] args) {
int score = 0;
char grade = ' ';
Scanner sc = new Scanner(System.in);
System.out.print("당신의 점수를 입력하세요 > ");
score = sc.nextInt();
if ( score >= 90 ) {
grade = 'A' ;
} else if ( score >= 80 ) { // score < 90 && score >= 80
// ==> score < 90은 위에 if문으로 부터 내려옴
grade = 'B' ;
} else if ( score >= 70 ) {
grade = 'C' ;
} else {
grade = 'D' ;
}
System.our.println("학점 : " + grade);
}
}
1-4 ) 중첩 if문
if(조건식1) {
// 조건식1이 참(true)일 때 수행될 문장들
if(조건식2) {
// 조건식1, 2가 모두 참(true)일 때 수행될 문장들
} else {
// 조건식1은 참(true)이고 조건식 2가 거짓(false)일 때 수행될 문장들
}
} else {
// 조건식1이 거짓(false)일 때 수행될 문장들
}
중첩 if문 + if-else if 예시
Package example01;
import java.util.Scanner;
public class FlowEx04 {
public static void main(String[] args) {
int score = 0;
char grade = ' ';
char opt = '0';
Scanner sc = new Scanner(System.in);
System.out.print("점수를 입력하세요 > ");
score = sc.nextInt();
if ( score >= 90 ) {
grade = 'A' ;
if (score >= 98) {
opt = '+';
} else if (score < 94 ) {
opt = '-';
}
} else if ( score >= 80 ) {
grade = 'B' ;
if (score >= 88) {
opt = '+';
} else if (score < 84 ) {
opt = '-';
}
} else if ( score >= 70 ) {
grade = 'C' ;
if (score >= 78) {
opt = '+';
} else if (score < 74 ) {
opt = '-';
}
} else {
grade = 'D' ;
}
System.our.println("당신의 최종 학점 : " + grade + opt );
}
}
1-5 ) switch
- if문은 조건식의 결과가 참과 거짓 두가지 밖에 없음
- 경우의 수가 많아질수록 else if를 계속 추가 -> 조건식이 많아져 복잡해짐
-> 여러 개의 조건식을 계산 ==> 처리시간이 증가 + 오래 걸림
- 이러한 if문과 달리 switch문은 단 하나의 표현식으로 많은 경우의 수를 처리 가능 + 표현도 간결
==> 알아보기 쉬움
switch(표현식) {
case 값1 :
// 표현식의 결과가 값1과 같은 경우 수행될 문장들
break;
case 값2 :
// 표현식의 결과가 값2과 같은 경우 수행될 문장들
break;
default :
// 표현식의 결과가 일치하는 case문이 없을 때 수행될 문장들
break;
}
1. 표현식을 계산
2. 표현식의 결과와 일치하는 case문으로 이동
3. 이후의 문장들을 수행
4. break문이나 switch문의 끝을 만나면 switch문 전체를 빠져나감.
switch 예시
Package example01;
import java.util.Scanner;
public class FlowEx05 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("숫자 하나를 입력하세요 > ");
int num = sc.nextInt();
// switch + case + break;
switch(num) {
case 1 :
System.out.println("입력하신 값은 1입니다.");
break;
case 2 :
System.out.println("입력하신 값은 2입니다.");
break;
case 3 :
System.out.println("입력하신 값은 3입니다.");
break;
default :
System.out.println("입력하신 값은 1, 2, 3아 아닙니다.");
break; // 제일 마지막에 있는 case 혹은 default는 break;가 필수가 아님
}
}
}
switch 예시 ( 위에 if - else if 문 예시를 switch로 바꾸어 표현)
Package example01;
import java.util.Scanner;
public class FlowEx06 {
public static void main(String[] args) {
int score = 0;
char grade = ' ';
Scanner sc = new Scanner(System.in);
System.out.print("당신의 점수를 입력하세요 > ");
score = sc.nextInt();
switch(score / 10) {
case 10 :
case 9 :
grade = 'A';
break;
case 8 :
grade = 'B';
break;
case 7 :
grade = 'C';
break;
default :
grade = 'D';
}
System.out.println("학점 : " + grade);
}
}
2. 반복문 for, while, do-while
- 어떤 작업이 반복적으로 수행되도록 할 때 사용
- 종류 : for문, while문, do-while(while문의 변형)
- for문이나 while문에 속한 문장은 조건에 따라 단 한번도 실행이 안 될 수 있음
but!! do- while은 최소한 한번의 수행이 보장
2-1 ) for문( for statement )
- for문은 반복 횟수를 알고 있을 때 적합
for( 초기식; 조건식; 증감식 ) {
// 반복수행할 문장
}
1. 초기식
- 반복문에 사용될 변수를 초기화하는 부분
- 처음에 단 한번만 수행
2. 조건식
- 조건식의 값이 참이면 계속 반복, 거짓이면 반복 중단 -> for문 벗어남
- 조건식이 잘못 작성되면 블록{ } 내의 문장이 한번도 수행되지 않거나
영원히 반복되는 무한루프(infinite loop)에 빠지기 쉬움 ==> 주의 요망
3. 증감식
- 반복문을 제어하는 변수의 값을 증가 또는 감소시키는 것
- 매 반복마다 변수의 값이 증감식에 의해서 점진적으로 변하다가
결국 조건식이 false가 되어 for문을 벗어남
// for문 구조 예시
for( int i = 0; i < 5; i++) {
// 반복 횟수 : 5번 ( i == 0, 1, 2, 3, 4 )
System.out.println(i); // 0 1 2 3 4
}
for( int i = 13; i > 1; i--) {
}
// 지금 굳이 알 이유는 없음, 나중에 다른 Java 수업 진행 후 그 때 이해
* 향상된 for문 (enhanced for statement )
- 배열(Array)와 컬렉션(Collection)에 저장된 요소에 접근할 때, 기존보다 편리한 방법으로
처리할 수 있도록 for문의 새로운 문법이 있음 ==> 이를 향상된 for문이라고 함
for( 타입 변수명 : 배열 또는 컬렉션 ) {
// 반복할 문장
}
- 위의 문장에서 타입은 배열 또는 컬렉션의 요소의 타입이여야 함
- 배열 또는 컬렉션에 저장된 값이 매 반복마다 하나씩 순서대로 얽혀서 변수에 저장
for문 예시
Package example01;
public class FlowEx07 {
public static void main(String[] args) {
for( int i = 0; i <= 5; i++ ) { // 반복 횟수 : 6번(0 1 2 3 4 5)
// System.out.println("i : " + i); // 반복문 이후에도 변수가 필요하면 // for문 내가 아닌 다른 곳에 선언
}
System.out.println("i : " + i);
System.out.println();
int j;
for( j = 0; j <= 5; j++ ) {
System.out.println("j : " + j);
}
System.out.println("최종 j값 : " + j);
}
}
for문 + 복합대입연산자를 이용하여 1~101까지의 누적합 구하기 예시
Package example01;
public class FlowEx08 {
public static void main(String[] args) {
// for문과 복합대입연산자를 이용하여 1~101까지 누적합 구하기
// ==> 5151
int sum = 0; // 복합대입연산자에서 초기화를 꼭 시켜줄 것
for( int i = 1; i <= 101; i++ ) {
sum += i; // sum = sum + i;
}
System.out.println("sum : " + sum);
}
}
이중 for문 예시
Package example01;
public class FlowEx09 {
public static void main(String[] args) {
// 이중 for문 ==> 대표적으로 구구단
for( int i = 2; i <= 9; i++ ) {
for( int j = 1; j <= 9; j++) {
System.out.printf("%d x %d = %d\n", i, j, i*j);
}
}
System.out.println();
}
}
2-2 ) while문
- for문에 비해 while문의 구조는 간단, if문처럼 조건식과 블록만으로 구성
- while문은 조건식이 참(true)일 동안, 즉 조건식이 거짓이 될 때까지 블록 내의 문장을 반복
- 반복횟수가 정해져 있지 않을 때 사용하기 좋음
while(조건식) {
// 조건식이 참(true)일 때 반복 수행할 문장
}
boolean flag = true;
while(flag) {
if(num == 0) {
flag = false; // if문이 없으면 무한루프, 무한루프를 빠져나가기 위한 탈출 조건
}
}
while문 예시 - 꼭 다시 해볼 것
Package example01;
public class FlowEx10 {
public static void main(String[] args) {
int i = 5;
int j = 5;
while( i-- != 0 ) { // 내려오고 나중에 감소해서 0이 찍힘
System.out.println( i + " - 프로그래밍은 재밌다. ");
}
System.out.println();
while( --j != 0 ) { // 감소하고 내려와 0이 찍히지 않는다.
System.out.println( j + " - 프로그래밍은 재밌다. ");
}
}
}
while문 예시(각 자리수의 합)
Package example01;
import java.util.Scanner;
public class FlowEx11 {
public static void main(String[] args) {
// 각 자리수의 합
// Ex ) 12345 ==> 1 + 2 + 3 + 4 + 5 ==15
// 나누기(/) 나머지(%) 이용
int num = 0;
int sum = 0;
Scanner sc = new Scanner(System.in);
System.out.print("숫자를 입력하세요(예 : 12345) > ");
num = sc.nextInt();
while( num != 0 ) {
sum += num % 10; // sum = sum + (num % 10) 12345 % 10 == 5
num /= 10; // num = num / 10, 12345 / 10 == 1234
}
System.out.println("각 자리수의 합 : " + sum);
}
}
2-3 ) do-while문
do {
// 조건식의 결과가 무조건 참일 때 수행될 문장들을 적음
// 단, 한번은 무조건 실행
} while(조건식);
- do-while문은 while문의 변형으로 기본적인 구조는 while문과 같으나
조건식과 블록의 순서를 바꿔놓은 것
- 즉, 블록을 먼저 실행한 후에 조건식을 평가
2-4 ) break, continue
- break문은 자신이 포함된 가장 가까운 반복문을 벗어나며 주로 if문과 함께 사용되어
특정 조건을 만족하면 반복문을 벗어나도록 하게 하는 예약어
- continue는 반복문 내에서만 사용될 수 있으며 반복이 진행되는 도중에 continue문을 만나면
반복문의 끝으로 이동하여 다음 반복으로 넘어감
==> for문의 경우 증감식으로, while문과 do-while문의 경우 조건식으로 넘어감
for( int i = 0; i <= 10; i++) { // 반복횟수 : 0 1 2 3 4 5 6 7 8 9 10 ==> 11번
System.out.println(i); // 0 1 2 3 4 5 6 7
if( i == 7 ) {
break; // 깨부순다.
}
System.out.println(i); // 0 1 2 3 4 5 6
}
for( int i = 0; i <= 10; i++){
System.out.println(i); // 0 1 2 3 4 5 6 7 8 9 10
if( i == 3 ){
continue; // 뒤에 과정 무시한다.
}
System.out.println(i); // 0 1 2 4 5 6 7 8 9 10
문장1
문장1
문장1
문장1
문장1
문장1
}
for( ){
for( ){
if( ) {
break; // 두번째 for문만 깨부순다.
}
}
}
'Java1(주말)' 카테고리의 다른 글
Java1 day04 (0) | 2022.04.17 |
---|---|
Java1 day03 보충 (0) | 2022.04.17 |
Java1 day02 보충 2 (0) | 2022.04.16 |
Java1 day02 보충 1 (0) | 2022.04.12 |
Java1 day02 (0) | 2022.04.10 |