즐겁게!! 자신있게!! 살아보세!!

재밌는 인생을 위하여! 영촤!

Language_Study/JAVA

[JAVA, App] 3.제어문

Godwony 2020. 12. 21. 15:24
반응형

제어문(Control Statement)

  • 프로그램의 흐름을 변경하는 명령어
  • 프로그램은 왼쪽에서 오른쪽으로 위에서 아래로 순서대로 처리되는데 이러한 흐름을 변경하는 명령어

1.종류

1) 분기문

  • 조건이나 값을 가지고 분기(갈림길)
    if 와 switch

2) 반복문(Loop)

  • 동일한 패턴의 문장을 반복 수행
    while, do~while, for

3) 기타 제어문
break, continue, return

2.if

1) 단순 if

if(boolean 데이터 또는 boolean이 리턴되는 표현식 또는 메소드 호출){
    () 안의 내용이 true일 때 수행할 내용
}

2) if ~ else

if(boolean 데이터 또는 boolean이 리턴되는 표현식 또는 메소드 호출){
    () 안의 내용이 true일 때 수행할 내용
}else{
    () 안의 내용이 false일 때 수행할 내용
}

3) if ~ else if ~ else

if(boolean 데이터 또는 boolean이 리턴되는 표현식 또는 메소드 호출){
    () 안의 내용이 true일 때 수행할 내용
}else if(새로운 비교 내용){
    앞의 조건이 false 이고 ()안의 조건이 true 일 때 수행할 내용
}else{
    () 안의 내용이 false일 때 수행할 내용
}
  • else if는 무제한 사용이 가능
  • else는 생략이 가능

실습1)

  • 점수를 입력받아서 60점이 넘으면 합격이라고 출력하기
        //키보드로부터 입력받기 위한 객체를 생성
        Scanner sc = new Scanner(System.in);
        //점수 입력받기
        System.out.print("점수 입력:");
        int score = sc.nextInt();

        //점수가 60이상이면 합격이라고 출력
        if(score >= 60){
            System.out.println("합격");
        }

        sc.close();

실습2)

  • 점수가 60이상이면 합격 아니면 불합격
        // 키보드로부터 입력받기 위한 객체를 생성
        Scanner sc = new Scanner(System.in);
        // 점수 입력받기
        System.out.print("점수 입력:");
        int score = sc.nextInt();

        // 점수가 60이상이면 합격 아니면 불합격 이라고 출력
        if(score >= 60) {
            System.out.println("합격");
        }else {
            System.out.println("불합격");
        }
        sc.close();

실습3)

90 - 100 이면 A
80 - 90미만이면 B
70 - 80미만이면 C
60 - 70미만이면 D
0 - 60미만이면 F
  • 자바는 위의 조건이 아래 조건을 포함하면 에러가 발생
  • 결코 도달할 수 없는 코드를 만들면 에러가 발생
  • 이런 경우 else 의 용도 ?
        // 키보드로부터 입력받기 위한 객체를 생성
        Scanner sc = new Scanner(System.in);
        // 점수 입력받기
        System.out.print("점수 입력:");
        int score = sc.nextInt();

        // 점수가 90-100 사이이면 A, 80-90미만이면 B
        // 점수가 70-80미만이면 C, 60-70미만이면 D
        // 점수가 0-60미만이면 F 라고 출력
        if(score >= 90 && score <= 100) {
            System.out.println("A");
        }else if(score >= 80 && score < 90) {
            System.out.println("B");
        }else if(score >= 70 && score < 80) {
            System.out.println("C");
        }else if(score >= 60 && score < 70) {
            System.out.println("D");
        }else if(score >= 0 && score < 60){
            System.out.println("F");
        }else {
            System.out.println("잘못된 점수 입력");
        }
        //else는 예외적인 상황 발생에 대한 처리를 해주는 것이 좋습니다.
        sc.close();

3.switch

  • 값에 의한 분기
switch(정수나 문자열 변수 또는 연산식 그리고 메소드 호출){
    case 값1:
        ( )안의 내용이 값1일 때 수행할 내용;
        (break;)
    case 값2:
        ( )안의 내용이 값2일 때 수행할 내용;
        (break;)
    ...
    default:
        일치하는 값이 없을 때 수행할 내용;
        (break;)
} 
  • 문자열은 자바 1.7 버전부터 지원
  • case 옆에 작성하는 값은 리터럴이거나 final 변수이어야 합니다.
    • 변수를 만들 때 자료형 앞에 final을 기재하면 자바에서는 읽기 전용 변수(상수)가 됩니다.
  • case 구문안에서 break를 생략하면 break를 만날 때 까지 모든 문장을 전부 수행

실습
)

정수를 1개 입력받아서 1이면 한식 2이면 중식 3이면 분식 나머지 경우는 일식이라고 출력
값을 가지고 분기하는 경우인데 if 로 작성이 가능하지만 값에 따라 다른 문장을 실행할 때는 switch를 사용하는 것을 권장
        // 키보드로부터 입력받기 위한 객체를 생성
        Scanner sc = new Scanner(System.in);
        // 메뉴 입력받기
        System.out.print("메뉴 입력(1-한식 2-중식 3-분식 기타-일식):");
        int menu = sc.nextInt();

        //읽기 전용의 변수를 생성
        final int KOREA = 1;
        final int CHINA = 2;
        final int SNACKBAR = 3;

        switch(menu) {
        case KOREA:
            System.out.println("한식");
            break;
        case CHINA:
            System.out.println("중식");
            break;
        case SNACKBAR:
            System.out.println("분식");
            break;
        default:
            System.out.println("일식");
            break;
        }

        sc.close();

4.반복문

  • 패턴을 갖는 문장을 연속적으로 사용해야 하는 경우 반복문을 사용할 수 있습니다.
    1) while
while(boolean 데이터 또는 boolean이 리턴되는 연산식 또는 메소드 호출){
    ( )의 값이 false가 아닐 때 수행할 내용;
}
//Hello Java 를 3번 출력
System.out.println("Hello Java");
System.out.println("Hello Java");
System.out.println("Hello Java");

int i = 0;
while(i<3){
    System.out.println("Hello Java");
    i = i + 1;
}

2) do ~ while

do{
    반복 수행할 내용;
}while(조건);
  • 무조건 반복 수행할 내용을 하고 조건을 확인해서 false가 { }안의 내용을 반복
  • do ~ while을 while 로 변경할 수 있지만 반드시 1번은 수행해야 한다 라는 의미를 전달하기 위해서 사용
i = 0;
do{
    System.out.println("Hello Java");
    i = i + 1;
}while(i<3);

3) for

for(처음 한번만 수행할 내용; 조건; 두번째 부터 수행할 내용){
    조건이 false가 아니라면 수행할 내용;
}
  • 각 영역은 생략이 가능
for(int i=0; i<3; i=i+1){
    System.out.println("Hello Java");
}

int i=0;
for( ; i<3; i=i+1){
    System.out.println("Hello Java");
}

for(int i=0, int j=0 ; i<3; i=i+1){
    System.out.println("Hello Java");
}

4.제어문을 사용할 때 주의 할 점

  • if 나 switch, while, for를 쓸 때 주의할 점은 ( ) 뒤에 ;을 하는 것입니다.
  • ( ) 뒤에 ;을 하게 되면 조건은 무시되고 { }안의 내용을 무조건 한 번만 수행합니다.

실습 - 반복문 : Hello Java를 3번씩 출력하기

        //while은
        //한번만 수행할 내용 -> while(조건) -> { }내에 반복수행할 내용 
        int i = 0;
        while(i<3){
            System.out.println("Hello Java");
            i = i + 1;
        }
        System.out.println("======================");
        //do~while은
        //한번만 수행할 내용 -> do{반복 수행할 내용} -> while(조건);
        i = 0;
        do {
            System.out.println("Hello Java");
            i = i + 1;
        }while(i<3);
        System.out.println("======================");
        //for
        //for(한번만 수행할 내용; 조건; 두번째부터 수행할 내용){반복 수행할 내용}
        for(i=0; i<3; i=i+1) {
            System.out.println("Hello Java");
        }

자바에서의 제어문

1.분기문: if(조건에 의한 분기 - boolean), switch(값에 의한 분기 - 정수, 문자열)

2.반복문: while, do~while, for

3.규칙

1)제어문은 하나의 블록이어서 제어문 안에 만든 변수는 제어문 안에서만 사용이 가능

2)제어문 내의 실행 문장이 하나의 명령어라면 { } 생략 가능

3)제어문 안에 제어문을 포함 할 수 있음

for(int i=0; i<10; i=i+1){
    System.out.println("i:" + i);
}

System.out.println("i:" + i); //이 구문은 에러

for(int i=0; i<10; i=i+1)
    System.out.println("i:" + i);
//이 경우 실행 명령어가 1개 이므로 { }를 생략할 수 있음
//이 경우 들여쓰기를 정확하게 하지 않으면 코드의 가독성을 떨어뜨릴 수 있기 때문에 권장하지는 않음

기타 제어문

1.break

  • switch 구문에서 switch 구문을 종료하거나 반복문에서 조건문과 함께 사용되서 반복문을 중단하는 역할을 수행하는 명령어

2.continue

  • 반복문에서 조건문과 함께 사용되서 다음 반복으로 넘어가는 역할을 수행하는 명령어
        // 1부터 10까지 출력하는 구문
        for (int i = 1; i < 11; i = i + 1) {
            // 4의 배수가 되면 반복문 중단 - 1, 2, 3 중단
            if (i % 4 == 0) {
                break;
            }

            System.out.println("i:" + i);
        }

        System.out.println("============================");
        // 1부터 10까지 출력하는 구문
        for (int i = 1; i < 11; i = i + 1) {
            // 4의 배수가 되면 다음 반복으로 이동
            //1,2,3,5,6,7,9,10
            if (i % 4 == 0) {
                continue;
            }
            System.out.println("i:" + i);
        }

3.java 에서는 반복문에 레이블을 설정할 수 있고 break 나 continue를 할 때 뒤에 레이블을 붙이면 레이블이 반복문을 빠져 나가거나 다음 반복으로 이동할 수 있습니다.

  • C 언어에는 go to 가 있어서 특정할 레이블이 붙은 곳으로 바로 이동이 가능
  • 구조적 프로그래밍 기법에서 go to 사용을 배제하는 것을 권장
  • java 에서는 go to 사용을 배제하기 위해서 예약어지만 사용할 수 없도록 함
  • 여러 개의 반복문에서 break 만으로 여러 개의 반복문을 빠져 나가거는 것이 복잡해 졌습니다.
  • 반복문에 레이블을 붙일 수 있도록 함

1) 레이블 추가
레이블 : 반복문

2) 레이블 사용
break 레이블;

3) 레이블이 없는 경우는 가장 가까이서 만든 반복문을 중단

제어문 연습

1.교번 처리

  • 일정한 패턴 반복, 나머지 연산자 이용
  • ON 과 OFF를 교대로 10번 출력
for(int i=0; i<10; i = i+1){
    if(i%2 ==0){
        System.out.println("ON");
    }else{
        System.out.println("OFF");
    }
}

2.반복문을 이용한 일정한 패턴의 문자열 만들기

동아일보에서 자바로 검색했을 때 총 데이터 건수는 1164개이고
url은 아래와 같은 형태, 페이지마다 p의 값이 15씩 증가
제어문을 이용해서 전체 데이터를 스크랩 할 수 있는 URL을 생성
먼저 구해야 하는 것은 전체 데이터 건수를 가지고 몇 번 반복문을 수행해야 하는지 찾아야 하고
반복문안에서 URL을 만들어 주어야 합니다.

http://www.donga.com/news/search?p=1&query=자바
http://www.donga.com/news/search?p=16&query=자바
http://www.donga.com/news/search?p=31&query=자바

        //첫번째 페이지 URL 
        //http://www.donga.com/news/search?p=1&query=자바

        //각페이지 마다 기사가 15개씩 있어서 p의 값이 15씩 증가

        //총 데이터 건수는 1164

        int total = 1164;
        //페이지 개수 만들 때는 나누어 떨어지지 않으면 몫 + 1
        int pagesu = 1164 / 15;

        if(total % 15 != 0 ) {
            pagesu = pagesu + 1;
        }

        for(int i=0; i<pagesu; i=i+1) {
            //페이지 별 기사의 시작 번호
            int p = 15 * i + 1;
            //기사의 URL 만들기
            System.out.println(
                "http://www.donga.com/news/search?p=" + p +
                "&query=자바");
        }

3.정수를 입력받아서 소수 판별하기

  • 소수(prime): 2부터 자신의 절반이 되는 숫자까지 나누어서 한번도 나누어 떨어지지 않으면 소수
//하나의 정수 입력받기
        Scanner sc = new Scanner(System.in);
        System.out.print("소수 판별할 정수 입력:");
        int su = sc.nextInt();

        //소수 판별을 위한 플래그 변수를 생성
        boolean flag = false;
        //소수 판별 반복문
        for(int i=2; i<= su/2; i=i+1) {
            //이 경우는 소수가 아님
            //조건을 만족한 경우 플래그 변수의 값을 변경
            if(su % i == 0) {
                flag = true;
                break;
            }
        }

        //su가 소수인지 출력
        if(flag == false) {
            System.out.println(su + "는 소수");
        }else {
            System.out.println(su + "는 소수가 아님");
        }

        sc.close();

4. 2-1000까지 소수의 개수 구하기

5.반복문 2개를 이용한 별 출력

* 1개 출력 : System.out.print("*")
줄바꿈: System.out.print("\n");
System.out.println("");

*****
*****
*****
*****
*****
for(int i=0; i<5; i=i+1){
    for(int j=0; j<5; j=j+1){
        System.out.print("*");
    }
    System.out.print("\n");
}
*
**
***
**
*

위처럼 계속 하나의 패턴이 적용되는 것이 아니고 일정한 패턴이 적용되다가 다른 패턴이 적용되면 분할해서 구현
처음 3줄은 늘어나고 다음 2줄은 줄어드는 패턴

for(int i=0; i<5; i=i+1){
    if(i <= 2){
        for(int j=0; j<i+1; j=j+1){
            System.out.print("*");
        }
    }else{
        for(int j=0; j<5-i; j=j+1){
            System.out.print("*");
        }
    }
    System.out.print("\n");    
}

연습문제

하나의 정수를 입력받아서 아래처럼 출력하기
5를 입력한 경우

    0
   1 2
   3  4
 5      6
78901234

0앞에 공백이 4개
1앞에 공백이 3개 그리고 1과 2사이에 공백 1개
3앞에 공백이 2개 그리고 3과 4 사이에 공백이 3개
5앞에 공백이 1개 그리고 5와 6 사이에 공백이 5개
아래쪽에는 숫자가 9개의 숫자를 출력

9다음의 숫자는 다시 0

반응형

'Language_Study > JAVA' 카테고리의 다른 글

[JAVA, App] 5.데이터정렬  (0) 2020.12.23
[JAVA, App] 4.Array  (0) 2020.12.23
[JAVA, App] 2.연산자  (0) 2020.12.21
[JAVA, App] 1.자료형  (0) 2020.12.21
[JAVA, App] 0.Intro  (0) 2020.12.19