쌍용 강북 교육센터 국비학원 Day 18일차
Array(배열) 와 Collection(자료구조) 의 차이점
1. 배열은 크기가 한정 되어져 있지만 Collection(구조체)은 크기가 무한정 이다.
2. 배열은 배열에 선언되어진 동일한 타입의 데이터만 입력 가능하지만 Collection은 입력되어지는 데이터가 객체 (Object)이기만 하면 어떤것이든지 입력가능하다.
3. Collection은 동일한 타입의 객체가 아니더라도 객체타입이기만 하면 모두 들어가는 저장소이다. Collection은 저장되는 크기가 자동적으로 늘어난다.
Interface | Web에서 주로 사용하는 클래스 (Single Thread 방식 - 가볍다) |
게임 프로그래밍에서 주로 사용하는 클래스 (Multi Tread 방식 - 무겁다) |
List 계열 | ArrayList | Vector |
Map 계열 | HashMap | Hashtable |
웹에서 가장 많이 사용하는 대표적인 Collection 타입은 List 계열과 Map 계열이다.
제네릭 <Generic>
※ Collection은 Object 이기만 하면 모두 입력이 가능하다. 하지만 사용할 때 특정한 데이터 타입만 꺼내오는 것은 번거롭다. 그래서 배열처럼 특정한 데이터만 입력하도록 만든것이 제네릭이다.
JDK 1.5 부터 제네릭(Generic)타입이 새로 추가되었는데, 제네릭을 이용함으로써 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있게 되었다. (즉, 저장될 객체의 타입을 제한한다)
프로그램 실행시 타입 에러가 (ClassCastException) 발생하여 작동이 멈추는 것보다는 컴파일시에 타입에러가 발생하도록 하여 사전에 방지하는 것이 좋기 때문이다.
▷ 제네릭은 쉽게 말해서 컬렉션 객체들을 저장하는 구조적인 성격을 보강하기 위해 제공하는 것이다.
▷ 제네릭을 사용하기 이전에는 컬렉션에 저장되어진 객체들을 하나씩 검출하여 객체 타입을 확인할 수 밖에 없었다. Object 로 부터 상속받은 객체는 모두 저장이 가능했던 이전의 버전들과는 달리 보다 체계적이라 할 수 있다.
▷ 제네릭을 사용함으로써 별도의 형 변환(Casting)이 필요없이 <> 사이에 선언하였던 객체자료형으로 검출되어 편리하다.
▷ 제네릭타입에 있어서 1개 글자로 된 영문대문자 아무것이나 사용해도 무관하다.
그런데 관습상 객체가 제네릭타입으로 사용될때 자료형(Type)은 <T>라고 쓰고, 어떠한 요소(Element)는 <E>라고 쓰고, key값은 <K>라고 쓰고, Value값이라고 나타내고 싶을때는 <V>라고 쓴다. <?> 와일드카드가 오는 경우 아무거나를 뜻하므로 Object와 같은 의미이다. (필요한 경우 형변환해서 사용하면 된다)
== ArrayList ==
1. 출력시 저장된 순서대로 나온다.
2. 중복된 데이터를 저장할 수 있다.
3. 데이터를 읽어오는 속도는 ArrayList 가 LinkedList 보다 상대적으로 빠르다.
4. 순차적으로 데이터를 추가/삭제하는 경우에는 ArrayList 가 LinkedList 보다 상대적으로 빠르다.
5. 일반적인 데이터 추가/삭제는 데이터 중간 중간마다 발생하므로 이러한 경우에는 ArrayList 가 LinkedList 보다 상대적으로 느리다.
6. 결과값은 ArrayList 를 사용하든지 LinkedList 를 사용하든지 동일한 결과값을 가진다.
7. LinkedList 보다는 ArrayList 를 사용하도록 하자.
== LinkedList ==
1. 출력시 저장된 순서대로 나온다.
2. 중복된 데이터를 저장할 수 있다.
3. 데이터를 읽어오는 속도는 LinkedList 가 ArrayList 보다 상대적으로 느리다.
4. 순차적으로 데이터를 추가/삭제하는 경우에는 LinkedList 가 ArrayList 보다 상대적으로 느리다.
5. 일반적인 데이터 추가/삭제는 데이터 중간 중간마다 발생하므로 이러한 경우에는 LinkedList 가 ArrayList 보다 상대적으로 빠르다.
6. 결과값은 ArrayList 를 사용하든지 LinkedList 를 사용하든지 동일한 결과값을 가진다.
List의 대표적인 메소드
.add () - 배열에 값을 추가한다.
.get () - 현재 배열에 있는 해당하는 인덱스의 값을 출력한다.
.size () - 현재 배열의 크기를 출력한다.
=== Map 계열 ===
1. HashMap 과 Hashtable 이 있다.
2. Map 계열은 List 계열처럼 index 가 사용되어 저장되는 것이 아니라, Map 계열은 key값과 value값을 쌍으로 사용하여 저장하는데 데이터 저장시 사용되는 메소드는 put (String key, Object value)메소드를 사용한다. 이 때 key값은 반드시 고유한 값을 가져야 하고, value값은 중복이 가능하다.
3. Map 계열에 저장된 key값들은 순서와는 상관없이 저장된다.
4. Map 계열에 저장된 value값을 추출하려면 key를 이용해서 가져오는데 value 값의 추출은 get (String key) 메소드를 사용한다.
=== HashSet ===
1. 출력시 저장된 순서가 유지되지 않는다.
2. 중복된 데이터를 저장할 수 없다. 중복된 요소들을 저장하지 않고자 할때 많이 사용된다.
3. Set 계열은 저장된 데이터(요소)에 접근해서 읽어오기 위해서는 Iterator를 통해서만 가능하다.
== LinkedHashSet ==
1. 출력시 저장된 순서가 유지된다.
2. 중복된 데이터를 저장할 수 없다. 중복된 요소들을 저장하지 않고자 할때 많이 사용된다.
3. Set 계열은 저장된 데이터(요소)에 접근해서 읽어오기 위해서는 Iterator를 통해서만 가능하다.
Iterator
Iterator는 자바의 컬렉션에 저장되어 있는 요소들을 읽어오는 방법을 표준화 하였는데 그 중 하나가 Iterator이다.
boolean hasNext () - 메소드는 읽어 올 요소가 남아있는지 확인하는 메소드이다. 있으면 true, 없으면 false를 반환한다.
Object next () - 남아있는 값을 읽어온다. (true라는 것은 next가 리턴할 데이터가 존재한다는 의미이다)
Iterator.remove () - iterator에서 next() 시에 읽어온 요소를 삭제한다. 반드시 next() 후에 사용해야 함
장점 - Iterator는 모든 컬렉션 프레임워크에 공통으로 사용 가능하고 쉽게 값을 가져오고 제거할 수 있음. 3개의 메소드만 알면 되어서 사용하기 매우 쉽다
단점 - 처음부터 끝까지의 단방향 반복만 가능하고, 값을 변경하거나 추가가 불가능하고 대량의 데이터를 제어할 때 속도가 느리다
'Java' 카테고리의 다른 글
쌍용강북교육센터 국비 학원 Day 19일차 Java (Properties, 와일드카드<?>, Enum) (0) | 2023.01.30 |
---|---|
Scanner 와 BufferedReader / BufferedWriter 차이점 그리고 StringBuilder에 대해서 (2) | 2023.01.30 |
쌍용강북교육센터 국비 학원 Day 17일차 Java (Exception, throws, Anonymous 익명클래스, 람다식) (0) | 2023.01.26 |
쌍용강북교육센터 국비 학원 Day 16일차 Java (static 블럭, Final, Interface) (0) | 2023.01.25 |
쌍용강북교육센터 국비 학원 Day 15일차 Java (다형성, abstract 추상화) (0) | 2023.01.20 |