본문 바로가기
개발자 꿈나무의 하루/01_Boot Camp

(네이버클라우드 부트캠프) 11일차 - Java프로그래밍 기초(조건문,반복문,배열), 실습프로젝트

by kk_naks 2024. 6. 11.

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문과 짝을 이룬다.({}사용 안할시 )

    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문 기본형태

    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문

    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문의 기본 형태

    // 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 배열의 기본 형태

// - 문법
// 메모리종류[] 메모리이름 = 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 배열의 초기값

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();

    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);

        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();

    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 완성된 코드

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();
    }
}