제네릭&컬렉션 프레임워크

InSeok·2022년 7월 15일
0

TIL

목록 보기
14/51

목차


  1. 제네릭 클래스
  2. 제네릭 메서드
  3. 컬렉션 프레임워크의 핵심 인터페이스, 메서드

배운 내용


제네릭

정의

  • 타입을 구체적으로 지정하는 것이 아니라, 추후에 지정할 수 있도록 일반화해두는 것
  • 작성한 클래스 또는 메서드의 코드가 특정 데이터 타입에 얽매이지 않게 해둔 것

기능

  • 단 하나의 클래스만으로 모든 타입의 데이터를 저장할 수 있는 인스턴스를 만들 수 있다.
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>("기타줄");
//**“`Basket` 클래스 내의 `T`를 `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 객체의 멤버 사용가능
// 제네릭 클래스 제한
//클래스이든, 인터페이스이든 항상 extends 키워드 사용
접근 지정자 class 클래스명 <T extends 최상위 클래스 / 인터페이스명> {
}

//제네릭 메서드 제한
접근 지정자 <T extends 최상위 클래스/ 인터페이스명> T 메서드명(T t) {
// 최상위클래스의 메서드 사용가능
}

제네릭 메서드

  • 클래스 내부의 특정 메서드만 제네릭으로 선언 가능
				class Basket<T> {             //제네릭 클래스
																			//여기에서 선언한 타입 매개변수 T와
																
		...
		public <T> void add(T element) {  // 제네릭 메서드
					...                        //이곳에서 선언한 타입 매개변수 T는 다르다.
		}
}
  • 클래스명 옆에서 선언한 타입 매개변수는 클래스가 인스턴스화될 때 타입이 지정된다.
  • 제네릭 메서드의 타입은 메서드가 호출될 때 실제 제네릭 타입을 지정
  • 클래스 타입 매개변수와 달리 메서드 타입 매개변수는 static메서드에서도 선언가능

제네릭의 상속

  • 부모 클래스,메서드 가 제네릭일때 → 자식 클래스, 메서드 또한 제네릭이다(부모의 제네릭 타입 변수를 그대로 물려받음)

**컬렉션 프레임워크**

컬렉션

  • 동일한 타입을 묶어 관리하는 자료구조.
  • 배열과 달리, 데이터의 저장 용량을 동적으로 관리
  • 모든 컬렉션의 원소에는 객체만 올 수 있다.

프레임워크

  • 클래스와 인터페이스의 모임(라이브러리)
  • 클래스의 정의에 설계 원칙 또는 구조가 존재

컬렉션 프레임워크

  • 리스트, 스택, 큐, 트리 등의 자료구조에 정렬, 탐색 등의 알고리즘을 구조화해 놓은 프레임워크

**Collection 인터페이스**

기능리턴 타입메소드설명
객체 추가booleanadd(Object o) /addAll(Collection c)주어진 객체 및 컬렉션의 객체들을 컬렉션에 추가합니다.
객체 검색booleancontains(Object o) / containsAll(Collection c)주어진 객체 및 컬렉션이 저장되어 있는지 여부를 리턴합니다.
Iteratoriterator()컬렉션의 iterator를 리턴합니다.
booleanequals(Object o)컬렉션이 동일한지 여부를 확인합니다.
booleanisEmpty()컬렉션이 비어있는지 여부를 확인합니다.
intsize()저장되어 있는 전체 객체 수를 리턴합니다.
객체 삭제voidclear()컬렉션에 저장된 모든 객체를 삭제합니다.
booleanremove(Object o) / removeAll(Collection c)주어진 객체 및 컬렉션을 삭제하고 성공 여부를 리턴합니다.
booleanretainAll(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);
    • 배열을 List로 포장만 하는 메서드
기능리턴 타입메서드설명
객체 추가voidadd(int index, Object element)주어진 인덱스에 객체를 추가
booleanaddAll(int index, Collection c)주어진 인덱스에 컬렉션을 추가
Objectset(int index, Object element)주어진 위치에 객체를 저장
객체 검색Objectget(int index)주어진 인덱스에 저장된 객체를 반환
intindexOf(Object o) / lastIndexOf(Object o)순방향 / 역방향으로 탐색하여 주어진 객체의 위치를 반환
ListIteratorlistIterator() / listIterator(int index)List의 객체를 탐색할 수 있는ListIterator 반환 / 주어진 index부터 탐색할 수 있는 ListIterator 반환
ListsubList(int fromIndex, int toIndex)fromIndex부터 toIndex에 있는 객체를 반환
객체 삭제Objectremove(int index)주어진 인덱스에 저장된 객체를 삭제하고 삭제된 객체를 반환
booleanremove(Object o)주어진 객체를 삭제
객체 정렬voidsort(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은 데이터의 순서가 유지되지 않으며, 중복 저장이 불가능한 컬렉션
  • 인덱스 정보가 없으며, 데이터를 꺼낼 때는 입력순서와 다를 수 있다.
  • 수학의 집합과 비슷하다. →
기능리턴 타입메서드설명
객체 추가booleanadd(Object o)주어진 객체를 추가하고, 성공하면 true를, 중복 객체면 false를 반환합니다.
객체 검색booleancontains(Object o)주어진 객체가 Set에 존재하는지 확인합니다.
booleanisEmpty()Set이 비어있는지 확인합니다.
IteratorIterator()저장된 객체를 하나씩 읽어오는 반복자를 리턴합니다.
intsize()저장되어 있는 전체 객체의 수를 리턴합니다.
객체 삭제voidclear()Set에 저장되어져 있는 모든 객체를 삭제합니다.
booleanremove(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객체는 비교의 기준을 갖고 있어야 한다.
기능리턴 타입메서드설명
객체 추가Objectput(Object key, Object value)주어진 키로 값을 저장합니다. 해당 키가 새로운 키일 경우 null을 리턴하지만, 동일한 키가 있을 경우에는 기존의 값을 대체하고 대체되기 이전의 값을 리턴합니다.
객체 검색booleancontainsKey(Object key)주어진 키가 있으면 true, 없으면 false를 리턴합니다.
booleancontainsValue(Object value)주어진 값이 있으면 true, 없으면 false를 리턴합니다.
SetentrySet()키와 값의 쌍으로 구성된 모든 Map.Entry 객체를 Set에 담아서 리턴합니다.
Objectget(Object key)주어진 키에 해당하는 값을 리턴합니다.
booleanisEmpty()컬렉션이 비어 있는지 확인합니다.
SetkeySet()모든 키를 Set 객체에 담아서 리턴합니다.
intsize()저장된 Entry 객체의 총 갯수를 리턴합니다.
Collectionvalues()저장된 모든 값을 Collection에 담아서 리턴합니다.
객체 삭제voidclear()모든 Map.Entry(키와 값)을 삭제합니다.
Objectremove(Object key)주어진 키와 일치하는 Map.Entry를 삭제하고 값을 리턴합니다.
  • Map은 키와 값을 쌍으로 저장하기 때문에 iterator()를 직접 호출할 수 없습니다. 그 대신 keySet()이나 entrySet()메서드를 이용해 Set 형태로 반환된 컬렉션에 iterator()를 호출하여 반복자를 만든 후, 반복자를 통해 순회할 수 있습니다.
// key를 요소로 가지는 Set을 생성 -> 아래에서 순회하기 위해 필요합니다.
        Set<String> keySet = map.keySet();

        // keySet을 순회하면서 value를 읽어옵니다.
        Iterator<String> keyIterator = keySet.iterator();
        while(keyIterator.hasNext()) {
            String key = keyIterator.next();
            Integer value = map.get(key);
            System.out.println(key + " : " + value);
        }

        // Entry 객체를 요소로 가지는 Set을 생성 -> 아래에서 순회하기 위해 필요합니다.
        Set<Map.Entry<String, Integer>> entrySet = map.entrySet();

        // entrySet을 순회하면서 value를 읽어옵니다.
        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(); // next()를 통해 다음 객체를 읽어옵니다.
	...
}

// Iterator 사용하지 않더라도, for-each 구문을 통해 순회가능
List<String> list = ...;
for(String str : list) {
	...
}

Stack

  • 컬렉션중 유일하게 클래스다.
  • Vector 클래스의 자식 클래스
  • LIFO 후입선출 자료구조
구분리턴타입메서드명기능
데이터 추가Epush(E item)매개변수를 추가
데이터 확인Epeek()가장 상위에 있는 원솟값 리턴
데이터 위치 검색intsearch(Object o)원소의 위치값을 리턴(맨위가 1, 아래로 내려갈수록 1씩증가)
데이터 추출Epop()최상위 데이터 꺼내기 (데이터개수
감소)
empty 여부 검사booleanempty()객체가 비어있는지 여부 리턴

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)을 생성하는 방식

profile
백엔드 개발자

0개의 댓글