SEB_BE 16일차 - 컬렉션

subimm_·2022년 9월 13일
0

코드스테이츠

목록 보기
16/83

💡 오늘의 학습목표

  • 열거형
  • 제네릭
  • 예외 처리
  • 컬렉션

📔 열거형 (Enum)

  • 서로 연관된 상수들의 집합
// enum 열거형 이름 { 상수명1, 상수명2, ...}
enum Seasons { SPRING, SUMMER, FALL, WINTER }
// 자동적으로 0부터 시작되는 정수값이 할당됨.

enum으로 정의한 상수는 switch문에서도 사용이 가능

  • 여러 상수들을 보다 편리하게 선언하고 관리, 상수명 중복을 피하고 타입 안정성 보장
//열거형이름.상수명
System.out.println(Seasons.SUMMER); // SUMMER

열거형에서 사용할 수 있는 메서드
name() - 열거 객체가 가지고 있는 문자열 리턴 상수 이름과 동일
ordinal() int형 - 열거 객체의 순번(0부터시작)을 리턴
compareTo(비교값) int형 - 주어진 매개값과 비교해서 순번 차이를 리턴
valueOf(Stringname) - 주어진 문자열의 열거 객체를 리턴
values() - 모든 열거 객체들을 배열로 리턴


📙 제네릭 (Generic)

  • 클래스나 메서드의 코드 작성 시 타입을 추후에 지정할 수 있도록 일반화
  • <>를 사용
    • 래퍼 클래스 : 기본 자료타입을 객체로 다루기 위해 사용하는 클래스

      <> 안에 바꿔줄 타입을 넣을 때 래퍼 클래스 사용

📖 제네릭 클래스 정의

제네릭이 사용된 클래스 = 제네릭 클래스

class Basket<T> { // 타입 매개변수 T 선언
	private T item; // 임의의 타입으로 사용 가능
}

T - Type K - Key V - Value
E - Element N - Number R - Result

  • 주의할 점
    static이 붙는 클래스 변수에는 타입 매개변수 사용할 수 없음
class Basket<T> {
	private T item1; // O
    static T item2; // X
}
  • 제네릭 클래스 사용
    타입 매개변수에 치환될 타입으로는 래퍼 클래스 활용
Basket<String> basket1 = new Basket<>("Java");
Basket<Integer> basket2 = new Basket<>(5);
Basket<Double> basket3 = new Basket<>(2.24);
  • 제네릭 클래스에서도 다형성 적용 가능

📖 제한된 제네릭 클래스

  • 타입 매개변수 선언 시 <T extends 클래스명> 로 코드를 작성하면 인스턴스화 할 때 타입으로 선언된 클래스의 하위 클래스만 지정하도록 제한
  • 특정 인터페이스를 구현한 클래스만 타입으로 지정할 수 있도록 제한 가능
  • 특정 클래스 상속과 동시에 특정 인터페이스를 구현한 클래스만 타입으로 지정할 수 있도록 제한하려면 & 사용 (클래스가 인터페이스보다 앞에 위치)

📖 제네릭 메서드

  • 클래스 내부의 특정 메서드만 제네릭으로 선언
    반환타입 앞에서 타입 매개변수 선언 (해당 메서드 내에서만 사용 가능)
class Basket<T> { // 클래스에서 선언한 타입 매개변수 T와
	...
    public <T> void add(T element) { // 메서드에서 선언한 T는 서로 다르다.
    	...
    }
}
  • 클래스명 옆에 선언한 타입 매개변수는 클래스가 인스턴스화 될 때 타입 지정
  • 메서드 앞 타입 지정은 메서드가 호출될 때 이루어짐.
Basket<String> basket = new Basket<>(); // 객체의 T가 String으로 지정
basket.<Integer> add(5); // 메서드의 T가 Integer로 지정
basket.add(5); // 타입 지정 생략 가능
  • 메서드에서 타입 매개변수는 static 메서드에도 선언 가능
  • length()와 같은 String 클래스의 메서드는 제네릭 메서드를 정의하는 시점에 사용 불가
  • 최상위 클래스 Object 클래스의 메서드는 사용 가능
class Basket {
	public <T> void print(T item) {
    	System.out.println(item.length()); // 사용 불가
       // System.out.println(item.equals("Hello")); 사용 가능
   }
}

📖 와일드 카드

  • 어떠한 타입으로든 대체될 수 있는 타입 파라미터 ? 기호로 사용
    일반적으로 와일드카드는 extendssuper 키워드 조합 사용
<? extends T> // 상한제한 T와 T를 상속받은 하위 클래스 타입만 타입 파라미터로 받을 수 있도록 지정
<? super T> // 하한제한 T와 T의 상위 클래스만 타입 파라미터로 받도록 함.

📔 예외 처리

  • 에러에 대응할 수 있는 코드를 미리 사전에 작성하여 비정상적인 종료를 방지

  • 컴파일 에러 / 런타임 에러

    • 컴파일 에러
      컴파일 할 때 발생하는 에러 ( ;생략, 오탈자, 잘못된 자료형, 잘못된 포맷 등)
      문법적인 문제를 가리키는 신택스(syntax) 에러

    • 런타임 에러
      런타임 시에 발생하는 에러 (프로그램 실행 시)
      컴퓨터가 수행할 수 없는 특정한 작업 요청시 발생
  • 모든 예외의 최고 상위클래스 Exception 클래스

    • 일반 예외 클래스(Exception)
      주로 잘못된 클래스명이나 데이터 형식 checked 예외
    • 실행 예외 클래스(Runtime Exception)
      런타임 시 발생하는 클래스와 그 하위클래스
      개발자의 실수에 의해 발생 unchecked 예외

📖 try - catch 문

  try { 
  //예외가 발생할 가능성이 있는 코드
  }
  catch (ExceptionType1 e1) {
  //ExceptionType1 유형의 예외 발생 시 실행할 코드
  }
  catch (ExceptionType2 e2) {
  //ExceptionType2 유형의 예외 발생 시 실행할 코드
  }
  finally {
  	//finally 블럭은 옵션
  //예외 발생 여부와 상관없이 항상 실행됨
  }

예제

  • 예외 전가
    예외를 호출한 곳으로 다시 예외를 떠넘기는 방법 throws 사용

    반환타입 메서드명(매개변수, ...) throws 예외클래스1, 예외클래스2, ...{
    ...
    }
  • 의도적인 예외 발생시키기 throw 사용


📙 컬렉션 프레임워크

  • 데이터들의 집합 컬렉션, 컬렉션을 다루는 데에 편리한 메서드들을 미리 정의해놓은 것

    • List
    1. 데이터의 순서가 유지, 중복 저장 가능
    2. ArrayList, Vector, Stack, LinkedList 등이 List 인터페이스를 구현

    • Set
      1. 데이터의 순서 유지x, 중복 저장 불가
      2. HashSet, TreeSet 등이 Set 인터페이스를 구현

    • Map
    1. 키(key)와 값(value)의 쌍으로 데이터를 저장하는 컬렉션을 구현하는데 사용
    2. 데이터의 순서 유지x, 키는 중복 저장 불가, 값은 중복 저장 가능
    3. HashMap, HashTable, TreeMap, Properties 등
    • List와 Set은 Collection이라는 인터페이스로 묶인다.

📖 Collection 인터페이스

📜 List<E>

  • 배열과 같이 객체를 일렬로 늘어놓은 구조
  • 인덱스로 관리, 객체를 저장하면 자동으로 인덱스가 부여되고 검색, 추가, 삭제 기능 제공

List 컬렉션에서 공통적으로 사용 가능한 주요 메소드

  • List 인터페이스를 구현한 클래스로는 ArrayList, Vector, LinkedList, Stack 등이 있다.
    • ArrayList
      List 인터페이스를 구현한 클래스 가장 많이 사용
      데이터가 연속적으로 존재하며, 자동으로 저장용량이 늘어난다.

      • 저장할 객체 타입을 제네릭으로 표기하고 기본 생성자 호출

        List<타입 매개변수> 객체명 = new ArrayList<타입 매개변수>(초기 저장용량);
        List<String> container1 = new ArrayList<String>();
        // String 타입의 객체를 저장하는 ArrayList 생성
        // 초기 용량을 정해주지 않으면 기본적으로 10으로 지정됨.
        List<String> container = new ArrayList<String>(30);
        // String 타입의 객체를 저장하는 ArrayList 생성
        // 초기 용량을 30으로 지정함.
      • 특정 인덱스의 객체를 제거하면 바로 뒤 인덱스부터 마지막 인덱스까지 모두 1씩 당겨짐.

  • LinkedList
    데이터를 효율적으로 추가, 삭제, 변경하기 위해 사용
    불연속적으로 존재, 데이터는 서로 연결되어 있음.
  • 데이터를 삭제하거나 추가하려면 링크를 끊거나 이어주는 방식.
  • ArrayList와 LinkedList의차이

    ArrayList의 장점

    1. 데이터를 순차적으로 추가하거나 삭제하는 경우
    2. 데이터를 읽어들이는 경우

    LinkedList의 장점

    1. 중간에 위치하는 데이터를 추가하거나 삭제하는 경우
      (Prev와 Next의 주소값만 변경하면 됨.)

      데이터의 잦은 변경이 예상된다면 LinkedList를, 데이터의 개수가 변하지 않으면 ArrayList를 사용

📜 Iterator

  • 반복자, 컬렉션에 저장된 요소들을 순차적으로 읽어오는 역할
  • Collection 인터페이스에 정의된 iterator() 를 호출하면 iterator 타입의 인스턴스 반환
    • Iterator 인터페이스에 정의된 메서드
      hasNext() - 읽어올 객체가 남아있으면 true, 없으면 false 리턴
      next() - 컬렉션에서 하나의 객체를 읽어옴.
      (호출 전 hasNext()를 통해 읽어올 다음 요소가 있는지 먼저 확인)
      remove() - next()를 통해 읽어온 객체 삭제
      (호출 전 next() 먼저 호출)
    List<String> list = ...;
      Iterator<String> iterator = list.iterator();
      While(iterator.hasNext()){ //다음 객체가 있다면
      	String str = iterator.next(); // 객체를 읽어오고
      	if(str.equals("str과 같은 단어")) { // 조건에 부합한다면
      		iterator.remove(); // 해당 객체를 컬렉션에서 제거한다.
      	}
    }

📜 Set <E>

  • 요소의 중복을 허용하지 않고, 저장 순서를 유지x 대표적으로 HashSet TreeSet 이 있다.
  • HashSet
    • 대표적인 Set 인터페이스 구현 클래스로 중복 x, 순서 유지 x

      값 추가 시 중복된 값 판단 과정

      1. add(Object o)를 통해 객체를 추가하고자 한다.
      2. 저장하고자 하는 객체의 해시코드를 hashCode() 메서드로 얻기
      3. Set이 저장하고 있는 모든 객체들의 해시코드를 hashCode() 로 얻기
      4. 해시코드를 서로 비교하여 같은 해시코드가 있는지 검사
        a. 같은 해시코드를 가진 객체가 존재하면 5번으로
        b. 존재하지 않으면 객체가 추가되며 `add(Object o) 메서드가 true 리턴
      5. equals() 메서드로 객체 비교

  • TreeSet
    이진 탐색 트리 형태로 데이터 저장
    하나의 부모 노드가 최대 두개의 자식 노드와 연결되는 이진 트리
    정렬과 검색에 특화
    • 모든 왼쪽 자식의 값이 루트나 부모보다 작고, 오른쪽 자식의 값은 크다.
    • 데이터를 추가할 때 정렬을 실시

📜 Map<K, V>

  • 키(key) 와 값(value)로 구성된 객체를 저장하는 구조 - Entry 객체
  • 키는 중복 저장 x 값은 중복 저장 o
  • Map의 주요 메서드
    • HashMap
      많은 양의 데이터를 검색하는 데 있어서 뛰어난 성능

      Entry 객체는 Map인터페이스의 내부 인터페이스인 Entry 인터페이스를 구현

      • Map.Entry 인터페이스의 메서드

    HashMap 생성

    HashMap<String, Integer> hashmap = new HashMap<>();

회고

저번 클래스 파트부터 뭔가 정리가 잘 되지 않는 느낌이다ㅠㅠ 컨텐츠 학습 외 따로 공부를 많이 하고 실습을 하면서 정리를 해야 할 것 같은데 자꾸 모르니까 더 하기싫고 밀리는 기분,, 내일 컬렉션 연습문제 풀어야 하는데 걱정이 된다ㅠㅠ

profile
코린이의 공부 일지

0개의 댓글