플레이데이터 - 16일차 자바 공부

Kim Hyen Su·2023년 7월 23일

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

컬렉션 프레임워크란?

  • 다수의 데이터를 관리하기 위한 클래스를 표준화 시킨 설계.
  • Collection : 데이터군 & Framework : 표준화 설계.

🐽Collection_List

  • 저장 순서를 유지(index)하고, 중복을 허용하는 컬렉션 클래스.
  • 구현 클래스
    • ArrayList
    • LinkedList
    • Stack
    • Vector

👉 ArrayList

  • Vector와 구현원리와 기능은 동일하다.
  • Object 배열을 사용하여 데이터를 순차적으로 저장한다.
  • 배열에 더 이상 저장할 공간이 없게되면 2배 큰 새로운 배열을 생성하여 기존의 배열에 저장된 요소를 새로운 배열로 복사 및 대입한다.
  • 내부 요소 삭제 시 반복문의 제어변수를 감소시켜가며, 끝에서부터 삭제해야 자리 이동에 영향을 받지 않고 삭제가 가능하다.
  • 용량(크기) 변경하는 경우, 배열을 사용하기 때문에 메모리 효율이 상대적으로 떨어지게 된다.

👉 LinkedList

  • ArrayList의 용량 변경 시 단점을 보완하고자 고안된 구현 클래스.
    • 배열의 단점 : 한번 생성된 배열의 크기 변경이 불가, 비순차적인 데이터의 추가 또는 삭제 시 시간 소요가 많이됨.
  • 불연속적인 값들을 서로 간의 참조값을 통해 연결한 리스트.
  • 비순차적인 데이터 삭제/추가가 간단하다.
  • 반면에, LinkedList의 이동방향은 단방향이므로, 직전 요소에 대한 접근성이 떨어지게 되는데 이를 보완한 것이 double-LinkedList이다.
  • 또한, LinkedList는 데이터 조회 시 첫 인덱스의 값부터 참조 Link를 타고 값을 조회하기 때문에, ArrayList에 비해 데이터 접근성이 떨어진다는 단점이 있다.

👉 ArrayList && LinkedList

ArrayList → 데이터 조회 (빠름) / 데이터 추가,삭제(느림) 
LinkedList → 데이터 조회(느림) / 데이터 추가,삭제(빠름)

👉 Stack과 Queue

  • Stack은 LIFO(Last In First Out) 구조, Queue는 FIFO(First In First Out) 구조.
  • 대표 메서드
    - push() : Stack 안에 데이터 추가.
    • offer() : Queue 안에 데이터 추가.
    • peek() : 내부 객체 삭제 없이 객체를 조회.
    • pop() : Stack 안에 객체 삭제 후 꺼낸 객체를 조회.
    • poll() : Queue 안에 객체 삭제 후 꺼낸 객체를 조회.

🐽Collection_Set

  • 저장 순서가 유지되지 않고, 중복을 허용하지 않는 컬렉션 클래스.
  • 구현 클래스
    • HashSet
    • SortedSet
      • TreeSet

👉 HashSet

  • Set 인터페이스를 구현한 가장 대표적인 컬렉션.
  • set에서 중복여부 확인은 equals()와 hashCode()의 반환값을 통해 구분한다.
  • 순서를 유지하기 위해서는 LinkedHashSet이라는 구현 클래스를 사용한다.

🐽Map

  • key와 value를 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스.
  • key는 중복이 안되고, value는 중복을 허용한다.
  • 기본에 저장된 데이터와 중복된 키에 새로운 값을 저장 시, 기존의 값은 사라진다.
  • Set과 마찬가지로, key는 중복이 불가하며, 이를 위해 key로 사용할 객체는 equals()와 hashCode()를 오버라이딩하여 중복여부를 확인할 수 있도록 해야한다.
  • 구현 클래스
    -
    • Hashtable
    • HashMap
      • LinkedHashMap
    • SortedMap
      • TreeMap
  • Map.Entry
    • Map 인터페이스 내부 인터페이스
    • Map에 저장되는 key-value 를 다루기 위해 내부적으로 정의됨.
    • Map 인터페이스를 구현하는 클래스에서는 Map.Entry 인터페이스도 함께 구현해준다.

🐽Iterator

  • 컬렉션에 저장된 요소에 접근하기 위해 사용하는 인터페이스.
  • 컬렉션 프레임워크에서 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화한 인터페이스.
  • Collection 인터페이스에 정의된 메서드 iterator()를 호출하여 Iterator 객체를 얻은 뒤 반복문을 사용하여 컬렉션 내 객체를 읽어온다.
  • Map 객체는 iterator()를 직접 호출할 수 없고, keySet() 또는 entrySet() 메서드를 호출하여 Set 형태로 변환 후 사용한다.

IO 입출력

🐽자바의 입출력

입출력이란?

  • 컴퓨터 내부 또는 외부 장치와 데이터를 주고 받는 것.

스트림과 보조스트림

  • 데이터를 전송하는 데 사용되는 연결 통로.
  • 스트림은 단방향 통신만 가능하기 때문에, 입력과 출력 각각 하나의 스트림이 필요하다.
  • 스트림은 먼저 전송된 데이터가 먼저 도착한다.
  • 보조 스트림은 스트림의 기능 확장을 위한 보조 역할로서, 실제 입출력은 기반 스트림에 의해 이뤄진다.

👉 바이트 기반 스트림

  • 1 byte 단위로 데이터를 전송하는 스트림.
  • 최상위 클래스로 입력(InputStream)과 출력(OutputStream)이 있다.
  • Java에서는 java.io 패키지에서 많은 종류의 입출력 관련 클래스를 제공하며, 입출력 처리의 표준화 방법을 제공한다.
  • read() : 입력, 읽어올 데이터가 없는 경우 -1을 반환.
  • write() : 출력
  • 대표 스트림
    -
    • FileInputStream과 FileOutputStream
      • 파일 입출력을 위한 스트림.

👉 바이트 기반 보조 스트림

BufferedInputStream / BufferedOutputStream

  • 1byte 씩 입출력하는 것에 비해 버퍼(buffer)를 이용하여 한번에 바이트배열에 담아 입출력하여 성능을 높여주는 스트림.

  • 출력 스티림에만 flush() 메서드가 있는 이유

    버퍼의 특성 상 버퍼의 용량이 다 채워져야 데이터 전송이 수행된다.
    즉, 버퍼의 용량보다 작은 데이터가 남은 상태에서 입출력을 종료하게 되면, 
    버퍼에 들어있던 데이터가 삭제되어 데이터 손실이 발생하게 된다. 
    
    출력 스트림의 경우 새로운 데이터를 전송하여 어딘가에 저장하기 위한 스트림이기
    때문에 다른 곳에 저장되어 있지 않으므로 데이터 손실 발생 시 데이터 복구가 불가하다.
    반면에 입력 스트림은 기존에 데이터가 존재하여 이를 읽어오는 것일 뿐이므로 flush()가 
    필요없다. 

DataInputStream / DataOutputStream

  • 입출력 시 byte 단위가 아닌 기본 자료형의 단위로 입출력이 가능하다.
  • 자료형마다 크기가 다르기 때문에 메서드마다 크기가 다르며, 데이터를 읽어올 경우 write()된 순서와 동일하게 읽어와야 한다.
  • 더이상 읽어올 값이 없으면 EOFException을 발생시킨다.
  • 따라서 다른 입력 스트림과 다르게 try~catch 구문으로 데이터를 읽어온다.

PrintStream

  • 데이터를 기반 스트림에 다양한 형태로 출력할 수 있도록 해주는 print, println, printf와 같은 메서드를 오버로딩하여 제공한다.

👉 문자 기반 스트림

  • Java에서 문자 단위의 기본 크기는 char 로서, 최소 2byte의 크기를 갖는다.
  • 따라서, 바이트 기반 스트림으로 문자를 전송하는데 어려움이 있어 문자 기반의 스트림이 제공된다.
  • 최상위 클래스로 입력(Reader)과 출력(Writer)이 있다.

👉 문자 기반 보조 스트림

BufferedReader / BufferedWriter

  • 버퍼를 이용하여 입출력의 효율을 높인 보조 스트림.
  • BufferedReader의 readLine() 메서드 사용 시 데이터를 줄단위로 읽어온다.

InputStreamReader / OutputStreamWriter

  • 바이트 기반 스트림을 문자 기반 스트림으로 연결해주는 매개역할을 한다.
  • 바이트 기반 스트림 내 데이터를 지정된 인코딩의 문자 데이터로 변환하여 입력 받을 수 있다.
profile
백엔드 서버 엔지니어

2개의 댓글

comment-user-thumbnail
2023년 7월 23일

공감하며 읽었습니다. 좋은 글 감사드립니다.

1개의 답글