오봉이와 함께하는 개발 블로그
컬렉션 프레임워크 - ArrayList 본문
728x90
컬렉션 프레임워크(Collection Framework)
- 컬렉션
- 사전적 의미로 요소(객체)를 수집해 저장한 것
- 프레임워크
- 라이브러리 프로그래밍 방식
- 표준화, 정형화된 체계적인 프로그래밍 방식
- 미리 정해진 방식대로 개발
- 누가 작성하든 프로그램이 표준화되기 때문에 프로그램 유지보수하기 쉬워진다.
- 컬렉션 프레임워크
- 컬렉션(다수의 객체)를 다루기 위한 표준화된 프로그래밍 방식
- 많은 양의 데이터를 저장, 삭제, 검색, 비교, 정렬 작업 등을 편리하게 쉽게 수행
- 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 제공되는 컬렉션 라이브러리
- 인터페이스를 통해서 정형화된 방법으로 다양한 컬렉션 클래스 이용
- 인터페이스와 다형성을 이용한 객체지향적 설계를 통해 표준화 되어 있기 때문에 사용법 편하고 재사용성이 높은 코드 작성 가능
- 프로그래머의 프로그래밍 부담을 많이 덜어 줌
- java.util. * 패키지에 포함
- 컬렉션(다수의 객체)를 다루기 위한 표준화된 프로그래밍 방식
- 자바 컬렉션
- 객체를 수집해서 저장하는 역할
- 프레임워크
- 사용법을 미리 정해 놓은 라이브러리
- 컬렉션 클래스
- 다수의 데이터를 저장할 수 있는 클래스
- 예 : ArrayList, Linked List, Vector, HashSet, TreeSet
- 컬렉션 프레임워크의 주요 인터페이스
- List
- 순서가 있는 데이터의 집합, 데이터의 중복을 허용한다.
- ArrayList, Linked List, Vector
- Set
- 순서를 유지하지 않는 데이터의 집합, 데이터의 중복을 허용하지 않는다.
- HashSet
- TreeSet
- Map
- Key-Value 쌍으로 이루어진 데이터의 집합, 순서는 유지되지 않으며 키는 중복을 허용하지 않고, 값은 중복을 허용한다.
- HashMap
- HashTable
- TreeMap
- Properties
- List와 Set의 공통된 부분을 뽑아서 새로운 인터페이스 Collection이 추가로 정의되었음
- Map은 List/Set과 전혀 다른 형태로 컬렉션을 다루기 때문에 같은 상속 계층에 포함되지 못했음
- List
- 컬렉션 프레임워크 특징
- List, Set, Map 인터페이스 이름이 클래스 이름에 포함되어 있음
- 이름만으로도 클래스의 특징을 쉽게 알 수 있다.
- Vector, Stack, HashTable, Properties와 같은 클래스들은 컬렉션 프레임워크가 만들어지기 전부터 존재했기 때문에 컬렉션 프레임워크 명명법을 따르지 않음
- Vector나 HashTable 등 기존 컬렉션 클래스들은 이전에 작성된 프로그램들과 호환을 위해 설계를 변경해서 남겨둔 것임
- 가능하면 ArrayList와 HashMap 사용 추천
List 인터페이스의 특징 및 주요 메소드
- 특징
- 순서가 있는 집합
- 인덱스로 관리
- 중복해서 객체 저장 가능
- 구현 클래스
- ArrayList
- LinkedList
- Vector
- 주요 메소드
- add(), get(), inEmpty(), size(), remove(), clear()
ArrayList
- List 인터페이스의 구현 클래스
- 크기가 가변적으로 변하는 선형 리스트
- 배열과 유사(순차리스트, 인덱스 사용)
- 배열과 차이점
- 배열 : 크기 고정
- ArrayList : 객체 추가 가능, 저장 용량 초과 시 자동으로 저장 용량 증가
- 단점
- 데이터를 읽어오고 저장하는데는 효율적이지만, 용량을 변경해야 할 때는 새로운 배열을 생성한 후 기존 배열로부터 새로운 배열로 복사해야 하기 때문에 상당히 비효율적
- 따라서 처음에 생성할 때 저장할 데이터의 개수를 잘 고려하여 충분한 용량으로 생성하는 것이 좋다.
- 사용법
- 객체 추가
- 인덱스 0부터 차례로 저장
- 객체 제거
- 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 이동
- 따라서 빈번한 객체 삭제와 삽입이 일어나는 경우 ArrayList를 사용하는 것이 바람직하지 않음 -> Linked List
- 객체 추가
// 제네릭을 사용하지 않을 경우 형변환 필요
List list = new ArrayList();
list.add("abc");
String str = (String)list.get(0);
// 제네릭을 사용할 경우 형변환이 필요 없음.
List<String> list = new ArrayList<String>();
list.add("abc");
String str = list.get(0);
ArrayListEx1(제네릭 사용하지 않는 경우 예제)
public class ArrayListEx1 {
public static void main(String[] args) {
List list = new ArrayList(5);
list.add(100);
list.add(2.55);
list.add(300);
list.add(9.9);
list.add("자바 프로그래밍");
list.add(1, "데이터베이스"); // 1번 index부터 뒤로 한 칸씩 밀고 1번에 삽입
System.out.println("리스트 내용 출력");
for(int i = 0; i <list.size(); i++) {
System.out.println(i + " : " + list.get(i));
}
System.out.println();
System.out.println("포함 여부 확인");
System.out.println(list.contains(300)); // trye
System.out.println(list.contains("자바")); // false
System.out.println();
System.out.println("리스트에서 데이터 삭제");
System.out.println(list.remove(1)); // 1번 인덱스 삭제
System.out.println(list.remove("자바 프로그래밍")); // 값이 들어있는 인덱스 삭제
System.out.println();
System.out.println("리스트 내용 출력");
for(int i = 0; i <list.size(); i++) {
System.out.println(i + " : " + list.get(i));
}
}
}
ArrayListEx1(제네릭 사용하는 경우 예제)
public class ArrayListEx2 {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("Java");
list.add("JDBC");
list.add("Servlet/JSP");
list.add("고병채 만세");
System.out.println();
System.out.println("전체 내용 출력");
for(int i = 0; i < list.size(); i++) {
System.out.println(i + " : " + list.get(i));
}
System.out.println();
System.out.println("전체 내용 출력 2");
for(String item : list) {
System.out.println(item);
}
System.out.println();
System.out.println("네 번째 요소 출력 : " + list.get(3));
System.out.println("네 번째 요소 길이 : " + list.get(3).length()); // 한글도 한 글자당 1개 취급(공백도 1개 취급)
// 2번 인덱스 위치(세 번째)에 삽입
list.add(2,"Spring");
// 총 객체 수 출력
System.out.println();
System.out.println("총 객체 수 : " + list.size());
// 전체 내용 출력
System.out.println();
System.out.println("전체 내용 출력 3");
for(String item : list) {
System.out.println(item);
}
// JDBC 제거
System.out.println();
System.out.println("JDBC 제거");
list.remove("JDBC");
// Java포함 여부
System.out.println();
System.out.println("Java 포함 여부");
System.out.println(list.contains("Java"));
}
}
ArrayList 연습문제
- ArrayListEx3
public class ArrayListEx3 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
Scanner scan = new Scanner(System.in);
int temp = 0;
String str = "";
for(int i = 0; i < 4; i++) {
System.out.print("단어 입력 : ");
list.add(scan.nextLine());
}
System.out.println("---------------------------------------------");
System.out.print("단어 리스트 : ");
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + " ");
if (temp < list.get(i).length()) {
temp = list.get(i).length();
str = list.get(i);
}
}
System.out.println("\n가장 긴 단어 : " + str);
System.out.println("가장 긴 단어 길이 : " + temp);
}
}
- Employee.java
public class Employee {
int id;
String name;
double salary;
public Employee(int id, String name, double salary) {
this.id = id;
this.name = name;
this.salary = salary;
}
@Override
public String toString() {
return id + " - " + name + " - " + salary;
}
}
- EmployeeMain.java
public class EmployeeMain {
public static void main(String[] args) {
ArrayList<Employee> list = new ArrayList<Employee>(5);
Employee employee1 = new Employee(100, "김사원", 3300.55);
Employee employee2 = new Employee(101, "박대리", 4100.20);
Employee employee3 = new Employee(102, "최과장", 5100.55);
list.add(employee1);
list.add(employee2);
list.add(employee3);
System.out.println("리스트 사이즈 : " + list.size());
System.out.println();
System.out.println("리스트 내부 목록 : " + list);
System.out.println();
System.out.println("출력 1");
for(int i = 0; i < list.size(); i++) {
Employee emp = list.get(i);
System.out.println(emp);
}
System.out.println();
System.out.println("출력 2");
for(int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
ArrayList에 ProductDTO 객체 저장
- productDB5 복사해서 다음과 같이 변경 -> productDB6ArrayListVer 패키지(ProductSelect, ProductDTO, ProductDAO.... etc)
- 모든 행을 ArrayList에 담아, DAO 클래스의 selectProduct() 메서드에서 한 행씩 출력
- ProductSelect 클래스의 productSelect() 메서드에게 반환
- productSelect() 메서드에서 출력
- 모든 클래스 복사해서 수정
- DAO 클래스의 selectProduct() 메서드의 반환형을 ArrayList<ProductDTO> 변경
- DTO를 담을 ArrayList<ProductDTO> 객체 생성 : dataSet
- resultSet에서 하나씩 가져와서 DTO 생성하고 DTO를 ArrayList에 add()
- return dataSet;
- ProductSelect 클래스의 productSelect()
- 반환된 dataSet 출력
- StudentDTO 클래스에 toString() 추가 : StringBuilder 사용
ProductDTO.java
public class ProductDTO {
// ...
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(prdNo);
sb.append("\t");
sb.append(prdName);
sb.append("\t");
sb.append(prdPrice);
sb.append("\t");
sb.append(prdMaker);
sb.append("\t");
sb.append(prdColor);
sb.append("\t");
sb.append(ctgNo);
return sb.toString();
}
}
ProductDAO.java
public class ProductDAO {
// ...
// select Method
public ArrayList<ProductDTO> selectProduct() {
ArrayList<ProductDTO> dataSet = null;
try {
String sql = "select * from product order by prdNo";
preparedStatement = connection.prepareStatement(sql);
resultset = preparedStatement.executeQuery(sql);
dataSet = new ArrayList<ProductDTO>();
while (resultset.next()) {
dataSet.add(new ProductDTO(resultset.getString(1),
resultset.getString(2),
resultset.getInt(3),
resultset.getString(4),
resultset.getString(5),
resultset.getString(6))); // DTO 1개가 1행에 해당
}
} catch (Exception e) {
System.out.println("select 오류 발생!");
e.printStackTrace();
}
return dataSet; // ArrayList<ProductDTO> 타입
}
// ...
ProductSelect.java
public class ProductSelect {
public void productSelect() {
ProductDAO productDAO = new ProductDAO();
ArrayList<ProductDTO> dataSet = new ArrayList<ProductDTO>();
dataSet = productDAO.selectProduct();
for (ProductDTO dto : dataSet) {
System.out.println(dto);
}
}
}
Interface를 통한 구현
- 기존의 StudentDAO 클래스를 인터페이스 IStudentDAO를 구현한 클래스 변경
IStudentDAO.java(interface)
public interface IStudentDAO {
// 추상 메소드(바디 없음)
// IStudentDAO 인터페이스를 구현하는 클래스에서 반드시 구현해야 함.
public ArrayList<StudentDTO> selectStudent();
public void insertStudent(StudentDTO studentDTO);
}
StudentDAO.java(인터페이스 구현 부분)
public class StudentDAO implements IStudentDAO {
Connection connection;
PreparedStatement preparedStatement;
ResultSet resultset;
// DB연결 생성자
public StudentDAO() {
try {
String url = "jdbc:mysql://localhost:3306/sqldb6?serverTimezone=UTC";
String user = "root";
String pwd = "";
connection = DriverManager.getConnection(url, user, pwd);
if (connection != null) {
System.out.println("연결 성공");
}
} catch (Exception e) {
System.out.println("연결 오류 발생!");
e.printStackTrace();
}
}
@Override
public ArrayList<StudentDTO> selectStudent() {
ArrayList<StudentDTO> dataSet = null;
try {
String sql = "select * from student order by stdNo";
preparedStatement = connection.prepareStatement(sql);
resultset = preparedStatement.executeQuery(sql);
dataSet = new ArrayList<StudentDTO>();
while (resultset.next()) {
dataSet.add(new StudentDTO(resultset.getString(1),
resultset.getString(2),
resultset.getInt(3),
resultset.getString(4),
resultset.getDate(5).toString(),
resultset.getString(6))); // DTO 1개가 1행에 해당
}
} catch (Exception e) {
System.out.println("select 오류 발생!");
e.printStackTrace();
}
return dataSet; // ArrayList<StudentDTOArr> 타입
}
@Override
public void insertStudent(StudentDTO studentDTO) {
try {
String sql = "insert into student values(?, ?, ?, ?, ?, ?)";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, studentDTO.getStdNo());
preparedStatement.setString(2, studentDTO.getStdName());
preparedStatement.setInt(3, studentDTO.getStdYear());
preparedStatement.setString(4, studentDTO.getStdAddress());
preparedStatement.setString(5, studentDTO.getStdBirthday());
preparedStatement.setString(6, studentDTO.getDptNo());
int result = preparedStatement.executeUpdate();
if (result > 0) {
System.out.println("성공");
}
} catch (Exception e) {
System.out.println("insert 오류 발생!");
e.printStackTrace();
}
}
}
728x90
'알고리즘 & 자료구조 & 네트워크' 카테고리의 다른 글
컬렉션 프레임워크 - Vector (0) | 2021.11.30 |
---|---|
컬렉션 프레임워크 - LinkedList (0) | 2021.11.30 |
연결 리스트 - 단일 연결 리스트 (0) | 2021.11.29 |
연결 리스트 - 선형 리스트 (0) | 2021.11.29 |
자료구조 데크(deQue) (0) | 2021.11.29 |
Comments