44일차 (2) - java (제네릭, 자바 컬렉션)

Yohan·2024년 4월 23일
0

코딩기록

목록 보기
64/156
post-custom-banner

제네릭

클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것
한마디로 특정 타입을 미리 지정해주는 것이 아닌 필요에 의해 지정할 수 있도록 하는 일반(Generic) 타입을 의미

  • <> 안에 기본 타입을 사용할 수 없고 객체 타입을 넣어주어야 한다.
// AppleBasket
public class AppleBasket {

    private Apple apple;

    public Apple getApple() {
        return apple;
    }

    public void setApple(Apple apple) {
        this.apple = apple;
    }
}

// Apple
public class Apple {

    private int sweet; // 당도

    public Apple(int sweet) {
        this.sweet = sweet;
    }

    @Override
    public String toString() {
        return "Apple{" +
                "sweet=" + sweet +
                '}';
    }
}

// main
public static void main(String[] args) {

        AppleBasket ab = new AppleBasket();
        ab.setApple(new Apple(10));
        Apple apple = ab.getApple();


        BananaBasket bb = new BananaBasket();
        bb.setBanana(new Banana(15));
        Banana banana = bb.getBanana();

        // Basket 클래스의 F에 Apple이 들어감
        Basket<Apple> appleBasket = new Basket<Apple>();
        appleBasket.setFruit(new Apple(1));
        Apple fruit = appleBasket.getFruit();

        Basket<Banana> bananaBasket = new Basket<Banana>();
        bananaBasket.setFruit(new Banana(33));
        Banana fruit1 = bananaBasket.getFruit();
    }
  • main 메서드를 보면 AppleBasket에 setter를 이용해 Apple을 담을 수있고, getter를 이용해 다시 꺼낼 수 있다.
    BananaBasket도 마찬가지다.
  • 하지만 이런식으로 과일의 갯수가 많아지게 된다면 계속해서 Basket 클래스들을 생성해 나가야한다.
  • 그래서 제네릭 클래스를 이용해 Basket을 만들고 타입으로 Apple, Banana, Peach 등을 주면서 Basket을 만들 수 있다.

// 제너릭 클래스: 타입 복제가 가능한 클래스
public class Basket<F> {

    private F fruit;

    public void setFruit(F fruit) {
        this.fruit = fruit;
    }

    public F getFruit() {
        return fruit;
    }
}
  • 이렇게 제네릭 클래스를 이용하면 특정 타입의 클래스가 아닌 일반 타입의 클래스를 만들어 다양한 특정 타입의 클래스로 계속해서 만들어낼 수 있다.

자바 컬렉션 (Java Collection)

객체들을 효율적으로 관리하기 위한 자료 구조들의 집합

  • 대표적으로 리스트(List), 셋(Set), 맵(Map) 등이 있다.
    -> 모두 인터페이스다.

List interface를 구현한 클래스

  • 객체를 저장하면 자동으로 인덱스 번호가 부여
    -> 인덱스를 통해 검색, 삭제할 수 있는 기능 제공
  • 순차적으로 데이터를 저장
  • 동일한 객체를 중복해서 저장 가능
// 제네릭을 이용해서 쉽게 String 배열을 생성
List<String> foods = new ArrayList<>();

주요 메서드

  • 직접 만들어서 사용하지않고 있는 메서드 사용하면 된다.

  • 객체 추가 기능

  1. add(E e): 주어진 객체를 List의 맨 끝부분에 추가.
  2. add(int index, E e): 주어진 인덱스에 객체를 추가.
  3. set(int index, E e): 주어진 인덱스에 저장된 객체를 주어진 객체로 바꿈.
  • 객체 검색 기능
  1. contains(Object o): 주어진 객체가 저장되어있는지의 여부를 판단.
  2. get(int index): 주어진 인덱스에 저장되어 있는 객체를 리턴.
  3. isEmpty(): 컬렉션이 비어있는지의 여부를 판단.
  4. size(): 저장되어 있는 전체 객체 수를 리턴.
  • 객체 삭제 기능
  1. clear(): 저장된 모든 객체를 삭제.
  2. remove(int index): 주어진 인덱스에 저장된 객체를 삭제.
  3. remove(Object o): 주어진 객체를 삭제.
  • 리스트에 초기값 넣고 시작
		// 리스트에 초기값 넣고 시작하기
        int[] arr = {10, 20, 30};
        List<Integer> numbers = new ArrayList<>(List.of(24, 99, 10, 20 ,30));
        System.out.println("numbers = " + numbers);
  • 오름차, 내림차 정렬
        // 오름차 정렬
        numbers.sort(Integer::compareTo);
        System.out.println("numbers = " + numbers);

        // 내림차 정렬
        numbers.sort(Comparator.reverseOrder());
        System.out.println("numbers = " + numbers);

ArrayList

  • 배열 리스트, 가장 흔하게 사용되는 리스트 객체 중 하나
  • 객체들이 순차적으로 늘어서 있다.

LinkedList

  • ArrayList와는 다르게 연속 위치로 저장하는 것이 아니고 모든 데이터가 데이터 부분과 주소 부분을 별도로 가지고 있다.

Set interface를 구현한 클래스

  • 저장 순서를 보장하지 않는다.
  • 객체의 중복 저장을 허용하지 않는다.
  • 인덱스로 관리 하지않아서 들어갈 때와 나올 때의 순서가 다를 수 있다.
  • 인덱스로 관리하지 않기 때문에 인덱스로 객체를 검색하는 기능이 없고 전체 객체를 대상으로 한 번씩 반복해서 객체의 값을 가져오는 반복자(Iterator) 제공

주요 메서드

  • Iterator 인터페이스의 주요 메서드
  1. hasNext(): 가져올 객체가 있으면 true를 리턴하고 없으면 false를 리턴.
  2. next(): 컬렉션에서 하나의 객체를 가져옴.
  3. remove(): Set 컬렉션에서 객체를 제거함
  • 객체 추가 기능
  1. add(E e): 주어진 객체를 저장, 성공적으로 저장되면 true를 리턴, 중복 객체를 저장하면 false를 리턴.
  • 객체 검색 기능
  1. contains(Object o): 주어진 객체가 저장되어 있는지의 여부를 판단.
  2. isEmpty(): 컬렉션이 비어있는지를 조사.
  3. iterator(): 저장된 객체를 한번씩 가져오는 반복자 객체를 리턴.
  4. size(): 저장되어 있는 전체 객체 수를 리턴.
  • 객체 삭제 기능
  1. clear(): 저장된 모든 객체를 삭제.
  2. remove(Object o): 주어진 객체를 삭제.
    public static void main(String[] args) {

        // 중복저장 허용 X, 순서가 없음, 비교적 빠른 저장속도
        Set<String> set = new HashSet<>();

        // 탐색시에는 개별 탐색은 불가, 전체탐색 가능
        for (String s : set) {
            System.out.println("s = " + s);
        }

        // set은 보통 데이터 중복을 빠르게 제거할 때 사용
        List<Integer> numbers = List.of(3, 3, 1, 1, 1, 3, 3, 5, 5, 5, 7, 7);

        // set으로 변환
        Set<Integer> numberSet = new HashSet<>(numbers);
        System.out.println("numberSet = " + numberSet);

        // list로 다시 변환
        numbers = new ArrayList<>(numberSet);
        System.out.println("numbers = " + numbers);
    }
  • 개별 탐색은 불가능하고 전체 탐색만 가능하다.
  • set은 보통 데이터 중복을 빠르게 제거할 때 사용한다.
  • list를 set으로 변환하여 중복을 제거하고 다시 list로 변환하여 사용 가능하다.

HashSet

  • Set의 특징을 그대로 가지고 있다.
  • 중복 저장 X, 데이터 순서 보장 X, 데이터 삽입 속도가 매우 빠르다.

TreeSet

  • 중복을 허용하지 않지만 Tree 구조를 활용하여 자동 정렬 기능을 가진다.

Map 인터페이스를 구현한 클래스

  • 키와 값을 하나의 쌍으로 저장
  • 키는 중복을 허용하지 않는다.

주요 메서드

  • 객체 추가 기능
  1. put(K key, V value): 주어진 키와 값을 추가, 정상적으로 저장되면 그 값(value)를 리턴.
  • 객체 검색 기능
  1. containsKey(Object Key): 주어진 키가 있는지의 여부를 확인.
  2. containsValue(Object value): 주어진 값이 있는지의 여부를 확인.
  3. get(Object key): 주어진 키에 들어있는 값을 리턴.
  4. isEmpty(): 컬렉션이 비어있는지의 여부를 확인.
  5. size(): 저장된 키의 총 수를 리턴.
  6. values(): 저장된 모든 값을 컬렉션에 담아서 리턴.
  7. keySet(): 저장된 모든 키를 Set객체에 담아서 리턴.
  8. entrySet(): 키와 값의 쌍으로 구성된 모든 Entry객체를 Set에 담아서 리턴.
  • 객체 삭제 기능
  1. clear(): 모든 Entry를 삭제
  2. remove(Object key): 주어진 키와 일치하는 Entry객체를 삭제.

HashMap

  • Map 인터페이스를 구현한 클래스 중 가장 흔한 클래스
  • 키를 중복하지 않게 하기 위해 equals() & hashCode() 메서드가 오버라이딩 된 객체를 key로 지정한다.
  • key는 대부분 String
  • 순서 보장 X

LinkedHashMap

  • Map의 특징을 가지고 있고 저장된 순서를 보장하고 싶을 때 사용하는 클래스
profile
백엔드 개발자
post-custom-banner

0개의 댓글