Collection Framework

  • Collection: 데이터 그룹
  • Framework: 일을 하기 위한 틀 = 표준화가 가능하다

List Interface

  • 순서 O
  • 데이터 중복 허용 O
  • 예시: 대기표 명단 (은행 번호표)
  • 구현체: ArrayList, Vector, Stack, LinkedList

ArrayList

  • ArrayList: 길이를 한번 정하면 변경이 불가하다는 배열의 단점 보완
  • 비동기 -> 속도 빠름
  • 장점: 인덱스를 통해 데이터 접근을 빠르게 할 수 있다.
  • 단점: 삭제가 일어나면 앞으로 다 땡겨와야되서 안 좋음.

메소드

  • add() -> 객체를 추가한다
  • remove() -> 객체를 제거한다
  • get(int index) -> index번째 객체를 얻어온다.
  • set(int index, Object obj) -> index번째 객체를 교체한다.

예시

  • ArrayListTest.java
//1. Create
//왼쪽: 인터페이스 타입 ||| 오른쪽: 구현체 타입
List<Integer> list1 = new ArrayList<>();
list1.add(new Integer(5)); //List는 add를 실패할일이 없는데 boolean을 반환, 맨날 true, 왜 이렇게할까? -> set메서드에서 알게될고양
list1.add(2); //매개변수로 Integer타입을 원하지만 정수를 입력해도 자동으로 Integer타입으로 변환됨 -> 오토박싱 (wrapper 클래스만 해당)
list1.add(3);
list1.add(1);
list1.add(4);

List<Integer> list2 = new ArrayList<>(list1.subList(1, 4)); //list1에 있는 애들을 복사해서 list2에 넣어줌, 매개변수로 collection넣을 수 있음
System.out.println(list1); //toString() 오버라이드됨. list1.toString()
System.out.println(list2); 

//2. Read
int a = list1.get(2); //unboxing: list1.get(2)는 List의 generic type이 Integer이기때문에 Integer를 반환하지만 unboxing이 일어나 int에 담을 수 있음
System.out.println(a); //3. [5,2,3,1,4]

//3. Delete
list1.remove(2);
System.out.println(list1); // [5,2,1,4] -> 2번방빠지고 앞으로 땡겨오면서 인덱스번호 바뀜

//4. Update
int change = new Integer(10);
int before = list1.set(1, change); // [5,2,1,4] 에서 1번방의 기존값 before를  change으로 바꿔라
System.out.println("바뀌기 전 : " + before + ", 바뀐 값 : "+ change);
System.out.println(list1); // [5,10,1,4]

//그동안 정렬하느라 고생하셨습니다.
//정렬해주는 메서드가 있어요....
Collections.sort(list1); //매개변수로 list만 받음, list타입만 sort가능 ★
System.out.println(list1);

LinkedList

  • 비동기
  • 자신의 데이터와 다음 데이터의 주소(꼬리)를 가지고 있다.
  • 이전 요소를 찾을 수가 없다.
  • 장점: 중간에 삭제가 일어나도 다음 데이터와 연결해주면 된다.
    • insert, delete가 중간에 일어날 때 ArrayList대신 쓰면 좋다.
  • 단점: 데이터를 찾을때 맨앞부터 주소꼬리 찾아서 가야하기때문에 오래걸린다.

DoubleLinkedList

  • 자신의 데이터와 이전 데이터의 주소, 다음 데이터의 주소를 가지고 있다.
  • Linked도 로드시 시간이 오래걸리는데 DoubleLinked는 더 걸려서 잘안씀

Stack ★

  • 자바 자료구조 필수 지식 !!
  • First In Last Out : FILO

메서드

  • Stack용 메서드이기때문에 List로 주면 이거 못씀. Stack용 객체 생성해야함
  • push() : 객체추가
  • pop() : 객체추출 (꺼내면 사라짐)
  • search() : 원하는 객체를 찾는다 (위치반환, 못찾으면 -1반환)
  • peek() : 가장 위의 객체를 가져온다 (반환)

예시

  • StackTest.java
Stack<String> s = new Stack<>(); //List로 만들면 Stack용 메서드(push,pop,search,peek) 못 씀!

s.push("0"); //<>(generic type)을 string으로 주었기때문
s.push("1");
s.push("2");
System.out.println(s.pop()); //2
System.out.println(s.pop()); //1
System.out.println(s.pop()); //0
System.out.println(s.pop()); //EmptyStackException

//몇개들었는지 모르니 for문으로 꺼낼수 없음
//-> 끝을 모르니 while 사용!
while(!s.empty()){
	System.out.println(s.pop());
}

Queue Interface

  • 구현체: LinkedList
  • First In First Out : FIFO

메서드

  • offer() : 추가
  • poll() : 추출

예시

  • StackTest.java
Queue<String> qu = new LinkedList<>(); //Queue는 인터페이스니 객체생성 불가, Queue를 구현한 LinkedList로 이용
qu.offer("0"); //qu.add로 하면 List처럼 들어가서 안된다 ★그럼왜안되는데?
qu.offer("1");		
qu.offer("2");
while(!qu.isEmpty()){
	System.out.println(qu.poll());
}

Set Interface

  • 순서 X
  • 데이터 중복 허용 X
  • 예시: 집합 (양의 정수의 집합, 소수의 집합)
  • 구현체: HashSet, TreeSet(검색속도 ↑: 1~10 이진트리로 숫자찾을때 생각해봐)

HashSet

메서드

  • 새로운 요소를 추가하기 위해 add, addAll메서드를 사용시 중복 추가가 되지 않는다.
    • 중복추가 시도하면 실패 -> 반환타입 false

예시

  • HashSetTest.java
Set<Integer> se = new HashSet<>();

for (int i = 0; i < 10; i++) {
	int random = (int)(Math.random()*35+1);
	boolean result = se.add(random);
	System.out.println(result);
}

System.out.println(se);

//정렬
//1. set -> list
List<Integer> list = new ArrayList<>(se);
Collections.sort(list); //list만 들어간다
System.out.println(list);

Map <키,값>

  • 키와 값을 가진다

  • 순서 X

  • 키-데이터 중복 허용 X, 값-데이터 중복 허용 O

  • 예시: <지역, 지역번호> 충남은 모두 041 를 쓰지만 충남 여러도시, 우편번호

  • 구현체: HashMap(요즘), HashTable(옛날), TreeMap(검색용도), Properties

HashMap

  • 키와 값이 type으로 Object형태이지만 일반적으로는 키의 경우는 String타입으로 사용한다. (밸류는 그대로 Object)

메서드

  • put(,) : 객체 추가
  • get(키) : 원하는 객체의 값을 가져온다
  • 업데이트는 없음 : 인서트가 업데이트도 함께함
  • remove(키) : 그 키를 가진 모든 애들이 지워짐

예시

  • MapTest.java
Map<String, Integer> param = new HashMap<>();
param.put("치치", 100); //auto-boxing
param.put("근듀", 60);   //auto-boxing
param.put("추추", -15);   //auto-boxing
System.out.println(param.put("꼰듀", 10)); //기존에 같은 키가 없으니 null에서 10으로 교체. 원래있던값 null 반환 
System.out.println(param.put("꼰듀", 500));  //10에서 500으로 교체하고 키가 이미 있던 10 반환 

//R
int ju = param.get("꼰듀");
System.out.println(ju);

//D
System.out.println(param);
System.out.println(param.remove("꼰듀"));	//이사람이 이런값을 가지고 있었는데 삭제되었습니다... -> 초프..?
System.out.println(param); 

Map<String, String> mem = new HashMap<>(); //Map<list,object,set별거별거 다들어감>
//한명의 정보를 다 가지고 다니려고 바구니를 만들었어요: VO
//로그인시 체크할 사항: ID, PW -> 한사람꺼 다 들고 다닐 필요 없이 매개변수 2개만 필요해요
//근데 2개도 많은거 같아서 ID, PW를 한번에 mem에 김은대의 정보만 저장할 거에요

//id: a001 | pw: asdfasdf
mem.put("MEM_ID","a001");
mem.put("MEM_PW","asdfasdf");

Map<String, String> mem2 = new HashMap<>();
mem2.put("MEM_ID","a002");
mem2.put("MEM_PW","ttt");

System.out.println(mem);
System.out.println(mem2);

/*
SELECT *
  FROM MEMBER
 WHERE MEM_ID = mem.get("mem_id")
   AND MEM_PW = mem.get("mem_pw");
*/
profile
갈 길이 멀다

0개의 댓글