포스트

Day09 실습프로젝트

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    # 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’로 바꿔준다.
  1. 리터럴과 변수를 사용해서 문자열 출력하기
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
### 2.1 초기화면 작성하기

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

    ## 학습목표

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

    ## 요구사항 

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

    ## 실행 결과

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

    1. 회원
    2. 팀
    3. 프로젝트
    4. 게시판
    5. 도움말
    6. 종료
    ----------------------------------------------
    ```
  • 리터럴 변수 선언 및 초기화
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    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);
        }
    }
  • 결과



  1. ANSI 이스케이프 코드를 사용하여 문자열 꾸미기
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
    # 03. ANSI 이스케이프 코드를 사용하여 출력 문자열 꾸미기

    ## 학습목표

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

    ## 요구사항 

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

    ## 실행 결과

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

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

3.1 ANSI 이스케이프 코드

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

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

    ※ 여러개의 코드를 사용할 경우 ;으로 구분한다.

    • \033[<코드><코드>m
      ※ 사용이 끝나면 마지막에 반드시 초기화를 해주어야한다.
    • 초기화를 안하면 이스케이프코드 이후로 끝날때 까지 적용된다.
  • ANSI 이스케이프 코드 (색깔)
색상텍스트배경
검정3040
빨강3141
초록3242
노랑3343
파랑3444
자주3545
청록3646
흰색3747
  • ANSI 이스케이프 코드 (텍스트 스타일)
스타일코드
리셋0
굵게1
흐리게2
기울기3
밑줄4
반전(배경/전경)7
숨기기8
취소선9

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

  • 빨강색 : \033[33m, 볼드체 : \033[1m, 초기화 : \033[0m
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
    /*
     * 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);
        }
    }
  • 결과



  1. 키보드 입력다루기
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
    # 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를 실행할지 루프문을 종료할지 결정한다.
1
2
3
4
5
    do{
    	//루프에서 실행할 코드
        //첫번째는 무조건 실행
        //이후 while문의 참/거짓에 따라 실행
    }while(조건식);

4.3 Switch문

  • 조건문의 하나로 case에 해당하면 해당case를 수행하고 else이면 default를 수행한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
    switch ( 또는 변수){    //조건식을 사용할 변수 
    	case 값1:
        	// 변수가 값1에 해당하면 실행 할 코드
            break; 
        case 값2:
        	// 변수가 값2에 해당하면 실행 할 코드
       	case 값3:
        	// 변수가 값3에 해당하면 실행 할 코드 
            // case2에 break문이 없어서 case2에 해당하는 값도 실행된다.
            break;
        default:
        	// 어느것도 해당안되는 실행되는 코드 
    }

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
    /*
     * 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에 설정을 해준다.



1
2
3
    run{
        standardInput = System.in
    }
  • 결과



  1. 전체 코드
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
61
62
63
64
65
66
    /*
     * 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);
        }
    }
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.