2021.11.18(목)
🌿 Collection
- Java = 클래스 기반 언어 -> Java에 있는 모든 내용(제공되는 것 + 내가 만드는 것)은 반드시 어떤 클래스 안에 들어가 있음
- 컬렉션(collection): [사전적 의미] 모음, 수집 -> [Java] 자료구조가 내장되어있는 클래스, Java에서 제공하는 자료구조를 담당하는 프레임워크 → 데이터가 새롭게 추가/삭제/수정되는 기능(알고리즘)들이 이미 정의되어있는 tool
자료구조: 데이터를 효율적으로 다룰 때(자료/데이터를 다루다 = 데이터 조회, 정렬, 추가, 수정, 삭제) 필요한 개념 -> 데이터 관리가 수월해짐
frame(틀)work(작업): 효율적인 기능들이 이미 정의되어 있는 틀/tool
- 다량의 데이터를 관리하고자 할 때 지금까지는 배열로 충분히 활용이 가능했음 vs 배열의 단점/불편한 점/한계(이지만 장점이 될 수도 있음)
1. 한 타입(type)의 데이터만 저장 가능
2. 배열 쓰고자 할 때 크기를 먼저 지정해야 함 -> 한 번 지정된 크기는 변경이 불가능; 새로운 값을 추가하고자 할 때 크기가 over될 경우, 새로운 크기의 배열을 만들고, 기존의 내용들을 복사하는 코드를 직접 짜야 함
3. 배열 중간 위치에 새로운 데이터를 추가/삭제하는 경우, 기존의 값들을 앞으로 당겨주거나 뒤로 밀어주는 코드를 직접 짜야 함 → 배열은 메모리 공간을 비교적 효율적으로 사용 가능
🌱 컬렉션의 장점
- 기본적으로 여러 타입의 데이터 저장 가능 vs generic 설정 -> 같은/한 타입의 데이터만 묶어서도 저장 가능
- 크기에 제약 없음; 굳이 크기 지정하지 않아도 됨; 만약 크기 지정을 했고 크기를 over하는 값을 더 추가하고자 할 때 알아서 크기가 늘어남
- 중간에 값을 추가/삭제하는 경우, 값을 앞으로 당겨주거나 뒤로 밀어주는 코드가 이미 메소드로 정의되어 있음 -> 그 때 그 때 필요한 메소드들 호출해서 사용하면 됨 -> 배열에 비해 메모리 공간이 조금 더 낭비됨
방대한 데이터를 담아만 두고 '조회'만 할 목적 -> 배열 사용 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 -> 다양한 타입의 값이 담길 수 있음
- 사용 이유
- 저장할 타입에 제한을 두기 위해서; 다른 타입은 저장 안 되도록 제한을 둠
- 매번 형 변환하는 절차를 없애기 위해서 -> 편리 + 실수 감소
→ 확고한 목적을 가지고 컬렉션 만드는 경우 제네릭 지정하는 것이 좋음
- 컬렉션 생성 시 제네릭 설정 표현법:
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 사용해서 바꿔보기
'back-end dev > Java' 카테고리의 다른 글
IntelliJ IDEA 설치(Mac OS) 및 환경 설정 (0) | 2022.08.02 |
---|---|
[KH정보교육원] 29일차_HashSet, HashMap, Properties (0) | 2021.11.19 |
[KH정보교육원] 27일차_Wrapper클래스, Input/Output (0) | 2021.11.17 |
[KH정보교육원] 26일차_String클래스 실습 (1) | 2021.11.16 |
[KH정보교육원] 25일차_API, Math클래스, String클래스 (0) | 2021.11.15 |