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();
}
}
'개발자 꿈나무의 하루 > 01_Boot Camp' 카테고리의 다른 글
(네이버클라우드 부트캠프) 13일차 - Java프로그래밍 기초(메서드) (0) | 2024.06.12 |
---|---|
(네이버클라우드 부트캠프) 12일차 - Java프로그래밍 기초(표준입출력,String), 실습프로젝트(메서드) (1) | 2024.06.11 |
(네이버클라우드 부트캠프) 10일차 - Java프로그래밍 기초(연산자) (0) | 2024.06.07 |
(네이버클라우드 부트캠프) 9일차 - 실습프로젝트 (1) | 2024.06.05 |
(네이버클라우드 부트캠프) 8일차 - Eclipse IDE설정 및 Java프로그래밍 기초(변수) (0) | 2024.06.04 |