중간 점검 - 총복습

박현정·2022년 4월 1일
0

JAVA 독학

목록 보기
19/26

총 복습의 시간으로 항공기 관리프로그램을 만들어 보자,

#기능#

1) 추가하기
2) 검색하기
(각 5개의 정보로 각 검색가능 하게)
3) 수정하기
(항공기번호로 조회하여 출발지/도착지 선택 수정가능하게)
4) 삭제하기
(항공기번호로 조회하여, 해당 항공기 정보 삭제 가능하게)
5) 목록보기
(결과 값을 한번에 볼 수 있게끔)

입력 정보
: 항공사, 항공기번호, 최대승객수, 출발지, 도착지

#이미지 불러오는 법

JAVA에서 이미지 가져오는 법

  1. 먼저, IMG파일을 workspace>ams(프로젝트)>src 폴더 내에 이미지 폴더를 만들어 저장한후,

  1. 아래와 같이 상대주소로 불러오기
    (main은 이미지명)

    ImageIcon img = new ImageIcon("src/img/main.gif");
  • 참고
    //절대경로 : 내 위치가 어디든지 찾아갈 수 있는 경로
    //상대 경로 : 내 위치에 따라서 변경되는 경로

1. 두개의 클래스 파일을 만든다

AmsMain : 메인 화면

AmsField : 기능

◎ 메인화면 구성하기

public static void main(String[] args) {
	
	AmsField af = new AmsField();
	// 기능화면에서 각각의 기능을 만든후 클래스 사용!! 
    전역변수는 new를 만나는순간 초기화됨 즉, 메모리에서 해제됨 
	//단, static변수는 프로그램이 종료될때 메모리에서 해제된다.
	
	ImageIcon img = new ImageIcon("src/img/main.gif");		
	
	String [] arPlane = new String[5];
	//비행기 정보를 담는 배열
    
	String [] menu = {"추가하기","검색하기","수정하기","삭제하기","목록보기"};
	//기능 메뉴 담는 배열
    
    int choice = 0;
	String insertMsg = "[추가하실 정보를 그대로 입력하세요.(, 포함)]\n"
			+"항공사, 항공기번호, 최대승객수, 출발지, 도착지";
	String deleteMsg = "삭제하실 항공기 번호를 입력하세요.\n";
	String updateMsg = "수정하실 항공기 번호를 입력하세요.\n";
	
	String keyword ="";
		
   String [] searchMenu = {"항공사", "항공기번호", "최대승객수", "출발지", "도착지"};
	int index = 0;
	
	while(true) {
	choice = JOptionPane.showOptionDialog(null, "", "AMS", 
			JOptionPane.DEFAULT_OPTION, 
			JOptionPane.PLAIN_MESSAGE, img, menu, null);
	
    //.소괄호 메서드 리턴값은 ?  -> int 로 확인할수 있음 값으로 볼수 있어서
	 //choice에 값을 담을 수 있음
	//버튼이니까 default 없어도 됨! 
	
	if(choice == -1) break;
	//나가기
    
	switch(choice) {
	//추가하기 영역
	case 0 :
		arPlane = JOptionPane.showInputDialog(insertMsg).split(", ");
		//문자열에서 split 구분점을 기준으로 나누는 배열타입으ㄷ로 가짐 -> String 배열에 그대로 담아짐!
		af.insert(arPlane);
		break;
	
	//검색하기 영역
	case 1 :
		index = JOptionPane.showOptionDialog(null, "",
			"AMS", JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, img, searchMenu, 
			null);
		if (index !=-1) {
		keyword = JOptionPane.showInputDialog("검색하실"+searchMenu[index]+"을(를)입력하세요.");
		JOptionPane.showMessageDialog(null,af.search(keyword, index));
				
		};
		
		break;
	
	//수정하기 영역
	case 2 :
	break;
   
   //삭제하기 영역
    case 3 : 
    keyword = JOptionPane.showInputDialog(deleteMsg);
		if(af.delete(keyword)){
			JOptionPane.showMessageDialog(null, "삭제완료");
		}else {
			JOptionPane.showMessageDialog(null, "삭제실패");
		}
		
		break;
    
   //목록보기 영역 
    case 4 :
	JOptionPane.showMessageDialog(null, af.show());
	break;
    
    }}
    }
    }

◎ 기능화면 구성하기

이렇게 틀을 잡아 놓고, field 화면에서 각각의 기능을 만든다.

0. 전역변수 설정

public class AmsField {

항공사, 항공기번호, 최대승객수, 출발지, 도착지
2차원 배열 !!! 생각하기
2차원배열[0] = 1차원배열; : 2차원 배열 한번 접근하면 1차원 배열

//전역변수에 선언 모든기능에서 쓰이기 때문에~

String [][] arrPlane = new String[100][5];
	//100개의 비행기라고 먼저 기본값 설정 
int cnt;
int showCnt;
int cLength = arrPlane[0].length;//열의길이

String result = "";
//추가하기 5개의 정보가 들어가는 배열로 받는게 편함 > 매개변수 5개보다는
//int updateIndex = 0;  >>검색된 행번호 받기 >>수정하기 영역에서 설명!

1. 추가하기

void insert(String [] arPlane) {
	//매개 변수를 배열로 받기
	arrPlane[cnt] = arPlane;
	cnt++;
	//넣고 나서 증가!
	}
    

▶인덱스 어떻게 넣을까? 한번 사용했다는건 하나가 0번째 방에 넣어들었다는 거,
한번 호출할때마다 카운트를 1씩 증가시키면 그게 인덱스 변화!
들어간 값은 목록보기에서 확인할 수 있도록.

2. 검색하기

//항공사를 검색하기 keyword 가지고 검색 -> 항공사는 몇열? 1열 -> 열을 고정 0

    String search(String keyword, int index) {
	int arIndex[];
	String result = ""; //기억해줄애
	int searchCnt = 0;

▶검색결과가 몇개인지는 검색결과가 끝나고 알수 있기때문에 (for문 끝나고) 여기서는 선언만하고, 카운트만큼 칸수를 만들어 기억하게끔 함

행번호를 기억할 수 있는 방법은 문자열로 쭉 연결시킴 ex) 0, 1, 2,
split을 통해 쉼표 구분점으로 배열 값을 정수로 받아야함!
행번호를 받는 배열을 만들고 배열의 길이만큼 반복하자.

처음에는 매개변수를 keyword 항공사만으로 찾을수 있게 하였지만,
index를 기억하게끔 하여 모든 정보로 검색할 수 있게만듬
따라서 매개변수는 2개! -> int arIndex = 0; 전역변수로 올리기

	for (int i = 0; i < cnt; i++) {

		if(keyword.equals(arrPlane[index][0])) {
			//[0] 항공사 행 고정
            행번호를 통해 show를 사용하기 i번째 방에있는 정보랑 비교를 하자 equals
			//행번호를 가진 배열하나 받자
			searchCnt++;
			//updateIndex = i;> 항공기 행번호가 여기에 담김~!
			result += ""+i+",";

		}
	}
	arIndex = new int[searchCnt];
	for (int i = 0; i < arIndex.length; i++) {
		arIndex[i] = Integer.parseInt(result.split(",")[i]);
        }
		return show(arIndex);
	}

▶위의 for문이 끝났을때, 여기서 new해줘서
arIndex[i]방에다가 결과를 스필릿한 즉 정숫값을 arIndex값에 담아준다.

4. 삭제하기 (항공기 번호로 검색해서 삭제하기)

boolean delete(String keyword) {
	boolean deleteCheck = false;
	//정적 배열은 골라 삭제하는게 아니라 밀어서 덮어 씌어버리는 것!overloading!!
	for (int i = 0; i < cnt; i++) {
		//cnt -1 : 마지막 정보가 담긴 행
		//cnt : null이 담긴 행
		if(arrPlane[i][1].equals(keyword)){
			for(int j = i; j < cnt; j++) {
				arrPlane[j] = arrPlane[j+1];
				
			}
			deleteCheck = true;
			break;
		}
		
	}
	cnt--;
    //다시 삭제할 영역 입력시, 값을 초기화 하여 삭제해야함
	return deleteCheck;
}

5. 목록보기(오버로딩)

결과값을 누적하여 한번에 보여줄 수 있도록.
result 를 return 으로 돌려서 출력하기
Overloading

	String result = "항공사, 항공기번호, 최대승객수(명), 출발지, 도착지\n";	
	//초기화값
	//아래는 매번 붙는 값
	for (int i = 0; i < cnt; i++) {
		result +="★";
	
		for (int j = 0; j < cLength; j++) {
			result += j == cLength-1? arrPlane[i][j] : arrPlane[i][j]+", ";
		}	
        //값들을 누적 시킴 (누적연산자) arrPlane : 한비행기의 하나의 값
		//삼항연산자 ~? 맞으면 : 틀리면
		result +="\n";
		}
	
	if (cnt==0) result = "목록 없음";
	return result;
	
	}
//버그 목록보기를 누르면 계속 또 연결이됨!!! 뭐가문제일까..?
//누를때마다 !! rLength 가 문제였음!!!>cnt로 고침

5.1 검색결과보기

String show (int[] arIndex) {
	//arIndex 에 행번호를 받겠다! 
	//열번호 반복  
	String result = "항공사, 항공기번호, 최대승객수, 출발지, 도착지\n";
	
	//검색결과 만큼 돌아라 for문
	for (int i = 0; i < arIndex.length; i++) {
	result +="★";
	//내가 검색결과가 만큼 돌기
	//몇개든 5개의 정보가 들어있음 안에있는 for문이 5번동안,
	//0번 째 나옴! [0][1~5]
	for (int j = 0; j < cLength; j++) {
		result += arrPlane[arIndex[i]][j];
		result += j == cLength -1? "":",  ";
	}	
	result +="\n";
	//여기다가 검색결과가 연결하여 붙여짐!! 


}
	if(arIndex.length == 0) result="검색결과 없음";
	return result;
	}}
    
    

각각 기능을 만든 후에 메인에서 클래스 생성자를 이용하면 간단하게 구성할 수 있다.
차근차근 이해한 후, 혼자 수정하기 영역을 만들어보자.

profile
Gut Beginer

0개의 댓글