-
221219 자바 11. 컬렉션 프레임워크 (List, Set, Map)스타터스 백엔드 3기 2022. 12. 19. 14:42
하루입니다.
리뷰!!!
java.lang, java.util 패키지
java.lang.Object toString(), equals() overriding 해서 사용하자. java.lang.Integer
(Wrapper class)
기본형 변수를 참조형 변수로 변환하는 것이다. 이는 연산자를 미리 제공하여 메소드를 구현하는 것을 뜻한다.
int i 는 + - * % 등 사용 가능하다.
Integer in은 메소드에 사용 가능하다.java.lang.String
문자열 관련 가장 많은 메소드를 가지고 있다.
- 문자열에서 + 연산자를 사용할 때는 StringBuffer()를 사용하자.
- split("정규표현식") return String[]
- join("분리자", String[]) return Stringjava.lang.StringBuffer() 문자열 변경이 자주 일어난다면 사용하자. java.util.StringJoiner 문자열 분리 특화 메소드 java.util.Math
- FINAL 클래스라서 상속 불가하다.
- staic 메소드 + static 변수를 사용하기에, 객체 생성 없이 사용 가능하다.
- MATH.XXXX 로 사용 가능함
- MATH.random() 은 0.0이라서 형변환 하고 + 1도 해줘야 함.java.util.Random
Ramdom r = new Random();
e.nextInt(100); 1에서 100까지의 난수 생성java.util 패키지, java.text 패키지
java.util.Date
날짜와 시간을 나타낸다.
Date d = new Date();
대부분 메소드가 deprecated다. 사용을 자제하자.java.util.Calender
국가마다 시간이 달라서 추상 클래스를 사용한다.
Calender cal = Calender.getInstance();
cal.get(Calender.YEAR);
cal.set(2022, 11, 22 ... ) index 기준이니까 11이라고 적어야 12월이다.
Date d = cal.getTime();
Date da = new Date();
cal.setTime(da);java.text.DecimalFormat
# : 의미있는 0만 // 31.4
0 : 의미없는 0도 // 31.40java.text.SimpleDateFormat
SimpleDateFormat sf = new SimpleDateFormat();
java.util 패키지
문자열을 효율적으로 / 날짜와 시간 / 컬렉션 프레임워크
컬렉션 프레임워크
- 컬렉션(여러 데이터 저장) 프레임워크(규칙을 가지며 내부에서 사용된다)
- public interface Collection<E> extends Iterable<E> {
interface List interface Map interface Set - 데이터 저장에 순서 있다.
- 데이터 저장 중복 가능하다.
- index, value
- 데이터 = (key, value)
- 데이터 저장에 순서 없다.
- 같은 데이터 value 저장 가능하다.
- 같은 데이터 key 저장 가능하다.
- { key, value }- 데이터 저장에 순서 없다.
- 데이터 중복 저장 불가하다.
- valueimplements List
extends Collectionimplements Map implements Set
extends Collection- LinkedList
- ArrayList
- xxxList- HashSet
- TreeSet- HashMap
- HashTable
- properties
자바의 컬렉션 프레임워크
배열 (컬렉션 아님 복습하는 거임)
- 배열 길이는 고정되고, 수정이 불가하다.
- 만약 int[] a = new int[5]; a = new int[10]; 이라고 해도, 5개 배열 100번지 하나 만들어지고 10개 배열 200번지 하나 만들어지고 이렇게 된다. 수정이 아님.
- 길이를 정하고 시작한다.
- 동일한 타입의 데이터만 저장할 수 있다.
- 형변환이 가능하다.
1. List - ArrayList
- 데이터타입 한정 X
- 갯수 한정 X
- 최초의 갯수는 10개이다. 동적으로 크기가 변동된다.
- 참조형변수 데이터만 저장한다. 기본형변수는 참조형변수로 변환하여 저장한다.
ArrayList list = new ArrayList( ); ==> 10개 데이터 저장 갯수 생성, 10개씩 증가
ArrayList list = new ArrayList(5); ==> 5개 데이터 저장 갯수 생성, 5개씩 증가
ArrayList list = new ArrayList(5,2); ==> 5개 데이터 저장 갯수 생성, 2개씩 증가
Integer in = i; ==> 기본형변수를 참조형변수로 변환
메소드
저장메소드 수정 삭제 조회 add( ) set( , ) remove( ) get( )
add("java"),
add(1),
add(3.14),
add(new A())
- Object 타입으로 저장set (1, "a" ) remove( 1 ) .get( )
.size( ) int
.contatins( ) boolean
.indexOf( ) int
- Object 타입으로 returnArrayList의 추가와 삭제
1. 삭제할 데이터 아래의 데이터를 한 칸씩 위로 복사해서 삭제할 데이터를 덮어쓴다.
2. 데이터가 한칸씩 위로 이동했으므로 마지막 데이터는 NULL로 변경한다.
3. size를 1 감소시킨다.
private void fastRemove(Object[] es, int i) { modCount++; final int newSize; if ((newSize = size - 1) > i) System.arraycopy(es, i + 1, es, i, newSize - i); es[size = newSize] = null; }
자바의 컬렉션 프레임워크

0-1. List - LinkedList
ArrayList LinkedList [0][1][2][3][4] ... [n][n+1][n+2] [100 | 값]200 ==> [200 | 값]300 -> [300 | 값] 400 -> ... 순서대로 저장한다. 삽입 삭제 자주 작업할 때 사용하자. 주로 조회 수정할 때 사용한다. 조회에 비효율적이다.
자바의 컬렉션 프레임워크
queue, stack : 컴퓨터의 저장 기법 중 하나이다.
Stack Queue 바구니처럼 위로 쌓는 형태 파이프에 데이터를 넣는 형태 선입후출 (LIFO) 선입선출 (FIFO) push(); pop(); peek(); empty(); add(); remove(); element(); offer(); poll(); peek(); 자바 구현 클래스와 동일 자바 구현 인터페이스와 동일 List 계열 : 동적 크기, 중복 저장 가능 동적 크기, 중복 저장 가능 성적을 저장할 때 (중복 성적 있을 수도) 100 이하의 소수 구하기, 로또 번호 구하기 1-1. List - Stack
push( ); pop( );
- pop()은 데이터 조회 후 객체를 삭제한다. 그래야 다음 데이터 조회 가능하기 때문이다.
public static void main(String[] args) { Stack st = new Stack(); st.push(1); st.push(2); st.push(3); while(!st.isEmpty()) { System.out.println(st.pop()); } } ------------------------------------------------------------------------ 3 2 1
만약 꺼낼 객체가 없다면 뜨는 오류. Empty Stack입니다!!! peek( );
- peek()은 맨 위에 저장된 객체를 반환한다. 객체를 꺼내지 않는다.
public static void main(String[] args) { Stack st = new Stack(); st.push(1); st.push(2); st.push(3); while(!st.isEmpty()) { System.out.println(st.peek()); } } -------------------------------------------------------------------- 3 3 3 3 3 3 ... 무한루프1-2. Queue
Queue q = new LinkedList(); q.offer(1); q.offer(2); q.offer(3); while(!q.isEmpty()) { System.out.println(q.poll()); } ------------------------------------------------------- 1 2 3
자바의 컬렉션 프레임워크
2. Set - HashSet
- 중복 데이터 저장 불가 (아예 size에 추가되지 않음)
- 저장 순서 없다.
public static void main(String[] args) { HashSet lottoSet = new HashSet(6); while(true) { int ran = (int)((Math.random()*45) + 1); System.out.println(ran); lottoSet.add(ran); System.out.println("갯수 : " + lottoSet.size()); if(lottoSet.size() == 6) break; } System.out.println(lottoSet); } ------------------------------------------------------------------------ 33 갯수 : 1 16 갯수 : 2 7 갯수 : 3 11 갯수 : 4 5 갯수 : 5 16 ----------------------> 중복 갯수 : 5 11 ----------------------> 중복 갯수 : 5 10 갯수 : 6 [16, 33, 10, 11, 5, 7]Iterator
- 데이터를 반복적으로 조회하는 기능만 있는 컬렉션 종류이다.
- 데이터를 저장하거나 수정하는 게 아닌, 오로지 조회하는 것이 목표이다.
- 다음 데이터만 조회 가능하다.
Iterator it = lottoSet.iterator(); while(it.hasNext()) { System.out.print(it.next() + " "); } for(Object lotto:lottoSet) { System.out.println(lotto); } -------------------------------------------------------- 40 27 35 19 4 36 40 27 35 19 4 36
자바의 컬렉션 프레임워크
3. Map - HashMap
- key : 컬렉션 내의 key 중 유일해야 한다.
- value : key와 달리 데이터의 중복을 허용한다.
- 메소드 : .put(); ,get(); .keySet();
public static void main(String[] args) { HashMap map = new HashMap(); map.put("lee@email.com", "이길동"); map.put("kim@email.com", "김길동"); map.put("hong@email.com", "홍홍이"); map.put("hong2@email.com", "홍길동"); map.put("hong@email.com", "홍홍이"); Object o = map.get("kim@email.com"); System.out.println(map); System.out.println(o); // 키 조회 Set keys = map.keySet(); for(Object one : keys) { System.out.println("key: " + one + ", value: " + map.get(one)); } } ------------------------------------------------------ {kim@email.com=김길동, hong2@email.com=홍길동, lee@email.com=이길동, hong@email.com=홍홍이} 김길동 key: kim@email.com, value: 김길동 key: hong2@email.com, value: 홍길동 key: lee@email.com, value: 이길동 key: hong@email.com, value: 홍홍이package chap11; import java.util.HashMap; import java.util.Set; public class HashMapTest { public static void main(String[] args) { // TODO Auto-generated method stub HashMap map = new HashMap(); map.put("hong@email.com", new String[] {"홍홍홍", "010-0000-0000","02-0000-0000", "041-0000-0000"}); map.put("lee@email.com", new String[] {"이자바", "010-1111-1111"}); map.put("kim@email.com", new String[] {"김새싹", "010-2222-2222"}); map.put("hong@email.com", new String[] {"홍삼", "010-1111-1111","02-0000-0000", "041-0000-0000"}); System.out.println(map.size()); Object o = map.get("kim@email.com"); System.out.println(map); System.out.println(o); System.out.println(); // 키 조회 Set keys = map.keySet(); // key을 Set에 넣었다. Set에 있는 key들을 for문을 사용해서 빼낸다. Object 타입이다. for(Object oneKey : keys) { // map.get(key이름을 for문을 사용해 하나씩 꺼낸 것)을 사용해 나온 key 이름들을 // String 타입으로 형변환하여 String[] 배열 value에 담는다. String[] value = (String[])(map.get(oneKey)); System.out.println("key: " + oneKey); System.out.println(); for(String one : value) { System.out.print(one + " : "); } System.out.println(); } } } ------------------------------------------------------------------ 김새싹 : 010-2222-2222 : key: lee@email.com 이자바 : 010-1111-1111 : key: hong@email.com 홍삼 : 010-1111-1111 : 02-0000-0000 : 041-0000-0000 :
Arrays 기타
- Arrays.toString(arr)
- Arrays.deepToString(arr2)
- Arrays.copyOf(arr, 3)
- Arrays.copyOfRange(arr, 2, 5)
- Arrays.asList(ran);
- Arrays.sort(ran);
int[] ran = {4, 7, 2, 7, 56, 13, 28, 42}; // 오름차순 정렬 Arrays.sort(ran); System.out.println(Arrays.toString(ran)); // 타입 변환 : 배열과 ArrayList (정적이냐 동적이냐 / 동일타입이냐 다른타입가능이냐) // 배열을 ArrayList로 변환 List list = Arrays.asList(ran); // list.add(100); // List는 인터페이스타입이기에 형변환이 필요하다. 컴파일 오류는 없다. // ArrayList를 배열로 변환 ArrayList list2 = new ArrayList(5); list2.add("java"); list2.add(10); list2.add(3.14); Object[] list_arr = new Object[list2.size()]; list2.toArray(list_arr); System.out.println(Arrays.toString(list_arr));
Comparator
String[] animals = {"0-dog", "cat", ":snake", "lion"};
[0-dog, :snake, cat, lion]
String[] animals = {"Dog", "cat", "Snake", "lion"};
[Dog, Snake, cat, lion]
String[] animals = {"Dog", "cat", "Snake", "lion"};
Arrays.sort(animals, String.CASE_INSENSITIVE_ORDER);
[cat, Dog, lion, Snake]
Comparator는 앞의 객체와 뒤의 객체를 사용해서 앞의 객체가 크면 +1, 뒤의 객체가 크면 -1, 두 객체가 같으면 0을 반환한다.
System.out.println(mc.compare("abc", "def")); // 음수 (처음이 더 작다) System.out.println(mc.compare("01", "01")); // 0 (같다) System.out.println(mc.compare("b", "a")); // 양수 (처음이 더 크다) ------------------------------------------------------------------------- -3 0 1기본적으로는 오름차순이다. 내림차순으로 하고 싶다면 어떻게 해야 할까?
위의 숫자 음과 양을 바꿔주면 된다. return에 -1을 곱하자.
나만의 비교 메소드를 만들고 사용하자.
public class ComparatorTest { public static void main(String[] args) { String[] animals = {"Dog", "cat", "Snake", "lion"}; // 사전 순서 // 특수문자 > 숫자 > 대문자 > 소문자 > 한글 ==> 오름차순 Arrays.sort(animals, String.CASE_INSENSITIVE_ORDER); System.out.println(Arrays.toString(animals)); class MyComparator implements Comparator { @Override public int compare(Object o1, Object o2) { if(!(o1 instanceof String && o2 instanceof String)) { return -1; } String s1 = (String)o1; String s2 = (String)o2; return s1.compareTo(s2) * -1; } } MyComparator mc = new MyComparator(); System.out.println(mc.compare("abc", "def")); // 음수 (처음이 더 작다) System.out.println(mc.compare("01", "01")); // 0 (같다) System.out.println(mc.compare("b", "a")); // 양수 (처음이 더 크다) Arrays.sort(animals, mc); System.out.println(Arrays.toString(animals)); } } -------------------------------------------------------------------------- 오름차순 : [cat, Dog, lion, Snake] 내림차순 : [lion, cat, Snake, Dog]
ArrayListTest StackQueueTest HashSetTest ArraysTest ComparatorTest
'스타터스 백엔드 3기' 카테고리의 다른 글
221220 자바 13 (스레드, 람다) : 스레드 (0) 2022.12.20 221219. 자바 12. 제네릭 <> (0) 2022.12.19 유데미 스타터스 취업 부트캠프 3기 - 백엔드 4주차 (0) 2022.12.16 221215. 자바9. 라이브러리(String, Object) (0) 2022.12.15 221215 자바8. 예외처리 (0) 2022.12.15