포스트

Day11 Java프로그래밍 기초(조건문,반복문,배열), 실습프로젝트

1. 조건문

1.1 if 문의 기본 형태

  • 조건문의 기본 형태

    문법1: if (조건) 문장1; => 조건이 참일 때 문장1을 수행한다.

    문법2: if (조건) 문장1; else 문장2; => 조건이 참일 때 문장1을 수행하고, 거짓이면 문장2를 수행한다.

    문법3: if (조건1) 문장1; else if (조건2) 문장2; else if (조건3) 문장3; else 문장4; => 조건1~3을 순차적으로 수행하고, 모두 거짓이면 문장4를 수행한다.

1.2 if 문 주의사항

  • else문은 가장 가까운 if문과 짝을 이룬다.({}사용 안할시 )

    1
    2
    3
    4
    5
    6
    7
    
      if (age >= 19) { 
        if (age >= 70) 
          System.out.println("지하철 무임승차 가능합니다.");
        else 
          System.out.println("미성년입니다.");
      }
      // else 문은 age >=70과 짝을 이룬다
    
  • 중괄호를 사용하여 else문의 짝을 선택 할 수 있다.

    if (age >= 19) { if (age >= 70) System.out.println(“지하철 무임승차 가능합니다.”); } else // 두 번째 if는 첫 번째 if 블록에 묶여있기 때문에 이 else와 상관없다. System.out.println(“미성년입니다.”); }

2. 반복문

2.1 Switch문

  • Switch문 기본형태

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
      switch (조건) {
        case (값1):
          문장1
          break;
        case (값2):
          문장2
          break;
        case (값3):
          문장3
          break;
        default: //case에 해당되는 것이 없을때
          문장4
    
  • Switch (값) : 문자열, Enum,정수

    • case (값) : 리터널, 변수는 불가능 -> 이산적인 값만 사용 가능
    • case (값) : final 변수는 가능, Enum 가능

2.2 while문

  • while문 기본형태

    문법1: while (조건) 문장; => 조건이 참인 동안 문장을 계속 실행한다.

  • break, continue

    문법1: while (조건) => 조건이 참인 동안 문장을 계속 실행한다. 문장; if (조건) break; => 조건이 참이면 반복문을 종료한다.

    문법2: while (조건) => 조건이 참인 동안 문장을 계속 실행한다. 문장1; if (조건) continue; => 조건이 참이면 문장2를 수행하지 않고 while문 조건으로 돌아간다 문장2

  • label문

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
      int x = 2, y = 1;
    
      // 라벨명: 반복문1 { 반복문2 {break 라벨명;}}
      // 라벨 문법:
      //      라벨: 문장;
      //      라벨: {문장1, 문장2, ...}
    
      myloop: 
        while (x <= 9) {
    
          while (y <= 9) {
            System.out.printf("%d * %d = %d\n", x, y, x * y);
            if (x == 5 && y == 5)
              break myloop; // myloop 라벨에 소속된 문장을 나간다.
            y++;
          }
    
          System.out.println();
          x++;
          y = 1;
        }
    
  • do while문

    # do ~ while

    • 최소 한 번은 반복한다.
    • 한 번 이상 반복하면 do ~ while
    • 0 번 이상 반복하면 while

      do 문장1; while (조건);

2.3 for문

  • for문의 기본 형태

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
      // for 문의 전형적인 예
      for (int i = 1; i <= 5; i++)
        System.out.println(i);
      // 실행 순서
      // 1) 변수초기화  => int i = 1
      // 2) 조건 => i <= 5
      // 3) 문장 => System.out.print(i + " ")
      // 4) 변수증가문 => i++
      // 조건이 참인 동안 2 ~ 4를 반복한다.
    
      // for 문에서 선언한 변수는 그 for 문 안에서만 사용할 수 있다.
      //    System.out.println(i); // 컴파일 오류!
    

3. 배열

3.1 배열의 기본 형태

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// - 문법
// 메모리종류[] 메모리이름 = new 메모리종류[개수];
// 데이터타입[] 변수명 = new 데이터타입[개수];
// 데이터타입[] 변수명 = {};
    int[] arr1 = new int[5]; // OK!
    int arr2[] = new int[5]; // OK! C-style.
    int[] arr3 = {1,2,3,4,5};
    int[] arr4 = new int[]{1,2,3,4,5}
// 배열 선언문 분석:
// arr1
//   - 배열 메모리의 주소를 담는 변수이다.
//   - 이렇게 메모리의 주소를 보관하는 변수를 '레퍼런스'라 부른다.
//
// new int[5]
//   - new 명령은 사용할 메모리를 확보하는 명령이다.
//   - 즉 연속된 5 개의 int 타입 메모리를 준비하라는 명령이다.
//   - 사용할 메모리를 확보한 후 그 메모리의 찾아 갈 수 있도록 시작 주소를 리턴한다.
//   - 이렇게 값을 저장하기 위해 확보된 메모리를 "인스턴스"라 부른다.
//
// new 명령은 메모리를 확보하는 명령이다.
// - 리턴 값은 확보된 메모리의 시작 주소이다.

3.2 객체와 인스턴스



  • new연산자를 통해 메모리를 할당하는 것을 인스턴스라고 한다.
  • 인스턴스로 생성된 배열을 객체라고 한다.
  • 객체가 더 포괄적인 개념이다.
  • 배열의 주소를 레퍼런스라고 한다.

3.3 레퍼런스와 가비지 관계



  • 새로 생성된 인스턴스를 할당 받으면 기존의 레퍼런스는 가비지가 된다.
  • jvm에서는 다양한 방법으로 가비지를 청소한다.
  • 가비지를 파악하기 위해 레퍼런스 카운터 테이블이 존재한다.



3.4 배열의 초기값

1
2
3
4
5
6
7
8
int[] arr1;
arr1 = new int[5];

// 배열 레퍼런스를 초기화시키고 싶다면 null로 설정하라.
arr1 = null; // 0으로 설정. 즉 레퍼런스가 아무것도 가리키지 않음을 의미.

// 레퍼런스가 배열 인스턴스를 가리키지 않은 상태에서 사용하려 하면?
System.out.println(arr1[0]); // NullPointerException 실행 오류!
  • 변수는 자동으로 초기화가 안되서 변수의 값을 할당하고 사용해야한다.
    • 배열을 생성하면 자동으로 초기화가 된다.
    • 배열의 초기화는 각 타입의 0으로 생성된다.

    // 로컬 변수는 값을 저장하지 않고 사용할 수 없다. int v; // System.out.println(v); // 컴파일 오류!

    // 로컬 변수와 달리 new 명령으로 확보된 메모리는 종류에 상관없이 기본 값으로 자동 초기화 된다. // 따라서 배열 메모리 또한 생성되는 순간 기본 값으로 자동 초기화 된다. // - 정수 배열(byte[], short[], int[], long[]) : 0 // - 부동소수점 배열(float[], double[]) : 0.0 // - 논리 배열(boolean[]) : false // - 문자 배열(char[]) : ‘\u0000’ // - 주소 변수(Object[]) : null //

    int[] arr1 = new int[5]; // [0, 0, 0, 0, 0] float[] arr2 = new float[5]; // [0.0, 0.0, 0.0, 0.0, 0.0] boolean[] arr3 = new boolean[5]; // [false, false, false, false, false] char[] arr4 = new char[5]; // [ , , , , ] -> \u0000이 담긴다. Object[] arr5 = new Object[5]; // [null, null, null, null, null]

4. 실습프로젝트

4.1 배열을 사용하여 메뉴 정리 하기

  • 기존 각각 선언했던 메뉴 변수 배열로 정리하기

    String menu1 = “1. 회원”; String menu2 = “2. 팀”; String menu3 = “3. 프로젝트”; String menu4 = “4. 게시판”; String menu5 = “5. 도움말”; String menu6 = “6. 종료”;

  • 배열로 선언하기

    String[] menus = new String[]{ “회원”, “팀”, “프로젝트”, “게시판”, “도움말”, “종료”, };

4.2 반복문을 사용하여 선택 메뉴 출력하기

  • 기존 출력 방식

    System.out.println(boldAnsi + line + resetAnsi); System.out.println(boldAnsi + appTitle + resetAnsi); System.out.println(menu1); System.out.println(menu2); System.out.println(menu3); System.out.println(menu4); System.out.println(menu5); System.out.println(boldAnsi + redAnsi + menu6 + resetAnsi); System.out.println(boldAnsi + line + resetAnsi);

    int menuNo; do { System.out.print(“> “); menuNo = keyboardScanner.nextInt();

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
      switch (menuNo) {
          case 1:
              System.out.println("회원");
              break;
          case 2:
              System.out.println("팀");
              break;
          case 3:
              System.out.println("프로젝트");
              break;
          case 4:
              System.out.println("게시판");
              break;
          case 5:
              System.out.println("도움말");
              break;
          case 6:
              System.out.println("종료합니다.");
              break;
          default:
              System.out.println("메뉴 번호가 옳지 않습니다.");
              break;
      }
    

    } while (menuNo != 6); keyboardScanner.close();

  • for문과 조건문을 사용하여 변환하기

    for (String menu : menus){

    • 조건식 : 종료 조건일 때 빨간색 볼드체 출력
      나머지는 일반 출력
      }

    while (true){

    • 숫자 입력받기
    • 조건식 : 1~6이면 메뉴 출력
      -조건식2 : 6번이면 반복문 종료
      나머지는 일반 출럭
      나머지는 유효하지 않은 숫자
      }

    System.out.println(boldAnsi + line + resetAnsi); System.out.println(boldAnsi + appTitle + resetAnsi);

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    
          for (int i = 0; i < menus.length; i++) {
              if (menus[i] == "종료") {
                  System.out.printf("%s%d. %s%s\n", (boldAnsi + redAnsi), (i + 1), menus[i], resetAnsi);
              } else {
                  System.out.printf("%d. %s\n", (i + 1), menus[i]);
              }
          }
    
          System.out.println(boldAnsi + line + resetAnsi);
    
          int menuNo;
          while (true) {
              System.out.print("> ");
              menuNo = keyboardScanner.nextInt();
    
              if (menuNo >= 1 && menuNo <= menus.length) {
                  if (menus[menuNo - 1] == "종료") {
                      break;
                  }
                  System.out.println(menus[menuNo - 1]);
              } else {
                  System.out.println("메뉴 번호가 옳지 않습니다.");
              }
          }
    
          System.out.println("종료합니다.");
          keyboardScanner.close();
    

4.3 메뉴 입력시 예외처리하기

  • 기존 입력 방식 : 문자 입력시 에러발생

    while (true) { System.out.print(“> “); menuNo = keyboardScanner.nextInt();

    1
    2
    3
    4
    5
    6
    7
    8
    
      if (menuNo >= 1 && menuNo <= menus.length) {
          if (menus[menuNo - 1] == "종료") {
              break;
          }
          System.out.println(menus[menuNo - 1]);
      } else {
          System.out.println("메뉴 번호가 옳지 않습니다.");
      }   }
    
  • 예외처리 적용

    try{
    정상코드
    } catch(InputMismatchException ex){
    예외코드시 출력문
    키보드 버퍼 초기화
    }

    Scanner keyboard = new Scanner(System.in); int menuNo;

    while (true){ System.out.print(“> “); try{ menuNo = keyboard.nextInt(); if (menuNo >= 1 && menuNo <= menus.length){ if (menus[menuNo - 1].equals(“종료”)){ break; } System.out.printf(“%d. %s\n”,menuNo, menus[menuNo -1]); } else { System.out.println(“유효한 메뉴 번호가 아닙니다.”); } } catch(InputMismatchException ex){ System.out.println(“숫자로 메뉴 번호를 입력하세요.”); keyboard.next(); } } System.out.println(“종료합니다”); keyboard.close();

4.4 완성된 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package bitcamp.myapp2;
import java.util.InputMismatchException;
import java.util.Scanner;

public class App {
    public static void main(String[] args) {
        //글자색,굵기 설정
        String redAnsi = "\033[31m";
        String boldAnsi = "\033[1m";
        String resetAnsi = "\033[0m";

        //메뉴초기 설정
        String appTitle = "[팀프로젝트 관리 시스템]";
        String line = "---------------------------";
        String[] menus = new String[]{
                "회원",
                "팀",
                "프로젝트",
                "게시판",
                "도움말",
                "종료",
        };

        //메뉴화면 출력
        System.out.printf("%s%s%s\n",boldAnsi,line,resetAnsi);
        System.out.printf("%s%s%s\n",boldAnsi,appTitle,resetAnsi);
        for (String menu : menus){
            if (menu.equals("종료")) {
                System.out.printf("%s%s%s\n",(boldAnsi+redAnsi),menu,resetAnsi);
            }else {
                System.out.printf("%s\n",menu);
            }
        }
        System.out.printf("%s%s%s\n",boldAnsi,line,resetAnsi);

        //메뉴선택하기
        Scanner keyboard = new Scanner(System.in);
        int menuNo;

        while (true){
            System.out.print("> ");
            try{
                menuNo = keyboard.nextInt();
                if (menuNo >= 1 && menuNo <= menus.length){
                    if (menus[menuNo - 1].equals("종료")){
                        break;
                    }
                    System.out.printf("%d. %s\n",menuNo, menus[menuNo -1]);
                } else {
                    System.out.println("유효한 메뉴 번호가 아닙니다.");
                }
            } catch(InputMismatchException ex){
                System.out.println("숫자로 메뉴 번호를 입력하세요.");
                keyboard.next();
            }
        }
        System.out.println("종료합니다");
        keyboard.close();
    }
}


이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.