목차
- 제네릭 클래스
- 제네릭 메서드
- 컬렉션 프레임워크의 핵심 인터페이스, 메서드
배운 내용
제네릭
정의
- 타입을 구체적으로 지정하는 것이 아니라, 추후에 지정할 수 있도록 일반화해두는 것
- 작성한 클래스 또는 메서드의 코드가 특정 데이터 타입에 얽매이지 않게 해둔 것
기능
- 단 하나의 클래스만으로 모든 타입의 데이터를 저장할 수 있는 인스턴스를 만들 수 있다.
class Basket<T> {
private T item;
public Basket(T item) {
this.item = item;
}
public T getItem() {
return item;
}
public void setItem(T item) {
this.item = item;
}
}
Basket<String> basket1 = new Basket<String>("기타줄");
제네릭 클래스
정의
T
: 타입 매개변수
<T>
와 같이 꺽쇠 안에 넣어 클래스 이름 옆에 작성해줌으로써, 클래스 내부에서 사용할 타입 매개변수를 선언
T
, K
, V
는 각각 Type, Key, Value/ E
,N
,R
는 Element, Number, Result 의미
- 클래스 변수에는 타입 매개변수를 사용할 수 없다.
- 제네릭 클래스를 인스턴스화할 때에는 의도하고자 하는 타입을 아래와 같이 지정해주어야 한다.
- 타입 매개변수에 치환될 타입으로 기본 타입을 지정할 수 없습니다.
- 기본자료형은
Wrapper Class
Integer, Double
사용
- 다형성 적용가능
- 생성자명에 포함된 오른쪽 항의 실제 제네릭 타입은 항상 왼쪽 항과 동일하기 때문에 생략가능
- 클래스를 정의하는 시점에 타입을 지정하는 것이 아니라 객체를 생성하는 시점에 타입을 지정
- 하나의 제네릭 클래스로 다양한 타입의 객체를 저장 및 관리할수 있는 객체를 생성가능
class Basket<T> {
private T item;
...
}
class Rose extedns Flower{}
Basket<Flower> flowerBasket = new Basket<>();
flowerBasket.setItem(new Rose());
제네릭 타입 범위 제한
- 정의하는 과정에서 제네릭 타입의 범위를 제한
- 특정 클래스를 상속받은 클래스만 타입으로 지정할 수 있도록 제한하는 것뿐만 아니라, 특정 인터페이스를 구현한 클래스만 타입으로 지정할 수 있도록 제한할수 있다.
- 나중에 어떤타입이 제네릭 타입 변수로 확정되더라도 항상 사용할 수 있는 메서드만 제네릭 메서드 내부에서 사용가능 → Object 클래스
- but,
<T extends String>
과 같ㅌ이 제한하면 String
객체의 멤버 사용가능
접근 지정자 class 클래스명 <T extends 최상위 클래스 / 인터페이스명> {
}
접근 지정자 <T extends 최상위 클래스/ 인터페이스명> T 메서드명(T t) {
}
제네릭 메서드
- 클래스 내부의 특정 메서드만 제네릭으로 선언 가능
class Basket<T> {
...
public <T> void add(T element) {
...
}
}
- 클래스명 옆에서 선언한 타입 매개변수는 클래스가 인스턴스화될 때 타입이 지정된다.
- 제네릭 메서드의 타입은 메서드가 호출될 때 실제 제네릭 타입을 지정
- 클래스 타입 매개변수와 달리 메서드 타입 매개변수는
static
메서드에서도 선언가능
제네릭의 상속
- 부모 클래스,메서드 가 제네릭일때 → 자식 클래스, 메서드 또한 제네릭이다(부모의 제네릭 타입 변수를 그대로 물려받음)
**컬렉션 프레임워크**
컬렉션
- 동일한 타입을 묶어 관리하는 자료구조.
- 배열과 달리, 데이터의 저장 용량을 동적으로 관리
- 모든 컬렉션의 원소에는 객체만 올 수 있다.
프레임워크
- 클래스와 인터페이스의 모임(라이브러리)
- 클래스의 정의에 설계 원칙 또는 구조가 존재
컬렉션 프레임워크
- 리스트, 스택, 큐, 트리 등의 자료구조에 정렬, 탐색 등의 알고리즘을 구조화해 놓은 프레임워크
**Collection 인터페이스**
기능 | 리턴 타입 | 메소드 | 설명 |
---|
객체 추가 | boolean | add(Object o) /addAll(Collection c) | 주어진 객체 및 컬렉션의 객체들을 컬렉션에 추가합니다. |
객체 검색 | boolean | contains(Object o) / containsAll(Collection c) | 주어진 객체 및 컬렉션이 저장되어 있는지 여부를 리턴합니다. |
| Iterator | iterator() | 컬렉션의 iterator를 리턴합니다. |
| boolean | equals(Object o) | 컬렉션이 동일한지 여부를 확인합니다. |
| boolean | isEmpty() | 컬렉션이 비어있는지 여부를 확인합니다. |
| int | size() | 저장되어 있는 전체 객체 수를 리턴합니다. |
객체 삭제 | void | clear() | 컬렉션에 저장된 모든 객체를 삭제합니다. |
| boolean | remove(Object o) / removeAll(Collection c) | 주어진 객체 및 컬렉션을 삭제하고 성공 여부를 리턴합니다. |
| boolean | retainAll(Collection c) | 주어진 컬렉션을 제외한 모든 객체를 컬렉션에서 삭제하고, 컬렉션에 변화가 있는지의 여부를 리턴합니다. |
객체 변환 | Object[] | toArray() | 컬렉션에 저장된 객체를 객체배열(Object [])로 반환합니다. |
| Object[] | toArray(Object[] a) | 주어진 배열에 컬렉션의 객체를 저장해서 반환합니다. |
List
- List는 데이터의 순서가 유지되며, 중복 저장이 가능한 컬렉션을 구현하는 데에 사용됩니다.
- ArrayList, Vector, Stack, LinkedList 등이 List 인터페이스를 구현합니다.
- 객체를 인덱스로 관리하기 때문에 객체를 저장하면 자동으로 인덱스가 부여되고, 인덱스로 객체를 검색, 추가, 삭제
List<Integer> aList1 = Arrays.asList(1,2,3,4);
기능 | 리턴 타입 | 메서드 | 설명 |
---|
객체 추가 | void | add(int index, Object element) | 주어진 인덱스에 객체를 추가 |
| boolean | addAll(int index, Collection c) | 주어진 인덱스에 컬렉션을 추가 |
| Object | set(int index, Object element) | 주어진 위치에 객체를 저장 |
객체 검색 | Object | get(int index) | 주어진 인덱스에 저장된 객체를 반환 |
| int | indexOf(Object o) / lastIndexOf(Object o) | 순방향 / 역방향으로 탐색하여 주어진 객체의 위치를 반환 |
| ListIterator | listIterator() / listIterator(int index) | List의 객체를 탐색할 수 있는ListIterator 반환 / 주어진 index부터 탐색할 수 있는 ListIterator 반환 |
| List | subList(int fromIndex, int toIndex) | fromIndex부터 toIndex에 있는 객체를 반환 |
객체 삭제 | Object | remove(int index) | 주어진 인덱스에 저장된 객체를 삭제하고 삭제된 객체를 반환 |
| boolean | remove(Object o) | 주어진 객체를 삭제 |
객체 정렬 | void | sort(Comparator c) | 주어진 비교자(comparator)로 List를 정렬 |
리스트 배열 변환 | Object[] | toArray() | 리스트를 Object 배열로 변환→저장 원소타입으로 다운캐스팅 필요 |
| T[] | toArray(T[] t) | 입력매개변수로 전달한 타입의 배열로 반환 |
- toArray(T[] t)
- list의 size() ≥ 배열의 length → list의 크기를 가진 배열 생성
- list의 size() < 배열의 length → 배열의 length크기를 가진 배열 생성
**ArrayList**
- 저장 용량을 초과하여 객체들이 추가되면, 자동으로 저장용량이 늘어나게 됩니다.
- 데이터가 연속적으로 존재
List<타입 매개변수> 객체명 = new ArrayList<타입 매개변수>(초기 저장 용량);
- 특정 인덱스의 객체를 제거하면, 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨집니다.
- 데이터를 순차적으로 추가하거나 삭제하는 경우, 데이터를 읽어들이는 경우 빠르게처리
**LinkedList**
- 데이터를 효율적으로 추가, 삭제, 변경하기 위해 사용
- 객체를 생성할 때 저장 용량 지정 불가
- 데이터가 불연속적으로 존재하며 서로 연결되어 있다. →인덱스가 아닌 앞뒤 객체의 정보를 저장
- 중간에 위치하는 데이터를 추가하거나 삭제하는 경우, 데이터를 중간에 추가하는 경우 빠르게 처리
- Prev와 Next의 주소값만 변경하면 되므로, 다른 요소들을 이동시킬 필요가 없다.
Set
- Set은 데이터의 순서가 유지되지 않으며, 중복 저장이 불가능한 컬렉션
- 인덱스 정보가 없으며, 데이터를 꺼낼 때는 입력순서와 다를 수 있다.
- 수학의 집합과 비슷하다. →
기능 | 리턴 타입 | 메서드 | 설명 |
---|
객체 추가 | boolean | add(Object o) | 주어진 객체를 추가하고, 성공하면 true를, 중복 객체면 false를 반환합니다. |
객체 검색 | boolean | contains(Object o) | 주어진 객체가 Set에 존재하는지 확인합니다. |
| boolean | isEmpty() | Set이 비어있는지 확인합니다. |
| Iterator | Iterator() | 저장된 객체를 하나씩 읽어오는 반복자를 리턴합니다. |
| int | size() | 저장되어 있는 전체 객체의 수를 리턴합니다. |
객체 삭제 | void | clear() | Set에 저장되어져 있는 모든 객체를 삭제합니다. |
| boolean | remove(Object o) | 주어진 객체를 삭제합니다. |
- HashSet, TreeSet 등이 Set 인터페이스를 구현합니다.
**TreeSet**
- 이진 탐색 트리형태로 데이터를 저장
- 루트 : 최상위 노드
- 모든 왼쪽 자식의 값이 루트나 부모보다 작고, 모든 오른쪽 자식의 값이 루트나 부모보다 큰 값을 가진다.
- 데이터를 입력순서와 상관없이 크기순으로 출력
- treeSet에 저장되는 모든 객체는 크기 비교의 기준이 제공되야 한다.
- Comparable 제네릭 인터페이스 구현
- int comparTo(T t) 추상메서드 : 작을때 음수, 같을때 0, 클때는 양수를 리턴
- 매개변수로 Comparator 객체를 제공
Map
- Map은 키(key)와 값(value)의 쌍으로 구성된 객체(Entry)를 저장하는 컬렉션
- Key값으로는 무엇이든 올 수 있고, Set 형태로 관리
- 데이터의 순서가 유지되지 않으며, 키는 중복 저장이 불가능하지만, 값은 중복 저장이 가능
- HashMap, HashTable, TreeMap
- TreeMap
- 입력순서와 관계없이 데이터를 Key값의 크기순으로 저장
- Key객체는 비교의 기준을 갖고 있어야 한다.
기능 | 리턴 타입 | 메서드 | 설명 |
---|
객체 추가 | Object | put(Object key, Object value) | 주어진 키로 값을 저장합니다. 해당 키가 새로운 키일 경우 null을 리턴하지만, 동일한 키가 있을 경우에는 기존의 값을 대체하고 대체되기 이전의 값을 리턴합니다. |
객체 검색 | boolean | containsKey(Object key) | 주어진 키가 있으면 true, 없으면 false를 리턴합니다. |
| boolean | containsValue(Object value) | 주어진 값이 있으면 true, 없으면 false를 리턴합니다. |
| Set | entrySet() | 키와 값의 쌍으로 구성된 모든 Map.Entry 객체를 Set에 담아서 리턴합니다. |
| Object | get(Object key) | 주어진 키에 해당하는 값을 리턴합니다. |
| boolean | isEmpty() | 컬렉션이 비어 있는지 확인합니다. |
| Set | keySet() | 모든 키를 Set 객체에 담아서 리턴합니다. |
| int | size() | 저장된 Entry 객체의 총 갯수를 리턴합니다. |
| Collection | values() | 저장된 모든 값을 Collection에 담아서 리턴합니다. |
객체 삭제 | void | clear() | 모든 Map.Entry(키와 값)을 삭제합니다. |
| Object | remove(Object key) | 주어진 키와 일치하는 Map.Entry를 삭제하고 값을 리턴합니다. |
| | | |
- Map은 키와 값을 쌍으로 저장하기 때문에
iterator()
를 직접 호출할 수 없습니다. 그 대신 keySet()
이나 entrySet()
메서드를 이용해 Set 형태로 반환된 컬렉션에 iterator()
를 호출하여 반복자를 만든 후, 반복자를 통해 순회할 수 있습니다.
Set<String> keySet = map.keySet();
Iterator<String> keyIterator = keySet.iterator();
while(keyIterator.hasNext()) {
String key = keyIterator.next();
Integer value = map.get(key);
System.out.println(key + " : " + value);
}
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
Iterator<Map.Entry<String, Integer>> entryIterator = entrySet.iterator();
while(entryIterator.hasNext()) {
Map.Entry<String, Integer> entry = entryIterator.next();
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key + " : " + value);
}
if (map.containsKey(id)) {
if (map.get(id).equals(password)) {
System.out.println("로그인 되었습니다.");
}
else System.out.println("비밀번호가 일치하지 않습니다. ");
}
else System.out.println("입력하신 아이디가 존재하지 않습니다.");
**Iterator**
- 반복자, 컬렉션에 저장된 요소들을 순차적으로 읽어오는 역할
- Collection 인터페이스에 **정의된
iterator()
를** 호출하면, Iterator 타입의 인스턴스가 반환된다.
메서드 | 설명 |
---|
hasNext() | 읽어올 객체가 남아 있으면 true를 리턴하고, 없으면 false를 리턴합니다. |
next() | 컬렉션에서 하나의 객체를 읽어옵니다. 이 때, next()를 호출하기 전에 hasNext()를 통해 읽어올 다음 요소가 있는지 먼저 확인해야 합니다. |
remove() | next()를 통해 읽어온 객체를 삭제합니다. next()를 호출한 다음에 remove()를 호출해야 합니다. |
List<String> list = ...;
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()) {
String str = iterator.next();
...
}
List<String> list = ...;
for(String str : list) {
...
}
Stack
- 컬렉션중 유일하게 클래스다.
- Vector 클래스의 자식 클래스
- LIFO 후입선출 자료구조
구분 | 리턴타입 | 메서드명 | 기능 |
---|
데이터 추가 | E | push(E item) | 매개변수를 추가 |
데이터 확인 | E | peek() | 가장 상위에 있는 원솟값 리턴 |
데이터 위치 검색 | int | search(Object o) | 원소의 위치값을 리턴(맨위가 1, 아래로 내려갈수록 1씩증가) |
데이터 추출 | E | pop() | 최상위 데이터 꺼내기 (데이터개수 |
감소) | | | |
empty 여부 검사 | boolean | empty() | 객체가 비어있는지 여부 리턴 |
Queue
- Collection 에서 상속된 인터페이스
- LinkedList가 Queue인터페이스의 구현클래스다.
- 선입선출 FIFO 자료구조
| 예외처리 기능
미포함 메서드 | 데이터 추가 | boolean | add(E item) | 매개변수를 Queue에 추가 |
| | 데이터 확인 | E | element() | 가장 상위에 있는 원솟값 리턴 |
| | 데이터 추출 | E | remove() | 최상위 데이터 꺼내기 |
| 예외처리 기능
포함 메서드 | 데이터 추가 | boolean | offer(E item) | 매개변수를 Queue에 추가 |
| | 데이터 확인 | E | peek() | 최상위 데이터 꺼내기(데이터가 없으면 null 리턴) |
| | 데이터 추출 | E | poll() | 최상위 데이터 꺼내기(데이터가 없으면 null리턴) |
어려운 내용(에러)
참조
해싱(Hashing)
**해싱(Hashing)**
개념(Concept)
● 키(Key) 값을 해시 함수(Hash Function)라는 수식에 대입시켜 계산한 후 나온 결과를 주소로 사용하여 바로 값(Value)에 접근하게 할 수 하는 방법
해시코드(Hashcode)
- 객체가 저장도니 번지를 기준으로 생성된 정수형 고윳값
해시 함수(Hash Function)
● 키(Key) 값을 값(Value)이 저장되는 주소 값으로 바꾸기 위한 수식이다.
보안(Security) : 데이터의 위변조를 막기 위해 전자서명이나 보안 알고리즘에 사용
● 자료 구조(Data Structure) : 기억 공간에 저장된 정보를 보다 빠르게 검색하기 위해 절대주소나 상대주소가 아닌 해시 테이블(Hash Table)을 생성하는 방식