[Java 활용] 3.4.2 Vector를 이용하여 인덱스로 관리하기

Vector 클래스를 사용할 때 확장 가능한 특징을 반드시 사용할 필요는 없습니다. Vector 클래스는 내부적인 저장소는 선형적인 형태이므로 특정 인덱스에 보관할 개체가 정해져 있다면 빠르게 추가, 변경, 삭제 등을 할 수 있습니다.

만약 보관할 자료에 일련 번호가 있고 최대 일련 번호가 정해져 있다면 인덱스로 관리하는 것이 처리 속도를 높이는 데 기여합니다. 먼저 Vector 컬렉션을 생성할 때 최대 일련 번호를 입력 인자를 전달하여 생성합니다. 그리고 반복문으로 최대 일련 번호 개수 만큼의 null을 추가합니다. 이는 이 후 해당 인덱스에 유효한 개체를 보관한 것인지 판별하는 주요한 기준으로 사용합니다.

public MemberManager(){
	System.out.println("최대 회원 번호:");
	max_num = scan.nextInt();
	scan.nextLine();
	members = new Vector(max_num);
	for(int i = 0; i<max_num;i++){
		members.add(null);
	}
}

추가할 때 유효한 번호인지 확인하고 맞다면 해당 인덱스(번호 -1)에 이미 유효한 자료가 있는지 확인하여 없을 때만 생성하여 추가합니다. 이 때 사용할 메서드는 set(인덱스, 보관할 개체) 메서드입니다.

void addMember(){
	int num = 0;
	String name="";
	System.out.print("추가할 회원 번호(1~"+max_num+"):");
	num = scan.nextInt();
	scan.nextLine();
	if((num<1)||(num>max_num)){
		System.out.println("유효하지 않은 번호입니다.");
		return;
	}				

	if(members.get(num-1) != null){
		System.out.println("이미 등록한 회원 번호입니다.");
		return;
	}

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

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

삭제할 때도 대부분 비슷한 과정을 거칩니다. 만약 삭제할 인덱스에 유효한 개체가 있을 때 set(인덱스, null)을 호출하여 디폴트 값인 null로 변경합니다.

void removeMember(){
	int num = 0;
	System.out.print("삭제할 회원 번호(1~"+max_num+"):");
	num = scan.nextInt();
	scan.nextLine();

	if(members.get(num-1) == null){
		System.out.println("등록하지 않은 회원 번호입니다.");
		return;
	}	

	Member member =members.get(num-1); 
	members.set(num-1, null);
	System.out.println(member.toString()+" 삭제하였습니다.");	
}

그리고 이처럼 관리할 때 주의할 점은 전체 목록을 확인할 때입니다. 여기에서는 최대 번호 개수의 공간을 미리 만들어 놓고 null로 초기한 후에 자료를 보관할 때 유효한 개체를 생성하여 교환(set)하는 형태입니다. 따라서 각 인덱스에 있는 값이 null인지 확인하여 그렇지 않을 때만 출력합니다.

void listMember(){
	System.out.println("전체 목록");
	for(Member member : members){
		if(member != null){
			System.out.println(member.toString());
		}
	}
}

다음은 Vector를 이용하여 인덱스로 관리하는 회원 관리 프로그램 예제 코드입니다.

▷ 소스 3.6 회원 관리 프로그램 (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 = null;
	final int max_num;
	public MemberManager(){
		System.out.println("최대 회원 번호:");
		max_num = scan.nextInt();
		scan.nextLine();
		members = new Vector(max_num);
		for(int i = 0; i<max_num;i++){
			members.add(null);
		}
	}
	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("추가할 회원 번호(1~"+max_num+"):");
		num = scan.nextInt();
		scan.nextLine();
		if((num<1)||(num>max_num)){
			System.out.println("유효하지 않은 번호입니다.");
			return;
		}				
		
		if(members.get(num-1) != null){
			System.out.println("이미 등록한 회원 번호입니다.");
			return;
		}	

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

		Member member =new Member(num,name); 
		members.set(num-1, member);
		System.out.println(member.toString()+" 생성하였습니다.");		
	}
	void removeMember(){
		int num = 0;		
		System.out.print("삭제할 회원 번호(1~"+max_num+"):");
		num = scan.nextInt();
		scan.nextLine();
		
		if(members.get(num-1) == null){
			System.out.println("등록하지 않은 회원 번호입니다.");
			return;
		}	

		
		Member member =members.get(num-1); 
		members.set(num-1, null);
		System.out.println(member.toString()+" 삭제하였습니다.");	
	}
	void searchMember(){
		int num = 0;		
		System.out.print("검색할 회원 번호(1~"+max_num+"):");
		num = scan.nextInt();
		scan.nextLine();
		
		if(members.get(num-1) == null){
			System.out.println("등록하지 않은 회원 번호입니다.");
			return;
		}
		
		Member member =members.get(num-1);
		System.out.println("검색 결과>>"+member.toString());
		
	}
	void listMember(){
		System.out.println("전체 목록");
		for(Member member : members){
			if(member != null){
				System.out.println(member.toString());
			}
		}
	}
}
//Program.java
//Vector를 이용하여 인덱스로 관리하기
public class Program {
	public static void main(String[] args){		
		MemberManager mm = new MemberManager();
		mm.Run();
	}
}

▷ 소스 3.6 실행 결과

최대 회원 번호:
10
1:추가 2:삭제 3:검색 4:목록 0:종료
1
추가할 회원 번호(1~10):4
회원 이름:홍길동
번호:4 이름:홍길동 생성하였습니다.
1:추가 2:삭제 3:검색 4:목록 0:종료
1
추가할 회원 번호(1~10):2
회원 이름:을지문덕
번호:2 이름:을지문덕 생성하였습니다.
1:추가 2:삭제 3:검색 4:목록 0:종료
1
추가할 회원 번호(1~10):6
회원 이름:강감찬
번호:6 이름:강감찬 생성하였습니다.
1:추가 2:삭제 3:검색 4:목록 0:종료
4
전체 목록
번호:2 이름:을지문덕
번호:4 이름:홍길동
번호:6 이름:강감찬
1:추가 2:삭제 3:검색 4:목록 0:종료
2
삭제할 회원 번호(1~10):4
번호:4 이름:홍길동 삭제하였습니다.
1:추가 2:삭제 3:검색 4:목록 0:종료
4
전체 목록
번호:2 이름:을지문덕
번호:6 이름:강감찬
1:추가 2:삭제 3:검색 4:목록 0:종료
3
검색할 회원 번호(1~10):6
검색 결과>>번호:6 이름:강감찬
1:추가 2:삭제 3:검색 4:목록 0:종료
0
종료합니다...