언어 자료구조 알고리즘/디딤돌 Java 언어 Part2 활용

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

언제나 휴일 언제나휴일 2016. 12. 10. 11:33
반응형

[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

종료합니다...

 

반응형