[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 종료합니다... |
'언어 자료구조 알고리즘 > 디딤돌 Java 언어 Part2 활용' 카테고리의 다른 글
[Java 언어 활용] 3.9 Queue 인터페이스 (0) | 2016.12.10 |
---|---|
[Java 언어 활용] 3.8 Stack 클래스 (0) | 2016.12.10 |
[Java 언어 활용] 3.7 LinkedList 클래스 (0) | 2016.12.10 |
[Java 언어 활용] 3.6 ArrayList 클래스 (0) | 2016.12.10 |
[Java 언어 활용] 3.5 Iterator 클래스 (0) | 2016.12.10 |
[Java 언어 활용] 3.4.1 Vector를 이용하여 특정 키 순으로 보관하기 (0) | 2016.12.10 |
[Java 언어 활용] 3.4 Vector 클래스 (0) | 2016.12.10 |
[Java 언어 활용] 3.3 Collection 인터페이스 (0) | 2016.12.10 |
[Java 언어 활용] 3.2 컬렉션 (0) | 2016.12.10 |
[Java 언어 활용] 3.1 제네릭(Generic) (0) | 2016.12.10 |