제네릭 (Generic) / 컬렉션 (Collection)

hyoreal·2022년 8월 29일
0

[JAVA]

목록 보기
4/11
post-thumbnail

제네릭 (Generic)

  • 제네릭(Generic)

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

    • 코드는 동일하지만 다른 타입들의 필드, 메서드, 클래스들이 필요해지면 각 타입마다의 클래스를 다시 작성해야함
    • 제네릭을 사용한다면 이런 번거로움이 줄어듦

제네릭 클래스 정의

  • 제네릭 클래스 (Generic Class)

    • 제네릭을 사용한 클래스
    • 객체 생성 시 실제 타입 지정
      • 단, 기본 타입 지정 불가. 래퍼클래스 사용해야함
    • 다형성 적용 가능
  • 제네릭 클래스 예시

    public class 클래스명<타입_매개변수> { }
    public class 클래스명<타입_매개변수1, 타입_매개변수2> { }
    
    public interface 인터페이스명<타입_매개변수> { }
    public interface 인터페이스명<타입_매개변수1, 타입_매개변수2> { }
    -----------------------------------
    
    class Flower {...}
    class SunFlower extends {...}
    class Cosmos extends Flower {...}
    class Candy {...}
    
    class Basket<T> {
      private T item;
      
      public T getItem() {
        return item;
      }
      
      public void setItem(T item) {
        this.item = item;
      }
    }
    
    public static void main(String[] args) {
        // 사용방법
        // Basket<구체적_타입_명시> example = new Basket<구체적_타입_명시>();
        // Basket<구체적_타입_명시> example2 = new Basket<>(); // new 뒤로는 구체적 타입 생략 가능
        
        Basket<Flower> flowerBasket = new Basket<>();
        flowerBasket.setItem(new SunFlower()); // 다형성 적용
        flowerBasket.setItem(new Cosmos()); // 다형성 적용
        flowerBasket.setItem(new Candy()); // 에러
  • 제한된 제네릭 클래스

    • 제네릭 클래스는 타입을 지정하는데에 어떠한 제한이 없음
    • 타입 매개변수 선언 시 상속 혹은 구현받는 클래스 && 인터페이스만 지정할 수 있도록 제한 가능
    • extends 키워드 사용
    interface Plant {}
    class Flower implements Plant {}
    class SunFlower extends Flower {]
    
    class Basket1<T extends Flower> {...} // 객체 생성시 Flower의 하위 클래스만 지정 가능
    
    class Basket2<T extends Plant> {...} // 객체 생성 시 Plant 인터페이스를 구현한 클래스만 지정 가능
    
    class Basket3<T extends Plant && Flower> {...} // 객체 생성 시 Flower의 하위클래스이면서 Plant 인터페이스를 구현한 클래스만 지정 가능
    • 타입 매개변수

      인자의미
      < T >Type
      < E >Element
      < K, V >Key, Value
      < R >Result
      < ? >Wild Card. 제한을 두지 않는 기호
    • 래퍼클래스 (Wrapper class)

      • 기본타입에 해당하는 데이터를 객체로 포장해주는 클래스
      • java.lang 패키지에 포함되어있음
      기본타입래퍼 클래스
      byteByte
      shortShort
      intInteger
      longLong
      floatFloat
      doubleDouble
      charCharacter
      booleanBoolean

제네릭 메서드 (Generic Method)

  • 제네릭 메서드 (Generic Method)

    • 제네릭 타입을 선언한 메서드
    • 호출되는 시점에서 실제 제네릭 타입을 지정
    • 정의하는 시점에서는 실제 어떤 타입이 입력 되는지 알 수 없기 때문에 Object 클래스의 메서드만 사용가능

컬렉션 프레임워크 (Collection Framework)

  • 컬렉션(Collection) : 여러 데이터들의 집합

  • 컬렉션 프레임워크(Collection Framework)

    • 컬렉션을 다루는데에 있어 편리한 메서드들을 미리 정의해놓은 것
    • 특정 자료 구조에 데이터를 추가하고, 삭제하고, 수정하고, 검색하는 등의 동작을 수행하는 편리한 메서드 제공

    • 주요 인터페이스 : List, Map, Set
    • Collection 메서드는 List, Set에서 사용 가능
    • 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[]toArray(Object[] a)배열에서 컬렉션의 객체를 저장 후 리턴

List

  • List < E >

    • 배열과 같이 객체를 일렬로 늘어놓은 구조
    • 객체 저장 시 자동으로 인덱스 부여
    • 인덱스로 객체 검색, 추가, 삭제 등의 여러 기능 제공
    • List Methods
  • ArrayList

    • List 인터페이스 구현 클래스
    • 컬렉션 프레임워크에서 가장 빈번하게 사용
    • 객체들이 저장용량을 초과해서 들어오면 자동으로 용량이 늘어남
    • 데이터 연속적 존재
    • ArrayList Methods
  • LinkedList

    • 데이터 효율적 추가, 삭제 변경 위해 사용
    • 데이터가 불연속적으로 존재하지만 서로 연결(link)되어있음
    • 각 요소들은 자신이 연결된 이전 요소 및 다음 요소의 주소값과 데이터로 구성
    • LinkedList Methods

  • LinkedList와 ArrayList 차이

    -ArrayListLinkedList
    데이터 추가자동 인덱스 부여데이터, 데이터와 연결된 요소의 주소값 저장
    데이터 변경다른 데이터를 복사 후 이동추가,삭제에 따라 앞뒤 연결된 요소의 주소값 변경
    데이터 검색인덱스를 통해 접근첫 요소부터 다음 주소값으로 순차적 검색
    연속성데이터 연속적 존재데이터 불연속적 존재, 서로 연결되어있음
    강점데이터를 읽어들이는 경우 용이데이터 변경에 용이

Iterator

  • Iterator

    • 컬렉션에 저장된 요소들을 순차적으로 읽어오는 역할
    • Iterator의 컬렉션 순회기능은 Iterator 인터페이스에 정의
      • Collection 인터페이스에는 Iterator 인터페이스를 구현한 클래스의 인스턴스를 반환하는 메서드 iterator()가 정의되어있음
      • 정의된 iterator() 메서드를 호출하면 Iterator타입의 인스턴스 반환
    • Collection 인터페이스를 상속받는 List와 Set에서도 사용 가능
  • Iterator Method

    메서드설명
    hasNext()읽어올 객체가 남아 있으면 true를 리턴하고, 없으면 false리턴
    next()컬렉션에서 하나의 객체를 읽어옴. 이 때, next()를 호출하기 전 hasNext()를 통해 다음 읽어올 요소가 있는지 먼저 확인해야함
    remove()next()를 통해 읽어온 객체 삭제. next()를 먼저 호출한 다음 remove()를 호출해야함

Set

  • Set < E >

    • 요소 중복 허용 X, 저장 순서 유지 X
    • 대표적인 Set 구현 클래스에는 HashSet, TreeSet
    • Set Methods
  • HashSet

    • Set 인터페이스를 구현한 가장 대표적인 컬렉션 클래스
    • 중복 값 허용 X, 저장 순서 유지 X
    • 중복 확인
      1. 저장하고자 하는 객체의 해시코드를 hashCode() 메서드를 통해 얻어냄
      2. Set이 저장하고 있는 모든 객체들의 해시코드를 hashCode() 메서드를 통해 얻어냄
      3. 저장하고자 하는 객체의 해시코드와 Set에 저장되어있던 객체들의 해시코드를 비교하여 같은 해시코드가 있는지 검사
        3-1. 같은 해시코드가 있다면?
        equals() 메서드로 두 객체 비교 후 true가 나오면 같은 값으로 판단 후 Set에 객체를 저장하지않음. add(Object o) 메서드가 false 반환
        3-2. 같은 해시코드가 없다면?
        Set에 객체가 추가되고 add(Object o) 메서드가 true 반환
    • HashSet Methods
  • TreeSet

    • 중복 값 허용 X, 저장 순서 유지 X
    • 이진 탐색 트리(Binary Search Tree)로 데이터 저장
      • Binary Search Tree?
        • 하나의 부모노드가 최대 두개의 자식노드와 연결되는 이진트리의 일종.
        • 정렬과 검색에 특화된 자료구조
    • 기본 정렬 : 오름차순
    • TreeSet Methods

Map

  • Map < K, V >

    • 키(key)와 값(value)로 구성된 객체를 저장하는 구조
    • 키값 한 쌍을 Entry객체 라고 함
    • 키와 값은 모두 객체이며, 기본타입일 수 없음
    • 키는 중복 불가하지만, 값은 중복 가능
      ⇒ 키가 중복될경우 기존 값이 새로운 값으로 덮어씌워짐
    • Map 인터페이스를 구현한 클래스에는 HashMap, HashTable, TreeMap, SortedMap 등이 있다
    • Map Methods
  • HashMap

    • Map 인터페이스를 구현한 대표적인 클래스
    • 해시 함수를 통해 키와 값이 저장되는 위치를 결정
    • 사용자는 저장되는 위치를 알 수 없음
    • 삽입 순서, 위치 또한 관계없음
    • HashMap은 Hashing을 사용하기 때문에 많은 양의 데이터를 검색하는데 있어 뛰어난 성능을 보임
    • HashMap Methods
    • Map은 키와 값을 쌍으로 저장하기 때문에 Set형태로 변환하여 출력해야함
    public static void main(String[] args) {
      Map<Integer, String> map = new HashMap<>();
      
      map.put(1, "apple");
      System.out.println(map.get(1)); // apple 출력
      
      map.put(1, "banana");
      System.out.println(map.get(1)); // banana 출력
    }

적절한 자료구조 사용

profile
좌충우돌 코린이 성장기

0개의 댓글