0%

지네릭 타입의 형변환

  • 지네릭 타입과 원시 타입 간의 형변환은 바람직하지 않음
  • 와일드 카드가 사용된 지네릭 타입으로는 형변환 가능

지네릭 타입의 제거

  • 컴파일러는 지네릭 타입을 제거하고 필요한 곳에 형변환을 넣음

제한된 지네릭 클래스

  • extends로 대입할 수 있는 타입을 제한

image

지네릭스의 제약

  • 타입 변수에 대입은 인스턴스 별로 다르게 가능
1
Box<Apple> appleBox = new Box<Apple>();// Apple객체만 저장 가능
2
Box<Grape> grapeBox = new Box<Grape>(); // Grape객체만 저장 가능
  • static멤버에 타입 변수 사용 불가
1
class Box<T> {
2
  static T item;
3
  static int compare(T t1, T t2) {
4
    
5
  } //에러
6
}
  • 배열,객체 생성할 때 타입 변수 사용불가. 타입 변수로 배열 선언은 가능
1
class Box<T> {
2
  T[] itemArr; // OK
3
  
4
  T[] toArray() {
5
    t[] tmArr = new T[itemArr.length]; // 에러
6
  }
7
}

Iterator

  • 클래스를 작성할 떄, Object타입 대신 T와 같은 타입 변수를 사용

image

HashMap<K,V>

  • 여러 개의 타입 변수가 필요한 경우, 콤마를 구분자로 선언

image

타입변수

  • 지네릭클래스를 작성할 떄, Object타입 대신 타입 변수(E)를 선언해서 사용

타입 변수에 대입하기

  • 객체를 생성시, 타입 변수(E) 대신 실제 타입(Tv)을 지정 (대입)
  • 타입 변수 대신 실제 타입이 지정되면, 형변환 생략가능

image

지네릭스 용어

class Box<T> {}

  • Box: 지네릭스 클래스.
  • T: 타입 변수 또는 타입 매개변수(T는 타입 문자)
  • Box: 원시 타입(raw type)

지네릭 타입과 다형성

  • 참조 변수와 생성자의 대입된 타입은 일치해야 함
1
ArrayList<Tv> list = new ArrayList<Tv>(); //OK
2
ArrayList<Product> list = new ArrayList<Tv>(); //에러. 불일치
  • 지네릭 클래스간의 다형성은 성립.(여전히 대입된 타입은 일치해야 함)
1
List<Tv> list = new ArrayList<Tv>(); //OK
2
list<Tv> list = new LinkedList<Tv>(); //OK
  • 매개변수의 다형성도 성립
1
ArrayList<Product> list = newArrayList<Product>();
2
list.add(new Product());
3
list.add(new Tv()); //OK
4
list.add(new Audio()); //OK

image

지네릭스란?

  • 컴파일시 타입을 체크 해 주는 기능
  • 런타임때 에러가 발생하는 것보다 컴파일타임에 에러가 발생해서 고칠 수 있게끔 하기 위해 나옴
1
ArrayList<Tv> tvList = new ArrayList<Tv>();
2
3
tvList.add(new Tv()); // OK
4
tvList.add(new Audio()); // 컴파일 에러.Tv외에 다른 타입은 저장 불가
  • 객체의 타입 안정성을 높이고 형변환의 번거로움을 줄여줌

image

장점

  • 타입 안전성을 제공
  • 타입체크와 형변환을 생략할 수 있으므로 코드가 간결

HashMap과 Hashtable

  • Map인터페이스를 구현. 데이터를 키와 값의 쌍으로 저장
  • 순서X, 중복(키X, 값O)
  • HashMap(동기화x)은 Hashtable(동기화O)의 신버전

HashMap

  • Map인터페이스를 구현한 대푲거인 컬렉션 클래스
  • 순서를 유지하려면, LinkedHashMap클래스를 사용하면 됨

HashTable

  • 배열 + 링크드리스트

TreeMap

  • 범위 검색과 정렬에 유리한 컬렉션 클래스
  • HashMap보다 데이터추가, 삭제에 시간이 더 걸림

해싱(hashing)

  • 해시 함수로 해시테이블에 데이터를 저장, 검색
  • 해시테이블은 배열과 링크드 리스트가 조합된 형태
메서드 설명
HashMap() 기본 생성자
HashMap(int initialCapacity) 배열 초기용량지정
HashMap(int initialCapacity, float loadFactor) 배열 초기용량지정
HashMap(Map m) 다른 맵을 해쉬맵으로 변경
Object put(Object key, Object value) 데이터 저장
void putAll(Map m) 지정된 맵에 있는것들을 저장
Object remove(Object key) 삭제
Object replace(Object key, Object value) 변경
boolean replace(Object key, Object oldValue, Object newValue) 변경
Set entrySet() 키와 값쌍들을 가진 엔트리(키+값)들을 가져옴
Set keySet() 키를 가져옴
Collection values() 값을 가져옴
Object get(Object key) 특정 키값으로 값을 반환
Object getOrDefault(Object key, Object defaultValue) 특정 키값이 없을시 default값을 반환
boolean containKey(Object key) 키가 있는지 반환
boolean containsValue(Object value) 값이 있는지 반환
int size() 크기를 반환
boolean isEmpty() 비었는지 확인
void clear() 모두 삭제
Object clone() 복제

예제1)

image)image

예제4)

image

image

HashSet

HashSet

  • Set인터페이스를 구현한 대표적인 컬렉션 클래스
  • 순서를 유지하려면, LinkedHashSet클래스를 사용하면 된다.
메소드 의미
HashSet() 생성자
HashSet(Collection c) 지정된 컬렉션에 모든 객체 저장
HashSet(int initialCapacuty) 초기용량
HashSet(int initialCapacity, float loadFactor) 언제 용량을 늘릴 것인가
boolean add(Object o) 추가
boolean add(Collection c) 추가, 합집합
boolean remove(Object o) 삭제
boolean removeAll(Collection c) 삭제, 교집합
boolean retainAll(Collection c) 조건부삭제, 차집합
void clear() 모두 삭제
boolean contains(Object o) 포함되어있는지?
boolean containsAll(Collection c) 컬렉션에 담긴 여러객체가 모두 포함되어 있는지
iterator iterator 컬렉션요소를 읽어옴
boolean isEmpty() 비었는지?
int size() 저장된 객체수
Object[ ] toArray() 셋에 저장된 객체배열로 반환
Object[] toArray(Object[] a) 셋에 저장된 객체배열로 반환

예제

  • 중복된 값은 저장X, 1은 문자열, 숫자열 하나씩 있기 때문에 true를 반환

image

  • Set은 정렬될 수 없기떄문에 List로 형변환 후 sort()사용해서 정렬

image

  • HastSet은 객체를 저장하기전에 기존에 같은 객체가 있는지 확인 / 같은 객체가 없으면 저장, 있으면 저장X
  • boolean add(Object o)는 저장할 객체의 equals()와 hashCode()를 호출 / equals()와 hashCode()가 오버라이딩 되어 있어야 함

image

  • 교집합, 합집합, 차집합

image

TreeSet

  • 범위 검색과 정렬에 유리한 컬렉션 클래스
  • HashSet보다 데이터추가, 삭제에 시간이 더 걸림
  • 이진 탐색 트리(binary search tree)로 구현.범위 탐색과 정렬에 유리
  • 이진 트리는 모든 노드가 최대 2개의 하위 노드를 갖음
1
class TreeNode {
2
  TreeNode left; // 왼쪽 자식노드
3
  Object element; // 저장할 객체
4
  TreeNode right; // 오른쪽 자식노드
5
}
생성자 또는 메서드 설명
TreeSet() 기본 생성자
TressSet(Collection c) 주어진 컬렉션을 저장하는 TreeSet을 생성
Treeset(Comparator comp) 주어진 정렬기준으로 정렬하는 TreeSet을 생성
Obejct first() 정렬된 순서에서 첫 번째 객체를 반환
Object last() 정렬된 순서에서 마지막 객체를 반환
Object ceiling(Object o) 지정된 객체와 같은 객체를 반환. 없으면 큰 값을 가진 객체 중 제일 가까운 값의 객체를 반환. 없으면 null
Object floor(Object o) 지정된 객체와 같은 객체를 반환. 없으면 작은 값을 가진 객체 중 제일 가까운 값의 객체를 반환. 없으면 null
Object higher(Obejct o) 지정된 객체보다 큰 값을 가진 객체 중 제일 가까운 값의 객체를 반환.없으면 null
Object lower(Object o) 지정된 객체보다 작은 값을 가진 객체 중 제일 가까운 값의 객체를 반환.없으면 null
SortedSet subSet(Object fromElement, Object toElement) 범위 검색이 결과를 반환한다.
SortedSet headSet(Object toElement) 지정된 객체보다 작은 값의 객체들을 반환한다.
SortedSet tailSet(Object fromElement) 지정된 객체보다 큰 값의 객체를 반화한다.

image

image

image

이진 탐색 트리

  • 부모보다 작은 값은 왼쪽, 큰 값은 오른쪽에 저장
  • 데이터가 많아질수록 추가, 삭제에 시간이 더 걸림(비교 획수 증가)

트리 순회(tree traversal)

  • 이진트리의 모든 노드를 한번씩 읽는 것을 트리 순회라고 함
  • 전위, 중위, 후위 순회법이 있으며, 중위 순회하면 오름차순으로 정렬됨

Comparator와 Comparable

  • 객체 정렬에 필요한 메서드를 정의한 인터페이스
1
Comparable 기본 정렬기준을 구현하는데 사용
2
Comparator 기본 정렬기준 외에 다른 기준으로 정렬하고자할 때 사용
  • compare()compareTo()는 두 객체의 비교결과를 반환하도록 작성. 같으면0, 오른쪽이 크면 음수(-), 작으면 양수(+)
1
publci final class Integer extends Number implements Comparable{
2
  ...
3
  public int compareTo(Integer anotherInteger) {
4
    int v1 = this.value;
5
    int v2 = anotherInteger.value;
6
    
7
    return (v1 < v2 ? -1 : (v1==v2? 0 : 1));
8
  }
9
}

image

Arrays

  • 배열의 출력 - toString()
1
static String toString(boolean[] a)
2
static String toString(byte[] a)
3
static String toString(char[] a)
4
static String toString(short[] a)
5
static String toString(int[] a)
6
static String toString(long[] a)
7
static String toString(float[] a)
8
static String toString(double[] a)
9
static String toString(Object[] a)
  • 배열의 복사 - copyOf(), copyOfRange()
1
int[] arr = {0,1,2,3,4};
2
int[] arr2 = Arrays.copyOf(arr, arr.length);
3
int[] arr3 = Arrays.copyOf(arr, 3);
4
int[] arr4 = Arrays.copyOf(arr, 7);
5
int[] arr5 = Arrays.copyOfRange(arr, 2, 4);
6
int[] arr6 = Arrays.copyOfRange(arr, 0 ,7);
  • 배열 채우기 - fill(), setAll()
1
int[] arr = new int[5];
2
Array.fill(arr, 9); // arr=[9,9,9,9,9]
3
Arrarys.setAll(arr, (i) -> (int)(Math.random()*5)+1); //arr=[1,5,2,1,1]
  • 배열의 정렬과 검색 - sort(), binarySearch()
1
int[] arr = {3, 2, 0, 1, 4};
2
int idx = Arrays.binarySearch(arr, 2);
3
4
Arrays.sort(aa); //배열arr을정렬
5
System.out.println(Arrays.toString(arr));
6
int idx = Arrays.binarySearch(arr, 2); //idx=2
  • 다차원 배열의 출력 - deepToString()
1
int[] arr = {0,1,2,3,4};
2
int[][ arr2D = {{11,12}, {21,22}};
3
      
4
System.out.println(Arrays.toString(arr)); //[0, 1, 2, 3, 4]
5
System.out.println(Arrarys.deepToString(arr2D)); //[[11, 12], [21, 22]]
  • 다차원 배열의 비교 - deepEquals()
1
String[][] str2D = new String[][]{{"aaa", "bbb"}, {"AAA", "BBB"}}
2
String[][] str2D2 = new String[][]{{"aaa", "bbb"},{"AAA", "BBB"}};
3
4
System.out.println(Arrays.equals(str2D, str2D2)); //false
5
System.out.println(Arrays.deepEquals(str2D, str2D2)); //true
  • 배열을 List로 변환 - asList(Object....a)
1
List list = Arrarys.asList(new Integer[]{1,2,3,4,5});
2
List list = Arrays.asList(1,2,3,4,5);
3
list.add(6);
4
List list = new ArrayList(Arrays.asList(1,2,3,4,5));

Iterator,ListIterator,Enumeration

  • 컬렉션에 저장된 데이터를 접근하는데 사용되는 인터페이스
  • Enumeration은 Iterator의 구버전
  • 컬렉션에 iterator()를 호출해서 Iterator를 구현한 객체를 얻어서 사용
메서드 설명
boolean hasNext() 읽어 올 요소가 남아있는지 확인.있으면 true, 없으면 false를 반환
Object next() 다음 요소를 읽어옴. next()를 호출하기전에 hasNext()를 호출해서 읽어 올 요소가 있는지 확인하는 것이 안전
boolean hasMoreElements() 읽어 올 요소가 남아있는지 확인.있으면 true,없으면 false를 반환
Object nextElement() 다음 요소를 읽어옴.nextElement()를 호출하기전에 hasMoreElements()를 호출해서 읽어올 요소가 남아있는지 확인하는 것이 안전함.Iterator의 next()와 같음
1
List list = new ArrayList();
2
Iterator it = list.iterator();
3
4
while(it.hasNext()) {
5
  System.out.println(it.next());
6
}

image

  • Map에는 iterator()가 없기때문에 keySet(), entrySet(), values()를 호출해야함
1
Map map = HashMap();
2
	...
3
Iterator it = map.entrySet().iterator();