2021-09-02

0902 Collections, List탐구

 1. 대표적인 자료구조 : List, Set, Queue, Map

List, Set, Queue는 Collection을 상속한다. Map만 따로.

2. List의 대표격인 - ArrayList가 있다.

3. List의 하나로 Stack이 있다. Stack 은 일반적인 list관련 메소드 + pop(), peek(), empty(), push()를 지원한다. Vector클래스를 상속하고 있기 때문이다. 

4. list에서 요소를 뽑아내는 방법은 크게 세가지를 들 수 있다.

1) iterator사용 2) for(int=0;i=list.size(); i++) 3)향상된 for문 사용

effective java에서는 3)을 쓸것을 권하고 있다. 보기에도 편하고 ( 2번보다의 장점) , iterater를 썼을때 변수가 많이 만들어져서 실수할 위험도 줄어든다 (1번보다의 장점)

단 알고리즘 풀이라든지. 인덱스정보가 필요한 경우 2를 사용할 수도 있겠다. 상황에 따라 적절한 메서드를 구현하자.

5. ArrayList의 생성자

1) new ArrayList() 

2) new ArrayList(int size)

배열의 크기를 지정할 수 있다.

3) new ArrayList(다른 리스트);

단 이것은 shallow copy이므로 사용에 주의한다. clone()메서드도 마찬가지로 shallow카피를 한다. 만약에 원본 객체의 값이 달라지면 모든 리스트에 파급효과가 미친다!!! 객체 자체를 담은 게 아니라, 객체의 주소를 담은 것이기 때문이다.

그러므로 의도치 않은 파급효과를 막고싶다면 - 카피하려는 객체 자체도 cloneable을 구현해주어야 한다. 




위와같이.. 원본객체 하나만 바뀌어도 다바뀐다. 이럼 완죤 망하는 거다. ㅜㅜ 어디서 값이 바뀐건지 추적도 쉽지않다. 값이 바뀌는 지점과 확인하는 지점이 멀어지면 멀어질수록- 디버깅은 힘들어지는 것이다.... (상상만 해도 무섭다;)

---------------------------------------------------------------------------------------------
6. arrayList -> 배열로 만들기
1) String[] str = (String[]) ArrayList().toArray();
이런식의 강제 캐스팅은 실패한다. toArray의 파라메터에 아무것도 넘기지 않으면
Object[] 타입을 리턴하기 때문이다. 
여기서 유의할 점은 - String은 분명히 Object의 하위타입이 맞다.
또한 String[]은 Obejct[]의 하위타입이 맞다.
그러므로 컴파일도 잘 된다. 
막나가서 - 해당 ArrayList안에 int타입이 들어가 있었다고 치자. 근데 그래도 컴파일 잘된다!!
그러다가 런타임에서 오류가 난다... 런타임에서는 String[]으로 변하기 때문이다. 
( 이래서 배열을 쓰지말구 제네릭을 이용한 Collection클래스를 권장하는 것이다. Collection은 런타임에서 이런 타입에러를 잡아주기 때문이다.)
배열은 공변, Collection은 불공변이다.

2) 그러므로 배열로 바꾸어야 할 일이있다면
toArray(new String[0])과 같이, 원하는 타입의 파라메터를 넣어준다.
해당 배열의 크기가 ArrayList의 size보다 작을 경우, 임의로 배열을 생성해서 값을 넣어준다. 

3) 아니면 java8문법 사용한다. streams api

댓글 없음:

댓글 쓰기

0328 fdisk, mkfs, mount, fstab

 1. 하드디스크를 붙인다. 2. fdisk -l로 하드디스크를 확인한다.  - interactiive한 커맨드모드 사용하여 (m) 붙인 하드디스크의 파티셔닝을 한다.  - 마지막에 w를 해야 실제로 반영이 된다.  3. mkfs를 하여 어떤 파일시스...