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

(네이버클라우드 부트캠프) 9일차 - 실습프로젝트

by kk_naks 2024. 6. 5.

1. 실습프로젝트 준비하기

# 01. 자바 프로젝트 준비하기

## 학습목표

- Gradle 빌드 도구를 사용하여 자바 프로젝트 폴더를 구성할 수 있다.
- Gradle 빌드 스크립트 파일에서 실행할 클래스를 설정할 수 있다.
- Gradle 빌드 도구를 사용하여 애플리케이션을 실행할 수 있다.
- 콘솔로 값을 출력할 수 있다.
- IntelliJ IDE에서 Gradle 프로젝트를 실행할 수 있다.

## 요구사항 

- myapp 폴더를 만들고 자바 프로젝트 폴더로 구성
- IntelliJ IDE로 프로젝트 가져온 후 실행 

## 실행 결과

```
[팀 프로젝트 관리 시스템]
```

  1.1 Java 프로젝트 생성

     - 프로젝트 폴더 만들기

터미널에
- $mkdir myapp2 
- $gradle init
파일 설정

 

     - InteliJ에서 프로젝트 열기 

InteliJ에서 프로젝트 열기
- myappp2 에서 settings.gradle 선택 후 프로젝트로 열기
- myapp2/app/main/java/ bitcamp.myapp2 패키지 생성

 

※ 실행이 안된다 ?
- gradle.build 에서 application의 mainClass가 'org.example.App'으로 되어있다.
- gradle build 시에 gradle 제대로된 mainClass를 참조하지 못한다. 
-> mainClass의 이름을 'bitcmap.myapp2.App'로 바꿔준다. 

 

2. 리터럴과 변수를 사용해서 문자열 출력하기

  2.1 초기화면 작성하기 

# 02. 리터럴과 변수를 사용해서 문자열 출력하기

## 학습목표

- 문자열 및 숫자 등을 리터럴로 표현할 수 있다.
- 변수를 사용하여 값을 다룰 수 있다.
- 출력문을 사용하여 값을 콘솔로 출력할 수 있다.

## 요구사항 

- 애플리케이션의 제목과 기본 메뉴 출력

## 실행 결과

```
----------------------------------------------
[팀 프로젝트 관리 시스템]

1. 회원
2. 팀
3. 프로젝트
4. 게시판
5. 도움말
6. 종료
----------------------------------------------
```

 

     - 리터럴 변수 선언 및 초기화

package bitcamp.myapp;

public class App {
    public static void main(String[] args) {
        String appTitle = "[팀 프로젝트 관리 시스템]";
        String line = "---------------------------";
        String menu1 = "1. 회원";
        String menu2 = "2. 팀";
        String menu3 = "3. 프로젝트";
        String menu4 = "4. 게시판";
        String menu5 = "5. 도움말";
        String menu6 = "6. 종료";

        System.out.println(line);
        System.out.println(appTitle);
        System.out.println(menu1);
        System.out.println(menu2);
        System.out.println(menu3);
        System.out.println(menu4);
        System.out.println(menu5);
        System.out.println(menu6);
        System.out.println(line);
    }
}

     - 결과

3. ANSI 이스케이프 코드를 사용하여 문자열 꾸미기

# 03. ANSI 이스케이프 코드를 사용하여 출력 문자열 꾸미기

## 학습목표

- ANSI 이스케이프 문자를 다룰 수 있다.
- Gradle 빌드 도구의 옵션을 이용하여 콘솔 출력을 제어할 수 있다.
- 코드 정리 기법 중 '설명하는 변수'를 활용할 수 있다.

## 요구사항 

- 애플리케이션 제목을 볼드체로 출력
- 위, 아래 구분선을 볼드체로 출력
- '6. 종료' 메뉴를 빨강색 + 볼드체로 출력
- Gradle 디버깅 출력은 제거

## 실행 결과

```
----------------------------------------------   <== 볼드체
[팀 프로젝트 관리 시스템]   <== 볼드체

1. 회원
2. 팀
3. 프로젝트
4. 게시판
5. 도움말
6. 종료   <== 빨강색 + 볼드체
----------------------------------------------   <== 볼드체
```

  3.1 ANI 이스케이프 코드

     - ANSI 이스케이프 코드는 텍스트 형식을 제어하기 위해 터미널과 콘솔에서 사용한다.

     - 이 코드를 통해 텍스트의 색상, 스타일, 배경색 등을 변경할 수 있으며, ANSI 이스케이프 코드는 다음과 같은 형식이다.

- \033[<코드>m

※ 여러개의 코드를 사용할 경우 ;으로 구분한다.
- \033[<코드><코드>m
※ 사용이 끝나면 마지막에 반드시 초기화를 해주어야한다.
- 초기화를 안하면 이스케이프코드 이후로 끝날때 까지 적용된다.

 

     - ANSI 이스케이프 코드 (색깔)

색상 텍스트 배경
검정 30 40
빨강 31 41
초록 32 42
노랑 33 43
파랑 34 44
자주 35 45
청록 36 46
흰색 37 47

 

     - ANSI 이스케이프 코드 (텍스트 스타일)

스타일 코드
리셋 0
굵게 1
흐리게 2
기울기 3
밑줄 4
반전(배경/전경) 7
숨기기 8
취소선 9

 

  3.2 ANI 이스케이프 코드로 문자열 꾸미기 

     - 빨강색 : \033[33m, 볼드체 : \033[1m, 초기화 : \033[0m

/*
 * This source file was generated by the Gradle 'init' task
 */
package bitcamp.myapp;

public class App {
    public static void main(String[] args) {

        String redAnsi = "\033[31m";
        String boldAnsi = "\033[1m";
        String resetAnsi = "\033[0m";

		//중략//

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

 

     - 결과

 

4. 키보드 입력다루기

# 04. 키보드 입력 다루기

## 학습목표

- 키보드 입력을 다룰 수 있다.
- 조건문을 사용하여 실행을 분기할 수 있다.
- 반복문을 사용하여 특정 명령문을 반복해서 실행할 수 있다.
- Gradle로 run 태스크를 실행할 때 키보드를 표준 입력으로 사용할 수 있게 설정할 수 있다. 

## 요구사항 

- 사용자로부터 메뉴 번호를 입력 받기
- 메뉴 번호에 해당하는 메뉴 이름을 출력
- 종료 메뉴 번호를 입력하면 실행을 종료

## 실행 결과

```
----------------------------------------------  
[팀 프로젝트 관리 시스템]  

1. 회원
2. 팀
3. 프로젝트
4. 게시판
5. 도움말
6. 종료  
----------------------------------------------  
> 1
회원
> 3
프로젝트
> 9
메뉴 번호가 옳지 않습니다.
> 6
종료합니다.
```

  4.1 표준입력 메서드 

     - java.io.InputStream 

- java.io.InputStream 은 자바에서 바이트단위로 데이터를 읽어오는 추상클래스이다. 
- 바이트 기반 입력 스트림을 나타낸다. 
- java.io.InputStream keyboard = System.in;

 

     - java.io.InputStream keyboard = System.in;

- System.in은 자바프로그램에서 사용자로 부터 입력을 받는 표준 입력 스트림이다. 
- 위 코드는 System.in을 사용하여 키보드 입력을 받기 위해 InputStream객체를 생성한 다음 이를 변수 keyboard에 할당한다.

 

     - java.util.Scanner

- 자바에서 표준입력,파일, 문자열 등 다양한 소스에서 데이터를 읽는 클래스이다. 

 

     - java.util.Scanner scanner = new java.util.Scanner(keyboard);

- java.util.Scanner scanner은 Scanner 클래스형식으로 scanner 객체를 인스턴스 한다.
- new Scanner(keyboard)는 keyboard(System.in)을 받아 Scanner형식으로 메모리를 할당한다. 
- 사용자로부터 keyboard값을 받아 Scanner클래스 만큼의 크기로 메모리를 할당하여 인스턴스된 객체 scanner에 대입한다.

 

     - int menuNo = scanner.nextInt();

- 숫자 값을 받기위해 생성된 인스턴스의 nextInt()의 메서드롤 호출한다.

 

     -keyboard.close();

- 할당된 메모리를 관리하기 위해 해제를 한다. 

 

  4.2 do~while문

     - 루프문의 하나로 do를 실행하고 while의 조건을 판단하여 do를 실행할지 루프문을 종료할지 결정한다.

do{
	//루프에서 실행할 코드
    //첫번째는 무조건 실행
    //이후 while문의 참/거짓에 따라 실행
}while(조건식);

 

  4.3 Switch문

     - 조건문의 하나로 case에 해당하면 해당case를 수행하고 else이면 default를 수행한다. 

switch (식 또는 변수){    //조건식을 사용할 변수 
	case 값1:
    	// 변수가 값1에 해당하면 실행 할 코드
        break; 
    case 값2:
    	// 변수가 값2에 해당하면 실행 할 코드
   	case 값3:
    	// 변수가 값3에 해당하면 실행 할 코드 
        // case2에 break문이 없어서 case2에 해당하는 값도 실행된다.
        break;
    default:
    	// 어느것도 해당안되는 실행되는 코드 
}

 

  4.4 코드완성하기

     - 코드 작성

/*
 * This source file was generated by the Gradle 'init' task
 */
package bitcamp.myapp;

import java.util.Scanner;

public class App {
    public static void main(String[] args) {
			
            //중략//
            
        java.io.InputStream keyboard = System.in;
        java.util.Scanner scanner = new java.util.Scanner(keyboard);

        int menuNo;
        do {
            System.out.print("> ");
            menuNo = scanner.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("종료합니다.");
                    scanner.close();
                    break;
                default:
                    System.out.println("메뉴 번호가 옳지 않습니다.");
            }
        } while (menuNo != 6);
    }
}

     - 결과(에러)

 

     - 에러원인 

- 초기 gradle설정 시 plugin에 run에서 standardInput에 대한 설정이 없기 때문에 gradle.build에 설정을 해준다.

run{
    standardInput = System.in
}

 

     - 결과

 

5. 전체 코드

/*
 * This source file was generated by the Gradle 'init' task
 */
package bitcamp.myapp;

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 menu1 = "1. 회원";
        String menu2 = "2. 팀";
        String menu3 = "3. 프로젝트";
        String menu4 = "4. 게시판";
        String menu5 = "5. 도움말";
        String menu6 = "6. 종료";

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

        java.io.InputStream keyboard = System.in;
        java.util.Scanner scanner = new java.util.Scanner(keyboard);

        int menuNo;
        do {
            System.out.print("> ");
            menuNo = scanner.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("종료합니다.");
                    scanner.close();
                    break;
                default:
                    System.out.println("메뉴 번호가 옳지 않습니다.");
            }
        } while (menuNo != 6);
    }
}