[Java 활용] 3.4.1 Vector를 이용하여 특정 키 순으로 보관하기

Vector 클래스는 Collecion 인터페이스에 약속한 기능 외에도 추가적으로 제공하는 기능들이 있습니다. 내부적으로 Vector 클래스는 선형적인 저장소를 갖고 있으며 저장소의 크기를 확장할 수 있어 확장 배열이라고 볼 수 있습니다.

Vector 컬렉션에 자료를 보관할 때  add(Object ojb) 메서드를 이용하면 순차적으로 보관합니다. 그런데 Vector 클래스에서는 add(int index, Object obj) 메서드를 이용하면 원하는 위치에 자료를 보관할 수 있습니다. 만약 현재 A, B, C, D를 보관한 상태에서 add(2,F)를 호출하면 A, B, F, C, D 순으로 보관합니다. 즉 첫 번째 전달하는 인덱스 이후에 보관하고 있는 자료들을 한 칸 씩 뒤로 이동시키고 해당 위치에 자료를 보관하는 것입니다.

이를 이용하면 자료를 특정 키 순으로 정렬 상태를 유지하면서 보관할 수 있습니다. 이 때 필요한 것은 특정 키보다 크거나 같은 값을 처음으로 발견한 인덱스를 구하는 메서드입니다. 다음은 회원 관리 프로그램에서 입력한 회원 번호보다 크거나 같은 첫번째 회원 개체가 있는 인덱스를 구하는 메서드입니다. 만약 입력 인자로 받은 회원 번호보다 큰 값을 같은 회원 개체가 없으면 Vector의 size 메서드의 반환 값과 같은 인덱스를 반환합니다.

int FindMoreThan(int num){
	Member member = null;
	int cnt = members.size();
	int index = 0;
	for(index=0; index<cnt; index++){
		member = members.get(index);
		if(member.getNum() >= num){
			break;
		}
	}
	return index;
}

그리고 회원 추가 메서드에서는 이 메서드를 호출한 후에 반환한 index가 Vector의 size 메서드의 반환값과 다를 때 이미 등록한 번호의 회원 개체가 있는 인덱스인지 여부를 판별하는 작업을 하면 보다 신뢰성이 강한 프로그램을 작성할 수 있습니다.

void addMember(){
	int num = 0;
	String name="";
	System.out.print("추가할 회원 번호:");
	num = scan.nextInt();
	scan.nextLine();
	int index = FindMoreThan(num);
	if(index != members.size()){
		Member fm = members.get(index);
		if(fm.getNum() == num){
			System.out.println("이미 등록한 회원 번호입니다.");
			return;
		}
	}	
	System.out.print("회원 이름:");
	name = scan.nextLine();

	Member member =new Member(num,name); 
	members.add(index, member);
	System.out.println(member.toString()+" 생성하였습니다.");		
}

다음은 Vector에 번호 순으로 회원 개체를 보관하는 회원 관리 프로그램 코드입니다.

▷ 소스 3.5 회원 관리 프로그램 (Vector에 번호 순으로 회원 보관)

//Member.java
//회원 클래스
public class Member {
	final int num;
	String name;
	public Member(int num, String name){
		this.num = num;
		this.name = name;
	}
	public int getNum(){
		return num;
	}
	public String toString(){
		return String.format("번호:%d 이름:%s", num,name);		
	}
}
//MemberManager.java
//회원 관리자 클래스
import java.util.Vector;
import java.util.Scanner;
public class MemberManager {
	Scanner scan = new Scanner(System.in);
	Vector<Member> members = new Vector<Member>();
	public void Run(){
		int key = 0;
		while((key = selectMenu())!=0){
			switch(key){
			case 1: addMember(); break;
			case 2: removeMember(); break;
			case 3: searchMember(); break;
			case 4: listMember(); break;
			default: System.out.println("잘못 선택하였습니다."); break;
			}
		}
		System.out.println("종료합니다...");
	}
	int selectMenu(){
		System.out.println("1:추가 2:삭제 3:검색 4:목록 0:종료");
		int key = scan.nextInt();
		scan.nextLine();	
		return key;
	}
	void addMember(){
		int num = 0;
		String name="";
		System.out.print("추가할 회원 번호:");
		num = scan.nextInt();
		scan.nextLine();
		int index = FindMoreThan(num);
		if(index != members.size()){
			Member fm = members.get(index);
			if(fm.getNum() == num){
				System.out.println("이미 등록한 회원 번호입니다.");
				return;
			}
		}	

		System.out.print("회원 이름:");
		name = scan.nextLine();

		Member member =new Member(num,name); 
		members.add(index, member);
		System.out.println(member.toString()+" 생성하였습니다.");		
	}
	void removeMember(){
		int num = 0;		
		System.out.print("삭제할 회원 번호:");
		num = scan.nextInt();
		scan.nextLine();
		Member member = Find(num);
		if(member == null){
			System.out.println("존재하지 않습니다.");
			return;
		}
		members.remove(member);
		System.out.println(member.toString()+" 삭제하였습니다.");
	}
	void searchMember(){
		int num = 0;		
		System.out.print("검색할 회원 번호:");
		num = scan.nextInt();
		scan.nextLine();
		Member member = Find(num);
		if(member == null){
			System.out.println("존재하지 않습니다.");
			return;
		}
		System.out.println("검색 결과>>"+member.toString());
		
	}
	void listMember(){
		System.out.println("전체 목록");
		int cnt = members.size();
		System.out.println("회원 수:"+cnt);
		for(Member member : members){
			System.out.println(member.toString());
		}
		
	}
	Member Find(int num){
		int cnt = members.size();		
		for(Member member : members){
			if(member.getNum() == num){
				return member;
			}
		}
		return null;
	}
	int FindMoreThan(int num){
		Member member = null;
		int cnt = members.size();
		int index = 0;
		for(index=0; index<cnt; index++){
			member = members.get(index);
			if(member.getNum() >= num){
				break;
			}
		}
		return index;
	}
}
//Program.java
//Vector에 번호 순으로 보관하기
public class Program {
	public static void main(String[] args){
		MemberManager mm = new MemberManager();
		mm.Run();
	}
}

▷ 소스 3.5 실행 결과

1:추가 2:삭제 3:검색 4:목록 0:종료
1
추가할 회원 번호:3
회원 이름:홍길동
번호:3 이름:홍길동 생성하였습니다.
1:추가 2:삭제 3:검색 4:목록 0:종료
1
추가할 회원 번호:2
회원 이름:을지문덕
번호:2 이름:을지문덕 생성하였습니다.
1:추가 2:삭제 3:검색 4:목록 0:종료
1
추가할 회원 번호:4
회원 이름:강감찬
번호:4 이름:강감찬 생성하였습니다.
1:추가 2:삭제 3:검색 4:목록 0:종료
1
추가할 회원 번호:1
회원 이름:이순신
번호:1 이름:이순신 생성하였습니다.
1:추가 2:삭제 3:검색 4:목록 0:종료
4
전체 목록
회원 수:4
번호:1 이름:이순신
번호:2 이름:을지문덕
번호:3 이름:홍길동
번호:4 이름:강감찬
1:추가 2:삭제 3:검색 4:목록 0:종료
0
종료합니다...