[java] Collection List

심심이·2024년 3월 3일
0

java

목록 보기
38/46

ArrayList

1. 출력시 저장된 순서대로 나온다.
2. 중복된 데이터를 저장할 수 있다.
3. 데이터를 읽어오는 속도는 ArrayList 가 LinkedList 보다 상대적으로 빠르다.
4. 순차적으로 데이터를 추가/삭제하는 경우에는 ArrayList가 빠르다.
5. 일반적인 데이터 추가/삭제는 데이터 중간 중간마다 발생하므로 이러한 경우에는 
   LinkedList 가 빠르다. 
6. 결과값은 ArrayList 를 사용하든지 LinkedList 를 사용하든지 동일한 결과값을 가진다.
7. LinkedList 보다는 ArrayList 를 사용한다. 

public class CollPractice_main_1 {
    public static void main(String[] args) {
       List my_list = new ArrayList(); //  다형성을 통해 이 인터페이스를 구현한 클래스인 ArrayList로 객체 생성 list 인터페이스는 직접 객체 생성 불가.
       System.out.println("my_list 의 크기 : " + my_list.size());// int타입, 크기 0
       my_list.add(new String("이순신"));
       my_list.add("엄정화");

       my_list.add(new Integer(98));
       my_list.add(Integer.valueOf(100));
       my_list.add(80);  // int --> Integer 로 autoBoxing 해준다.


       my_list.add(new Double(1234.5));
       my_list.add(Double.valueOf(2345.6));
       my_list.add(4345.7);  // double --> Double 로 autoBoxing 해준다.

       my_list.add(new Member());

        for(int i=0; i<91; i++) {
            my_list.add(new Member());
        }

        System.out.println("my_list 의 크기 : " + my_list.size() );
        //크기 : 100 (int 타입)

        System.out.println("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");


        for(int i=0; i<9; i++) {
            System.out.println(my_list.get(i)); // 넣기 : add, 꺼내기:get
        }// end of for-------------------------
		/*
			이순신
			엄정화
			98
			100
			80
			1234.5
			2345.6
			4345.7
			my.day18.a.collection.Member@5f5a92bb
			Exception in thread "main" java.lang.NullPointerException
		 */

        my_list.add(999); //int(primitive class) --> Integer(wrapper class) autoBoxing

        System.out.println("\n=== my_list 에 저장되어진 데이터중 정수데이터만 출력하기 === \n");


        for(int i = 0; i< my_list.size(); i++) {
            if(my_list.get(i) instanceof Integer) { // 왼의 타입이 오른쪽 타입에 들어가는지 여부 조회
                System.out.println(my_list.get(i));
            }
        }


        // end of for-------------------------
		/*
			98
			100
			80
			999
		 */


    }
}

제네릭


		// ==== Generic(제네릭) ==== //

		   원래 Collection(구조체)은 Object 이기만 하면 모두 입력이 가능하다.
		   그런데 입력은 모두 되지만 꺼내와서 사용할때가 문제가 발생한다.
		   수많은 데이터중에서 특정 데이터타입을 가지는 데이터를 꺼내오기는 정말로 귀찮은 작업을 해야만 한다.
		   그래서 배열처럼 특정한 타입의 데이터만 입력하도록 만든 것이 Generic(제네릭)이다.
		   그래야만 데이터를 꺼내올때 쉽고 명확해진다.


		   JDK 1.5 부터 제네릭(Generic)타입이 새로 추가되었는데, 
		   제네릭(Generic)을 이용함으로써 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있게 되었다. 
		   프로그램 실행시 타입 에러가 발생하여 작동이 멈추는 것보다는 컴파일시에 타입에러가 발생(comphile error)하도록 하여 
		   프로그램 실행시 에러(run time error)를 발생하지 않도록 사전에 방지하는 것이 좋기 때문이다.

		▷ 제네릭(Generic)은 컬렉션(자료구조) 즉, 쉽게 말해서 객체들을 저장(수집)하는 구조적인 성격을 보강하기 위해 제공하는 것이다.
		▷ 간단히 예를 들자면 컵이라는 특정 객체가 있다고 하자. 
		  이 컵은 물만 담을 수 있는 물컵 , 또는 이 컵은 쥬스만 담을 수 있는 쥬스 컵. 이렇게 지정해주도록 하는 것이 제네릭(Generic) 이다.    

		▷ JDK 1.5 부터 제네릭(Generic)타입이 새로 추가되면서, 특정 컬렉션(자료구조)에 저장되어질 특정한 객체 타입을 명시하여
		  실행하기전 컴파일 단계에서 특정한 객체 타입이 아니면 에러를 발생토록 하여 저장이 불가능하도록 만들었다.
		  즉, 특정 컬렉션(자료구조)에 저장되어질 객체의 타입을 제한하도록 만든 것이다.

		▷ 제네릭(Generic)타입을 사용하기 이전에는 컬렉션(자료구조)에 저장되어진 객체들을 하나씩 검출하여 객체 타입을 확인할 수 밖에 없었다.
		  Object 로 부터 상속받은 객체는 모두 저장이 가능했던 이전의 버전들과는 달리 보다 체계적이라 할 수 있다.

		▷ 제네릭(Generic)타입을 사용함으로써 별도의 형 변환(Casting)이 필요없이 <> 사이에 선언하였던 객체자료형으로 검출되어 편리하다.       

		▷ 제네릭(Generic)타입에 있어서 1개 글자로 된 영문대문자는 영문대문자 아무것이나 사용해도 무관하다.
		-- 그런데 관습상 객체가 제네릭(Generic)타입으로 사용될때 자료형(Type)이라고 나타내고 싶을때는 <T>라고 쓰고,
		어떠한 요소(Element)이라고 나타내고 싶을때는 <E>라고 쓰고, 
		key값이라고 나타내고 싶을때는 <K>라고 쓰고, Value값이라고 나타내고 싶을때는 <V>라고 쓴다.      
	*/		

	//	List<String> str_list = new ArrayList<String>();  // JDK 8 이전버전
	//	List<String> str_list = new ArrayList<>();        // JDK 8 이후버전
	//	List<> str_list = new ArrayList<String>();        // 오류!!
	//	List<> str_list = new ArrayList<>();              // 오류!!

3) 리스트, 제네릭 활용 예제

1. 객체 생성해서 회원정보 출력

   public static void main(String[] args) {
// Member 클래스의 객체만을 저장할 수 있는 ArrayList 객체 mbrList 를 생성한다.
        List<Member> mbrList = new ArrayList<>();

        // Member 클래스의 객체 7개를 생성하여 mbrList 에 저장한다.
        mbrList.add(new Member("youjs","Qwer1234$","유재석","7209101"));
        mbrList.add(new Member("eom","Qwer1234$","엄정화","6808152"));
        mbrList.add(new Member("kanghd","Qwer1234$","강호동","7006151"));
        mbrList.add(new Member("leess","Qwer1234$","이순신","0010203"));
        mbrList.add(new Member("kimth","Qwer1234$","김태희","0105064"));
        mbrList.add(new Member("kangkc","Qwer1234$","강감찬","9812301"));
        mbrList.add(new Member("kimss","Qwer1234$","김순신","0203203"));

        Member mem1 = new Member("parksj","Qwer1234$","박서준","8803201");
        Member mem2 = mem1;
        mem2.setName("이현우");

        mbrList.add(mem1);
        mbrList.add(mem2);


        // mbrList 에 저장된 회원들의 정보를 출력하도록 한다.
        for(int i=0; i<mbrList.size(); i++) {
            System.out.println(mbrList.get(i));
        }// end of for---------------------------------
		/*
		     === 유재석님의 회원정보 ===
		     1.아이디 : youjs
		     2.비밀번호 : Qwer1234$
		     3.성명 : 유재석
		     4.주민번호 : 7209101
		     5.성별 : 남
		     6.만나이 : 51

		     === 엄정화님의 회원정보 ===
		     1.아이디 : eom
		     2.비밀번호 : Qwer1234$
		     3.성명 : 엄정화
		     4.주민번호 : 6808152
		     5.성별 : 여
		     6.만나이 : 55

		     ......................
		 */
        System.out.println("\n#########################################\n");
		// mbrList에 저장되어진 모든 회원들의 정보 출력
        for(Member mbr : mbrList) {
        	//제네릭 - 변수이름 / 리스트
            System.out.println(mbr);
        } 

2. 예제

		 
		 System.out.println("\n[퀴즈1] mbrList 에 저장되어진 모든 회원들중에 여자만 정보를 출력하세요 \n"); 
		 
		 for(Member mbr : mbrList) {
			 if("여".equals(mbr.gender())) {
				 System.out.println(mbr);
			 }
		 }
		 
		 System.out.println("\n[퀴즈2] mbrList 에 저장되어진 모든 회원들중에 성이 김씨인 회원만 정보를 출력하세요 \n");
		 
            if( "김".equals( mbr.getName().substring(0, 1) ) ) {
                System.out.println(mbr);
            } else {
                System.out.println("김씨는 없습니다.");
            }
        }

		 
		 
		 System.out.println("\n[퀴즈3] mbrList 에 저장되어진 모든 회원들중에 이름이 순신인 회원만 정보를 출력하세요 \n");
		 
		 boolean is_existence = false;
		 
		 for(Member mbr : mbrList) {
			 if(mbr.getName().endsWith("순신")) {
				 is_existence = true;
				 System.out.println(mbr);
			 }
		 }
		 
		 if(!is_existence) {
			 System.out.println("이름이 순신인 회원은 없습니다.");
		 }
		
		 

1) List에 새로운 객체 추가하기

        mbrList.add(new Member("seolh", "Qwer1234$", "설현", "9910102"));
        //index 값이 없으면 mbrList의 맨 뒤에 추가된다.

        System.out.println( mbrList.get(mbrList.size() - 1) ); //mbrList의 크기 -1 (== 마지막 인덱스번호) 정보 출력
        


2) 특정 인덱스 번호에 새로운 객체 추가하기

	mbrList.add(3, new Member("chaew","Qwer1234$","차은우", "0104053"));
	//          3이 특정 index 번호 
	// 유재석(0) 엄정화(1) 강호동(2) 이순신(3) 으로 되어있었는데
	// 유재석(0) 엄정화(1) 강호동(2) 차은우(3) 이순신(4) 으로 된다.

3) List에서 객체 삭제하기

        System.out.println(">> 삭제하기 전 mbrList.size() => " + mbrList.size() +"\n");
        // >> 삭제하기 전 mbrList.size() => 10

        mbrList.remove(3);  // mbrList.remove(삭제할 Member 객체의 인덱스 번호);
        // 3번(4번째) 인덱스 삭제

        System.out.println(">> 삭제한 후 mbrList.size() => " + mbrList.size() +"\n");
        // >> 삭제한 후 mbrList.size() => 9

4) 특정 객체를 삭제한 후 나머지 정보 출력하기

        mbrList.add(new Member("leesk","Qwer1234$","이승기", "9410101")); // 이승기 회원 객체 추가
        mbrList.add(new Member("leedw","Qwer1234$","이동욱", "9612101")); // 이동욱 회원 객체 추가

        System.out.println("\n[퀴즈5] mbrList에 저장되어진 Member 객체들 중에서"
                + "name이 \"이\"로 시작하는 회원들만 삭제한 후 모든 회원들의 정보를 출력하시오.");

        for(int i = mbrList.size() -1; i>=0; i--) { // size의 끝(인덱스 마지막 번호, 인덱스는 0에서부터 시작)에서부터 삭제
            if("이".equals(mbrList.get(i).getName().substring(0, 1) ) ) {
                mbrList.remove(i);
            }
        }
        for (Member mbr : mbrList) {
            System.out.println(mbr);
        }
---------------------------------------------------------------------

     
	     System.out.println("\n[퀴즈4] mbrList 에 저장되어진 모든 회원들중에 남자만 모두 삭제한 후 모든 회원의 정보를 출력하세요 \n"); 
	     
	     // ==== 만약에 index 0번이 남자(남자1), index 1번이 남자(남자2), index 2번이 여자(여자1), index 3번이 남자(남자3), index 4번이 여자(여자2) 이라면 
	     // >>> !! 잘못된 풀이 !! <<< // 
	  /*
	     for(int i=0; i<mbrList.size(); i++) {
	    	 if("남".equals(mbrList.get(i).gender())) {
	    		 mbrList.remove(i);
	    		 
	    		 //  remove 를 앞에서 부터 하는 경우이다.
	    		 //  i 는 0 부터 시작해서 매번 1씩 증가한다.
	    		 //  index 0번이 남자이므로 삭제가 되어지면서 mbrList 는 
	    		 //  index 0번이 남자(남자2), index 1번이 여자(여자1), index 2번이 남자(남자3), index 3번이 여자(여자2) 으로 된다.
	    		     
	    		 //  i 는 1 이 되어진다. 그러면 검사해야할 대상이 i 가 1인 즉, index 1번인 것을 남자인지 여자인지 검사를 하게 된다.
	    		 //  그래서 index 0번이 남자(남자2)는 삭제되지 않고 그대로 남게 된다. 
	    		 
	    	 }
	     }// end of for---------------------------------
	   */  
	     
	    // >>> !! 올바른 풀이 !! <<< // 
	  // ==== 만약에 index 0번이 남자(남자1), index 1번이 남자(남자2), index 2번이 여자(여자1), index 3번이 남자(남자3), index 4번이 여자(여자2) 이라면
	    for(int i=mbrList.size()-1; i>=0; i--) {
	    	if("남".equals(mbrList.get(i).gender())) {
	    		 mbrList.remove(i);
	    		 // i 가 4 부터 시작해서 1씩 감소하면서 0 까지 반복한다.
	    		 // 맨처음에는 index 4번인 것을 찾아서 남자인지 여자인지 검사를 한다.
	    		 // 여자이므로 삭제를 안한다.
	    		 
	    		 // i 가 3 ==> index 3번인 것을 찾아서 남자인지 여자인지 검사를 한다.
	    		 // 남자이므로 삭제를 한다.
	    		 // mbrList 는 
	    		 // index 0번이 남자(남자1), index 1번이 남자(남자2), index 2번이 여자(여자1), index 3번이 여자(여자2) 이 된다.
	    		 
	    		 // i 가 2 ==> index 2번인 것을 찾아서 남자인지 여자인지 검사를 한다.
	    		 // 여자이므로 삭제를 안한다.
	    		 
	    		 // i 가 1 ==> index 1번인 것을 찾아서 남자인지 여자인지 검사를 한다.
	    		 // 남자이므로 삭제를 한다.
	    		 // mbrList 는 
	    		 // index 0번이 남자(남자1), index 1번이 여자(여자1), index 2번이 여자(여자2) 이 된다.
	    		 
	    		 // i 가 0 ==> index 0번인 것을 찾아서 남자인지 여자인지 검사를 한다.
	    		 // 남자이므로 삭제를 한다.
	    		 // mbrList 는 
	    		 // index 0번이 여자(여자1), index 1번이 여자(여자2) 이 된다. 
	    	}	 
	    }// end of for----------------------
	     



        
        

5) 전체 List 삭제하기

mbrList.clear();
		
System.out.println(">> 삭제한 후 mbrList.size() => " + mbrList.size() +"\n");
// >> 삭제한 후 mbrList.size() => 0

my.day18.a.collection에서 작업

profile
개발하는 심심이

0개의 댓글

관련 채용 정보