1. 배열
데이터 관리
개발을 하다 보면 여러 다양한 데이터 처리를 위해 여러 개의 객체를 사용하게 되는 경우가 많습니다.
EX. 회원들의 여러 데이터를 받아서 평균값을 구한다던지...
이 경우 각각 변수로 선언하기보다는 한 곳에 묶어서 저장도 하고 검색도 하고 삭제도 하는 편의성이 필요합니다.
이를 해결하기 위한 가장 간단한 방법은 배열을 사용하는 것입니다.
public class Test {
public static void main(String[] args) {
// 배열 생성(배열 생성 시 저장할 개수 선언)
Member[] members = new Member[10];
// 객체 추가(저장)
members[0] = new Member("veneas", 28);
members[1] = new Member("mike", 26);
members[2] = new Member("jackson", 35);
// 객체 꺼내기(검색)
Member member = members[0];
System.out.println(member.getAge());
// 객체 삭제
members[1] = null;
}
static class Member {
private String name;
private Integer age;
public Member(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
}
}
배열의 한계점
배열은 위의 예시와 같이 매우 쉽게 생성하고 사용할 수 있지만 한계점이 있습니다.
1. 배열 생성 시 저장 할 수 있는 개수를 미리 선언해야합니다. 따라서 불특정 다수의 객체를 저장하기에는 한계가 있습니다. 그렇다고 많이 선언해서 메모리를 낭비하는 것은 좋지 않습니다.
Member[] members = new Member[10];
2. 배열의 특정 인덱스 객체를 삭제할 경우 해당 인덱스가 비어버리게 되어 비어있는지 확인을 해야 하는 코드가 필요하게 됩니다. (NullPointerException)
// 배열 생성(배열 생성 시 저장할 개수 선언)
Member[] members = new Member[10];
// 객체 추가(저장)
members[0] = new Member("veneas", 28);
members[1] = new Member("mike", 26);
members[2] = new Member("jackson", 35);
// 객체 꺼내기(검색)
Member member = members[0];
System.out.println(member.getAge());
// 객체 삭제
members[1] = null;
// 객체 꺼내기(에러 발생) -> 한계점
System.out.println(members[1].getAge()); //NullPointerException
2. 컬렉션 프레임워크의 등장
자바는 이런 배열의 단점을 해결하기 위해 자료구조를 바탕으로 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 java.util 패키지에 이와 관련된 인터페이스와 인터페이스를 구현한 클래스를 개발하여 포함시켜 놓습니다.
이러한 인터페이스와 구현 클래스들을 컬렉션 프레임워크라고 합니다.
※ 용어 정리
컬렉션: 수집해서 저장하는 것
프레임워크: 여러 기능을 가진 클래스와 라이브러리가 '특정 결과물을 구현하고자' 합쳐진 형태(사용 방법을 미리 정해 놓은 라이브러리)
라이브러리: 공통으로 사용될 수 있는 특정한 기능들을 모듈화한 것
[예시]
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
// List 인터페이스를 구현한 ArrayList 객체 생성(불특정 다수의 객체 저장 가능)
List<Member> memberList = new ArrayList<>();
// 객체 추가
memberList.add(new Member("veneas", 28));
memberList.add(new Member("mike", 26));
memberList.add(new Member("jackson", 35));
// 객체 검색
Member member = memberList.get(0);
System.out.println(member.getAge());
// 객체 삭제(객체 삭제 시 앞으로 한 칸씩 인덱스가 땡겨짐)
memberList.remove(1);
}
static class Member {
private String name;
private Integer age;
public Member(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
}
}
3. 컬렉션 프레임워크
- 주요 인터페이스는 List, Set, Map이 있습니다.
- List, Set 인터페이스는 둘 다 객체를 인덱스로 관리하고 그에 따라 공통기능이 많기 때문에 이 인터페이스의 공통된 기능(메소드)를 모아 Collection 인터페이스로 정의되어있습니다. (Collection 인터페이스 상속)
- Map 인터페이스는 객체를 키와 값으로 관리하는 방식으로 List, Set과는 완전 다른 구조로 따로 정의되어 있습니다.
그리고 이를 구현한 구현 클래스로는 다음과 같습니다.
List 인터페이스: ArrayList, Vector, LinkedList
Set 인터페이스: HashSet, TreeSet
Map 인터페이스: HashMap, Hashtable, TreeMap, Properties
※ 용어 정리
인터페이스: 클래스들이 구현해야 하는 동작을 지정하는데 사용되는 추상 자료형(사용하는 방법)
각 주요 인터페이스 특징
[List]
- 저장 순서 유지 O,
- 중복 저장 O
[Set]
- 저장 순서 유지 X,
- 중복 저장 X
[Map]
- 키와 값 형태로 저장
- 키는 중복 저장 X
'Backend > Java' 카테고리의 다른 글
[Java] Set 인터페이스 특징 및 구현체 (HashSet, LinkedHashSet, TreeSet) (0) | 2022.02.10 |
---|---|
[Java] List 인터페이스 특징 및 구현체 (ArrayList, LinkedList, Vector) (0) | 2022.02.09 |
[Java] 리턴 값이 있는 스레드 (Callable Interface) (0) | 2022.01.19 |
[Java] DTO to DTO (Stream API) (0) | 2022.01.18 |
[Java] Json 문자열 객체 형태로 바꾸기 (Json String To DTO) (0) | 2022.01.12 |