열심히 끝까지

디바이스 융합 자바(Java) day13 - 컬렉션 프레임워크(List,Set,Map) 본문

디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(수업내용)

디바이스 융합 자바(Java) day13 - 컬렉션 프레임워크(List,Set,Map)

노유림 2022. 6. 23. 19:28

[오늘 수업]
[ 컬렉션 프레임워크 ]
             ㄴ> 프레임워크 : 틀, 뼈대

   - 제작자 편의성이 증가된다. 
     >> 만드는 사람이 편하다!(개발자를 위한 것)

   - 틀과 뼈대를 기업이 제대로 제공해주면?
     >> 유지보수가 용이하다

   - 제작자들의 실력 상향평준화가 된다.
     >> 좋은 틀(프레임워크)이 잡혀있으면(제공받으면)
          그 틀을 제작자(개발자)가 배운다
     >> 배우면서 제작자(개발자)의 실력이 증가한다.

   >> 프레임워크의 "사용법"이 중요하다!(써먹는 법이 중요)
     : 언제, 어떻게해야 효율적으로 사용하는지를 연구하는 것이 중요
     : 메서드 자체를 공부하는 것이 아니다!!
          >> 언제 사용해야하는지? 어떻게 사용해야하는지? 
                등을 연구하는 것이 중요하다!

ex ) List, Map, Set(집합), Stack(자료구조), Queue(자료구조) ...
     >> 자료구조 컬렉션을 잘 배워놓고 기억해 놓을 것
     >> 웹 개발하는 사람들은 List, Map을 더 잘 배워놓는 것이 중요
     >> 리스트, 맵, 셋 .. 중에서 리스트 많이 사용


    >> 다하기에는 너무 많고 불편....
         > 수업에서는 List, Map, Set를 다루고
            코딩테스트에 사용되는 Stack, Queue는 강사님 블로그에 올려놓을테니
            공부하고싶은 사람들은 볼 것

[ List ] 
    // 오늘의 진도 
    // 별로 중요하지 않지만 그냥 기본 내용이라 일단 설명
    // 외울 필요는 없을 거 같다

    List 종류
      - 배열 리스트 ArrayList
           : 배열을 기반으로 하는 인덱스(Index)를 사용하는 구조
           : 탐색을 자주하는 프로그램과 주로 사용

      - 연결 리스트 LinkedList
           : 주소를 직접 연결하는 구조(주소-주소 직접 연결)
           : 데이터 변경(추가, 삭제 등)이 자주 발생하는 프로그램과 주로 사용

    >> 1초, 데이터가 크지 않기 때문에 로직은 내려놓고 쉽고 간편한 
         배열 리스트를 공부할 예정!

----------------------
      ArrayList al = new ArrayList(); 
      // Scanner, Random처럼 java.util의 ArrayList야! 라고 정의
           al. 찍으면 다양한 메서드 출연!
           >> 어떤 메서드인지 기억하고 쓸 수 있으면 된다!
           >> 구조 공부가 아닌 작업이 가능한지 안되는지,
           >> 언제 쓸 수 있는지 그 작업이 있는지 없는지 


   
[ArrayList]
배열                                               vs      배열 리스트
크기가 분명히 정해져 있어야만 한다             요소를 계속 추가할 수 있다
   == 요소의 크기                                        == al.size(); 요소의 크기 출력

-----------예시

package class01;
import java.util.ArrayList;
class A{
	int a;
	int b;
	A(int a, int b){
		this.a = a;
		this.b = b;	
	}
	@Override
	public String toString() {
		return "A 클래스로 만든 객체";
	}	
}
public class Test01 {
	public static void main(String[] args) {
		// 컬렉션 프레임워크 
		// [ArrayList]
		// 모르는데 쓸 수 있나요? "배열이 기반인 리스트"
		// 배열의 3요소가 정의되어 있지 않다 => 자료형 정의 x, 요소의 개수도 정의 x
		// 이 것들 없이도 쓸 수 있다!
		ArrayList al = new ArrayList(); 
		// Scanner, Random처럼 java.util의 ArrayList야! 라고 정의
		System.out.println(al.toString()); 
		// toString()이 오버라이딩 된 상태!
		// al.toString 옆에 오버라이딩 된 것을 볼 수 있다
		//  >> Abstract Collection이 ArrayList의 부모다!
		al.add(10); // al.add는 오버로딩되어 있다.
		al.add(20);
		System.out.println(al);
		al.add(0, 30); // 순서 지정 가능 
		// 배열리스트명.add(순서, 넣고싶은 것 입력)
		System.out.println(al);
		// al.clear(); // 값을 초기화
		// System.out.println(al);
		System.out.println(al.get(0)); 
		// al.get(숫자); <- 숫자의 인덱스 번호에 어떤 값이 있는지 출력
		System.out.println(al.get(1));
		// is나 has로 시작하면 가지고 있니?
		System.out.println(al.isEmpty());
		// 배열이 비어있니?를 물어보는 것
		al.remove(0); // 인덱스 0번 삭제
		System.out.println(al);
		System.out.println(al.size());
		al.remove(1); 
		System.out.println(al);
		System.out.println(al.size());
		// 제약없이 다 넣을 수 있다!
		al.add(3.14);
		al.add("apple");
		al.add(new A(-1, -2)); // 만든 클래스도 넣는 것 가능!
		A a = new A(1, 2);
		al.add(a);
		System.out.println(al);
	}
}

 

 * 배열 - 자료형 고정, 크기 고정
 * ArrayList - 자료형 자유, 크기 자유
       -> int만 다뤄야하는 상황에서..
       -> double을 막을 수 없다...
 배열류 -> 관련있는 / 같은 타입이고 / 일정한 크기를 갖는
               것이 배열의 기본 3요소인데..

>> 이 것들을 타파하고자 만든것
   "제네릭"  " <> "
  >> 컬렉션에 저장될 데이터들 타입(자료형)을 "강제"
  >> 모든 컬렉션에 제네릭을 추가하여 사용할 것!!!
  
ex ) 
ArrayList<Integer> al1 = new ArrayList<Integer>();
// <자료형> 넣어서 넣을 수 있는 자료형 강제!
al1.add(10);
System.out.println(al1);
System.out.println(al1.get(0));

제네릭 설정 안할 시------
ArrayList data = new ArrayList();
for(int i = 0; i < data.size(); i++) {
        // data.get(i) == Person 객체
        data.get(i); // << 원래라면 i 사용 가능 하지만 작동이 안한다..
        Person p = (Person)data.get(i);
        p.use();
}
제네릭 설정 후----------
ArrayList<Person> data = new ArrayList<Person>();
for(int i = 0; i < data.size(); i++) {
          // data.get(i) == Person 객체
         data.get(i);
}
---------------
위를 통해 알 수 있는 사실!

제네릭을 통하면 작동이 안 될 수도 있는 것이 작동한다.
직접 만든 클래스도 설정 가능하다!!
상속받은 클래스 중에서
부모만 받으라고 했을 때 자식이 오면 가능하지만
자식만 받으라고 했을 때 부모가 오면 불가능하다.

 

--------------
Set 집합
  - Set은 추상클래스여서 객체 생성이 불가하다
  - 그래서 Set을 받는 클래스 중에서 제일 대표적인 HashSet이 많이 쓰인다.
  
   : 중복된 데이터를 허용하지 않는다!
       ex ) 여행지와 관련된 단어 기록
             해변 바다 낚시 산 바다<- 중복되면 제거!
       - 데이터 분석할 때 대부분 파이썬 쓴다.
       - 카운팅 하는 애가 따로 있다(컬렉션)
   : 집합 데이터들의 순서는 따로 없다
   : 중복된 데이터들은 따로 저장을 안한다
         - 그래서 s.size로 출력하면 중복된 것은 제외하고 뜬다.
         ex ) 1 1 1 3 4 5  -> 출력 : 1 4 3 5 size 4

 

package class06;
import java.util.HashSet;
import java.util.Set;
public class Test05 {
	public static void main(String[] args) {
		// Set 집합
		// 중복된 데이터를 허용 xxx
		// 추상클래스 객체 생성 불가!
		// Set을 받는 클래스 중 제일 대표적인 HashSet!
		// 집합 데이터들의 순서는 xxx
		Set s = new HashSet(); // HashSet이 제일 많이 쓰인다
		// 집합을 만들고 싶은데 그 중에 HashSet을 쓸꺼야!(다른 Set도 가능하다)
		// HashSet s = new HashSet(); 이라고 써도 된다. 의미의 차이가 있을 뿐 상관 없다!
		s.add(10);
		s.add(10);
		s.add(10);
		s.add(20);
		s.add(20);
		s.add(1);
		s.add(2);
		s.add(3);
		s.add(4);
		s.add(5);
		System.out.println(s);
		System.out.println(s.size());
	}
}

===================
마지막 컬렉션
Map 맵
ex ) 위에 자판기
         1. 콜라
         2. 사이다(칠성)
         3. 웰치스
         4. 사이다(500)
         5. 사이다(스프라이트)
        -----------------------
         콜라     101
         사이다  102
         웰치스  107
         환타     132
         커피     201
                  > 유효한 값을 찾을 수 있게 해주는 "키 값"
                 >> "값"과 "키 값"을 함께 저장
                         == 1쌍의 데이터를 함께 저장
      or
         홍길동(같은 이름을 가진 사람들) 구분 법
         홈페이지 -> "아이디"
         국가 -> "주민등록번호" 부여하여 관리
         학교 -> 학번
         학원 -> 수강번호

   >> 데이터들을 다룰 때에는
         A 데이터와 B(A와 특성이 유사한)데이터를 
        구분하기 위한 값이 반드시 필요!
              -> 기본키P(rimary)K(ey)  ID 고유한 값
                   고유하다는 것?
                       : NULL 값이 아니고 나만이 유일한 값  

            > 유효한 값을 찾을 수 있게 해주는 "키 값"
                 >> "값"과 "키 값"을 함께 저장
                         == 1쌍의 데이터를 함께 저장
    
           > HashMap 자주 이용
                 >> 맵은 유효한 값인 value(사이다, 콜라...)를 key(102, 101..)
                      같이 저장한다.

           > 인덱스 대신 key값

package class07;
import java.util.HashMap;
import java.util.Map;
public class Test07 {
	public static void main(String[] args) {
		// Map 맵
		HashMap map = new HashMap();
		map.put(101, "콜라");
		map.put(102, "사이다");		
		map.put(107, "웰치스");
		System.out.println(map);
		// AL(ArrayList) : [10,20,30]
		// AL[0] == 10
		// AL[1] == 20
		// Map : {101=콜라, 102=사이다}
		// Map[101] == 콜라
		// Map[102] == 사이다
		// 인덱스 대신 키값
		System.out.println(map.get(101));
		// Map2 : {apple=사과, banana=바나나, kiwi=키위}
		// Map2[apple] == 사과
		HashMap map2 = new HashMap();
		map2.put("apple", "사과");
		map2.put("banana", "바나나");
		map2.put("kiwi", "키위");
		System.out.println(map2);
		System.out.println(map2.get("apple"));
		map2.remove("banana");
		System.out.println(map2);
	}
}
package class07;
import java.util.HashMap;
public class Test08 {
	public static void main(String[] args) {
		HashMap<Integer,String> map = new HashMap<Integer, String>();
		map.put(101, "콜라");
		map.put(102, "사이다");
		map.put(107, "웰치스");
		System.out.println(map);
	}
}