[JAVA] 컬렉션프레임워크(List / Set / Map)

Gabriela·2023년 7월 30일
0

JAVA

목록 보기
15/24
post-thumbnail

List


Array List

  • 패키지 : java.util
  • 배열(Array)을 리스트로 구현한 클래스
  • 배열보다 쉬운 사용법을 제공

ArrayList 주요 기능

  • 리스트 길이 자동 세팅
  • 요소의 추가/수정/삭제
  • 인덱스 기반의 접근
  • 특정 요소 조회
  • 리스트와 배열의 상호 변환

Array List 도식화


‣ ArrayList의 인터페이스 List 활용

• ArrayList의 생성 & 선언 & 수정 & 삭제

• 배열 요소 확인 & 초기화

• 메소드 리팩토링


  • .add() .get() .size() .set() .remove() 메소드 활용 예제
  public static void ex01() {
   
    // ArrayList의 인터페이스 List 타입 선언
    List<String> season;
   
    // ArrayList 생성
    season = new ArrayList<String>();
   
    // 배열 요소 추가하기
    season.add("여름");
    season.add("가을");
    season.add("겨울");
    season.add(0, "봄");   // arraycopy를 자동으로 대신 해줌
   
    // 배열 요소 확인하기
    System.out.println(season.get(0));  // .get()메소드로 배열 요소 확인 가능
    System.out.println(season.get(1));
    System.out.println(season.get(2));
    System.out.println(season.get(3));
  }
  public static void ex02() {
   
    // ArrayList의 선언 & 생성
    List<String> hobbies = new ArrayList<String>();
   
    // 배열 요소 추가하기
    hobbies.add("뜨개질");
    hobbies.add("독서");
    hobbies.add("코딩");
   
    // 배열 길이 확인하기 (저장된 요소의 갯수)
    System.out.println(hobbies.size());   // .size() 메소드 이용해서 배열에 저장된 전체 요소의 갯수 확인
   
    // 배열 길이 관련 (마지막 요소 꺼내기)
    System.out.println(hobbies.get(hobbies.size()-1));   // 마지막 요소의 인덱스 확인 공식 : .size() - 1
   
    // 배열 for문 적용하기 (순회)
    for(int i = 0; i < hobbies.size(); i++) {
      System.out.println(hobbies.get(i));   
    }
   
    // 배열 for문 적용하기 (리팩토링 : hobbies.size() 메소드가 여러 번 호출되는 문제 해결)
    for(int i = 0, length = hobbies.size(); i < length; i++) {    // 초기화 블록에서 리팩토링 했음. hobbies.size()메소드가 한번만 호출 됨.
      System.out.println(hobbies.get(i));
    }
  }
  public static void ex03() {
   
    // ArrayList 선언 & 생성
    List<String> flower = new ArrayList<String>();
   
    // 요소 추가하기
    flower.add("장미");
    flower.add("튤립");
    flower.add("무궁화");
   
    // 요소 수정하기
    flower.set(0, "백일홍");   // 인덱스 0의 요소를 "백일홍"으로 수정      .set(인덱스, 수정할내용)
   
    // 요소 삭제하기
    flower.remove(1);   // 인덱스 1의 요소를 삭제    .remove(삭제할인덱스)
   
    // 요소 확인
    for(int i = 0, length = flower.size(); i < length; i++) {
      System.out.println(flower.get(i));
    }
  } 
  public static void ex04() {
   
    // 배열을 ArrayList로 바꾸기
    Integer[] a = {10, 20, 30, 40, 50};
    List<Integer> numbers = Arrays.asList(a);   // Array.asList(T...a)로 초기화
   
    // 주의!!!!  초기화 된 ArrayList는 길이를 변경할 수 없다.
    // numbers.add(60);    추가 불가능
    // numbers.remove(0);  삭제 불가능
   
    // for문
    for(int i = 0, length = numbers.size(); i < length; i++) {
      System.out.println(numbers.get(i));
    }
  }  
   public static void ex05() {
   
    // ArrayList 초기화
    List<Integer> numbers = Arrays.asList(10, 20, 30, 40, 50);
   
    // for문 
    for(int i = 0, length = numbers.size(); i < length; i++) {
      System.out.println(numbers.get(i));
    }
  } 

(주석 참고)


Set


HashSet

  • 패키지 : java.util
  • 집합을 관리하기 위한 자료 구조
  • 중복된 요소가 저장되지 않는 특성을 가짐
  • 인덱스가 없어 순서대로 저장되지 않는 특성을 가짐
  • 해시(Hash)를 이용하기 때문에 삽입, 삭제, 검색이 빠름

HashSet 주요 기능

  • 세트 길이 자동 세팅
  • 요소의 추가/수정/삭제
  • 리스트와 세트의 상호 변환
  • 교집합, 합집합, 차집합, 부분집합 등 집합 연산

(Hash는 어떤 데이터가 가지고있는 정수값이다. 
  유사한 데이터들은 동일한 해쉬 값을 가지고 관리할 수 있도록
  알고리즘을 짜서 부여한 특정한 정수값을 해쉬라고 한다.)

‣ HashSet 활용 예제

  public static void ex01() {

    // Set 인터페이스 타입 선언
    Set<String> season;

    // HashSet 클래스 객체 생성
    season = new HashSet<String>();

    // 요소 추가하기
    season.add("봄");
    season.add("여름");
    season.add("가을");
    season.add("겨울");
    season.add("봄");

    // 전체 확인
    System.out.println(season);
  }
  // 향상 for문 활용
  public static void ex02() {

    // HashSet 선언 & 생성
    Set<String> hobbies = new HashSet<String>();

    // 요소 저장하기
    hobbies.add("독서");
    hobbies.add("요리");
    hobbies.add("운동");
    hobbies.add("체스");

    // for문 활용하기(인덱스가 없으므로 향상 for문)
    for (String hobby : hobbies) {
      System.out.println(hobby);
    }
  }
  // while문 활용
  public static void ex03() {

    // HashSet 선언 & 생성
    Set<String> flower = new HashSet<String>();

    // 요소 저장하기
    flower.add("국화");
    flower.add("튤립");
    flower.add("프리지아");
    flower.add("물망초");

    // 반복자 Iterator를 이용한 Set 순회 (인덱스가 없을 때 간혹 사용 가능한 형태이다.)
    Iterator<String> arm = flower.iterator();

    // 조건 : arm.hasNext() (true or false)
    // 실행 : System.out.println(arm.next());
    while (arm.hasNext()) {
      System.out.println(arm.next());
    }
  }
  public static void ex04() {
   
    // 동일한 객체 2개
    Person p1 = new Person("홍길동", 30);
    Person p2 = new Person("홍길동", 30);
   
    // HashSet 선언 & 생성
    Set<Person> people = new HashSet<Person>();
   
    // 요소 추가
    people.add(p1);
    people.add(p2);
   
    // 확인
    System.out.println(people);
  }
  public static void ex05() {

    // ArrayList 선언 & 생성
    List<Integer> numbers1 = Arrays.asList(1, 2, 3, 4, 5);
    List<Integer> numbers2 = Arrays.asList(6, 7, 3, 4, 5);

    // ArrayList를 이용해서 HashSet 생성
    Set<Integer> set1 = new HashSet<Integer>(numbers1);
    Set<Integer> set2 = new HashSet<Integer>(numbers2);

    // 교집합
    set1.retainAll(set2); // 교집합 결과는 set1에 저장된다.

    System.out.println(set1); // [3, 4, 5]
  }
  public static void ex06() {

    // ArrayList 선언 & 생성
    List<Integer> numbers1 = Arrays.asList(1, 2, 3, 4, 5);
    List<Integer> numbers2 = Arrays.asList(6, 7, 3, 4, 5);

    // ArrayList를 이용해서 HashSet 생성
    Set<Integer> set1 = new HashSet<Integer>(numbers1);
    Set<Integer> set2 = new HashSet<Integer>(numbers2);

    // 합집합
    set1.addAll(set2); // 합집합 결과는 set1에 저장된다.

    System.out.println(set1); // [1, 2, 3, 4, 5, 6, 7]
  }
  public static void ex07() {

    // ArrayList 선언 & 생성
    List<Integer> numbers1 = Arrays.asList(1, 2, 3, 4, 5);
    List<Integer> numbers2 = Arrays.asList(6, 7, 3, 4, 5);

    // ArrayList를 이용해서 HashSet 생성
    Set<Integer> set1 = new HashSet<Integer>(numbers1);
    Set<Integer> set2 = new HashSet<Integer>(numbers2);

    // 차집합
    set1.removeAll(set2); // 차집합 결과는 set1에 저장된다.

    System.out.println(set1); // [1, 2]
  }

(주석 참고)


Map

  • mapping : 어떤 약속된 조회방식으로 데이터를 찾는 방식이다.

HashMap<K, V>

  • 패키지 : java.util

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

  • 객체(Object)/인스턴스(Instance)를 대신할 수 있는 자료구조이다.

  • 용어

    • Entry : Key + Value를 합쳐서 부르는 말
    • Key : 데이터를 식별하는 식별자(변수명)
    • Value : 데이터 자체(변수에 저장된 값)
    • Map.of(K,V) : Key와 Value를 최대 10개까지 입력(등록) 할 수 있다.
  • 특징

    • Key중복불가능하다. (HashSet구조로 되어 있다.)
    • Value중복가능하다.
    • Key와 Value 모두 Generic 처리한다. (key와 value의 타입을 각각 잡아줘야 한다는 의미이다.)

HashMap 주요 기능

  • 요소의 삽입/삭제/수정
    • put / Map.of(K,V)
  • 일치하는 키(Key) 검색
  • 일치하는 값(Value) 검색

Map.of(K,V) 사용시 주의사항

  • KeyValueNull값이 들어 있으면 NullPointException이 발생한다.
  • Null을 값으로 담을땐 사용이 불가하다.

‣ HashMap 활용 예제

  public static void ex01() {
   
    // Map 인터페이스 타입으로 HashMap 선언
    Map<String, String> dict;
   
    // HashMap 생성
    dict = new HashMap<String, String>();
   
    // Entry 저장(Key, Value)
    dict.put("봄", "spring");    // 저장은 Entry단위로 한다.
    dict.put("여름", "summer");
    dict.put("가을", "autumn");
    dict.put("겨울", "winter");
   
    // Value 확인(Key를 전달한다.)
    System.out.println(dict.get("봄"));
    System.out.println(dict.get("여름"));
    System.out.println(dict.get("가을"));
    System.out.println(dict.get("겨울"));
  }
  public static void ex02() {
   
    // HashMap 선언 & 생성
    // Map에서는 Value를 하나의 타입으로 저장해야한다. 그렇기 때문에 String, int 형식으로 저장하고자 하면 모든 타입을 저장 할 수 있는 만능타입인 Object을 활용한다.
    Map<String, Object> person = new HashMap<String, Object>();
   
    // Entry 저장(Key는 변수명으로, Value는 변수 값으로 저장)
    person.put("name", "홍길동");
    person.put("age", 30);
   
    // Entry 수정(기존의 Key를 사용하면 해당 Key의 Value가 수정되는 방식)
    person.put("name", "제시카");
    person.put("age", 40);
   
    // Value 확인
    System.out.println(person.get("name"));
    System.out.println(person.get("age"));
  }
  public static void ex03() {
   
    // HashMap 선언 & 생성
    Map<String, Object> map = new HashMap<String, Object>();
   
    // Entry 저장
    map.put("top", 10);
    map.put("bottom", 20);
    map.put("left", 30);
    map.put("right", 40);
   
    // 반복자(Iterator)를 이용한 HashMap 순회
    // 1. Map에서 Key만 모두 꺼내서 Set에 저장한다.(keySet 메소드)
    // 2. Set에 반복자(Iterator)를 붙여서 key를 하나씩 꺼낸다.
    // 3. get() 메소드에 Key를 전달하면 Value가 나온다.
    Set<String> keySet = map.keySet();
    Iterator<String> arm = keySet.iterator();
    while(arm.hasNext()) {
      String key = arm.next();
      Object vaule = map.get(key);
      System.out.println(key + ": " + vaule);
    }   // 값을 출력할 때 순서는 원래 안 지켜짐. 값을 전달하는 목적으로 사용한다.
  }
  public static void ex04() {
   
    // HashMap 선언 & 생성
    Map<String, Object> map = new HashMap<String, Object>();
   
    // Entry 추가
    map.put("id", "admin");
    map.put("pw", 1234);
    map.put("role", "DBA");
   
    // for문을 이용한 Map의 순회 (주로 Entry 단위로 값을 빼는 entrySet() 메소드 활용)
    for(Entry<String, Object> entry : map.entrySet()) {   // Map.Entry<> 라고 적기도 하지만 필수는 아니다.
      String key = entry.getKey();
      Object value = entry.getValue();
      System.out.println(key + " : " + value);
    }
  }  

(주석 참고)


import

  • 자바의 라이브러리나 다른 패키지 안에 있는 클래스를 사용 할 때 패키지 명을 적지 않고 클래스를 사용할 수 있도록 미리 명시하는 명령어이다.

  • java.lang.패키지만 유일하게 임포트 생략이 가능하다.


리팩토링

  • 동일한 메소드를 의미없이 반복 호출 하는것은 성능의 저하를 일으키기 때문에 리팩토링 하면 성능 향상 효과가 있다.

profile
개발이 세상에서 제일 재밌어요

0개의 댓글

관련 채용 정보