초록꼬마의 devlog
article thumbnail

2021.11.18(목)

🌿 Collection

  • Java = 클래스 기반 언어 -> Java에 있는 모든 내용(제공되는 것 + 내가 만드는 것)은 반드시 어떤 클래스 안에 들어가 있음
  • 컬렉션(collection): [사전적 의미] 모음, 수집 -> [Java] 자료구조가 내장되어있는 클래스, Java에서 제공하는 자료구조를 담당하는 프레임워크 → 데이터가 새롭게 추가/삭제/수정되는 기능(알고리즘)들이 이미 정의되어있는 tool

자료구조: 데이터를 효율적으로 다룰 때(자료/데이터를 다루다 = 데이터 조회, 정렬, 추가, 수정, 삭제) 필요한 개념 -> 데이터 관리가 수월해짐

frame(틀)work(작업): 효율적인 기능들이 이미 정의되어 있는 틀/tool

출처: 학원 제공 자료

  • 다량의 데이터를 관리하고자 할 때 지금까지는 배열로 충분히 활용이 가능했음 vs 배열의 단점/불편한 점/한계(이지만 장점이 될 수도 있음)

1. 한 타입(type)의 데이터만 저장 가능

2. 배열 쓰고자 할 때 크기를 먼저 지정해야 함 -> 한 번 지정된 크기는 변경이 불가능; 새로운 값을 추가하고자 할 때 크기가 over될 경우, 새로운 크기의 배열을 만들고, 기존의 내용들을 복사하는 코드를 직접 짜야 함

3. 배열 중간 위치에 새로운 데이터를 추가/삭제하는 경우, 기존의 값들을 앞으로 당겨주거나 뒤로 밀어주는 코드를 직접 짜야 함 → 배열은 메모리 공간을 비교적 효율적으로 사용 가능

🌱 컬렉션의 장점

  1. 기본적으로 여러 타입의 데이터 저장 가능 vs generic 설정 -> 같은/한 타입의 데이터만 묶어서도 저장 가능
  2. 크기에 제약 없음; 굳이 크기 지정하지 않아도 됨; 만약 크기 지정을 했고 크기를 over하는 값을 더 추가하고자 할 때 알아서 크기가 늘어남
  3. 중간에 값을 추가/삭제하는 경우, 값을 앞으로 당겨주거나 뒤로 밀어주는 코드가 이미 메소드로 정의되어 있음 -> 그 때 그 때 필요한 메소드들 호출해서 사용하면 됨 -> 배열에 비해 메모리 공간이 조금 더 낭비됨

방대한 데이터를 담아만 두고 '조회'만 할 목적 -> 배열 사용 vs 방대한 데이터가 추가/수정/삭제될 경우 -> 컬렉션 사용

🌱 컬렉션의 종류 3가지

  • 컬렉션 프레임워크에서는 컬렉션 데이터 그룹을 3가지 타입이 존재한다고 인식 → 각 컬렉션을 다루는 데에 필요한 기능을 가진 3개의 인터페이스 정의, 용도에 따라 장단점 다름

출처: 학원 제공 자료

1. List 계열: 담고자 하는 값(value)만 저장; 저장 시 순서 유지(index 있음); 중복 값 허용
e.g. ArrayList(가장 많이 쓰임), LinkedList, Vector, Stack 등


2. Set 계열: 담고자 하는 값(value)만 저장; 저장 시 순서 유지x; 중복 값 허용x
e.g. HashSet, TreeSet 등


3. Map 계열: 키(key) + 값(value) 세트로 저장; 저장 시 순서 유지x; 중복 키 허용x + 중복 값 허용
e.g. HashMap, HashTable, TreeMap, Properties 등

🌿 List

  • 자료들을 순차적으로 나열한 자료구조
  • 인덱스로 관리됨(순서 유지됨) + 중복해서 객체 저장 가능

🌱 주요 메서드

출처: 학원 제공 자료

🌱 ArrayList

  • 초기 저장 용량은 10으로 자동 설정됨, 또는 따로 지정도 가능
  • 저장 용량을 초과한 객체들이 들어오면 자동으로 늘어나며, 고정도 가능
  • 동기화(synchronization) 제공하지 않음

동기화(synchronization): 하나의 자원/데이터에 대해 여러 스레드가 접근하려 할 때 한 시점에서 하나의 스레드만 사용할 수 있도록 하는 것

🌿 제네릭(Generic)

  • 제네릭(Generic) <E>: 컬렉션 안에서 다룰 타입들을 미리 지정해주는 역할 → 명시적으로 쓰면 객체의 형 변환 사용할 필요 없음, 내가 사용하고 싶은 타입만 사용할 수 있게 해줌
    • e.g. <Music>으로 제네릭을 제시한 경우, E(Object) == Music; E가 Music으로 바뀜 vs 별도의 제네릭 제시 없이 컬렉션 객체 생성 시, E == Object -> 다양한 타입의 값이 담길 수 있음
  • 사용 이유
    1. 저장할 타입에 제한을 두기 위해서; 다른 타입은 저장 안 되도록 제한을 둠
    2. 매번 형 변환하는 절차를 없애기 위해서 -> 편리 + 실수 감소
      → 확고한 목적을 가지고 컬렉션 만드는 경우 제네릭 지정하는 것이 좋음
  • 컬렉션 생성 시 제네릭 설정 표현법: ArrayList<E> list = new ArrayList<>();

💻 실습

  • 음악 CRUD하는 음악 Library/관리 프로그램을 MVC 아키텍처 적용해서 구현하기

용도별 패키지 구분
M/Model = 데이터를 담당하는 역할(model.vo: 값을 담음; model.dao: 값 처리)
V/View = 사용자가 보는 화면 처리/시각적인 요소 + 입력, 출력 -> View가 아닌 곳에서 입/출력문 사용 자제하기
C/Controller = 사용자가 화면을 통해 요청한 것을 받아서 처리하고 결과를 돌려주는 역할

- vo 클래스 먼저 생성(IDE가 제공하는 자동 생성 기능 활용해서 빠르게 구현)
- 프로그램 설계가 이미 끝났다면 View단부터 만들기

📗 소감

  • 배열을 사용하면서 불편하거나 한계라고 했던 점을 보완하는 자료구조가 Java에 제공된다니 편리하고 반갑다!
  • 앞으로 필요한 경우에 배열 또는 리스트를 적재적소에 활용하고 싶다
  • 제네릭의 개념이 아직 정확히 이해가 안 가는데, 좀 더 찾아서 읽어봐야겠다

📗 homework: 기존 배열 사용한 과제들을 ArrayList 사용해서 바꿔보기