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